From 2b222e12ab300e3293e8bb7bdfd41ca47e5c12bf Mon Sep 17 00:00:00 2001 From: leiyun Date: Wed, 20 Apr 2022 15:53:46 +0800 Subject: [PATCH] save --- .idea/.name | 1 + .idea/compiler.xml | 2 +- .idea/deploymentTargetDropDown.xml | 17 + .idea/gradle.xml | 3 +- .idea/misc.xml | 12 +- .idea/runConfigurations.xml | 12 - app/build.gradle | 35 +- app/libs/wenote.jar | Bin 13559 -> 0 bytes app/proguard-rules.pro | 8 +- .../ExampleInstrumentedTest.kt | 2 +- app/src/main/AndroidManifest.xml | 38 +- app/src/main/java/com/yzx/escreen/App.kt | 48 + .../main/java/com/yzx/escreen/MainActivity.kt | 45 + .../activity/HomeActivity.kt | 27 +- .../activity/WebActivity.kt | 100 +- .../activity/base/BaseActivity.kt | 20 +- .../adapter/HomeAdapter.kt | 6 +- .../adapter/base/BaseListAdapter.java | 2 +- .../adapter/base/BaseViewHolder.java | 2 +- .../adapter/base/EasyAdapter.java | 2 +- .../adapter/base/GroupAdapter.java | 2 +- .../adapter/base/IViewHolder.java | 2 +- .../adapter/base/ViewHolderImpl.java | 2 +- .../{webebook => escreen}/config/Config.kt | 4 +- .../{webebook => escreen}/model/BaseBean.kt | 2 +- .../yzx/{webebook => escreen}/model/Book.kt | 2 +- .../{webebook => escreen}/model/HomeItem.kt | 2 +- .../yzx/{webebook => escreen}/model/Note.kt | 2 +- .../java/com/yzx/escreen/model/TabEntity.kt | 21 + .../{webebook => escreen}/model/UploadBean.kt | 2 +- .../yzx/{webebook => escreen}/model/User.kt | 3 +- .../{webebook => escreen}/model/Version.kt | 2 +- .../presenter/base/BasePresenter.kt | 2 +- .../presenter/base/IView.kt | 2 +- .../presenter/base/JsonCallBack.kt | 4 +- .../java/com/yzx/escreen/utils/KotlinX.kt | 2 + .../utils/YzxFileProvider.kt | 2 +- .../widget/BaseDialog.kt | 2 +- .../widget/YzxPDFViewPager.kt | 2 +- app/src/main/java/com/yzx/webebook/App.kt | 73 - .../java/com/yzx/webebook/MainActivity.kt | 211 --- .../yzx/webebook/activity/BookActivity.java | 1084 ------------ .../com/yzx/webebook/activity/NoteActivity.kt | 687 -------- .../yzx/webebook/activity/PDFViewActivity.kt | 171 -- .../yzx/webebook/activity/ReadActivity.java | 730 -------- .../yzx/webebook/activity/WeexTestActivity.kt | 19 - .../activity/base/BaseWeexActivity.kt | 201 --- .../yzx/webebook/adapter/CategoryAdapter.java | 38 - .../yzx/webebook/adapter/CategoryHolder.java | 63 - .../com/yzx/webebook/adapter/ImageAdapter.kt | 21 - .../webebook/adapter/PageStyleAdapter.java | 46 - .../yzx/webebook/adapter/PageStyleHolder.java | 40 - .../yzx/webebook/model/bean/AuthorBean.java | 116 -- .../webebook/model/bean/BookChapterBean.java | 146 -- .../yzx/webebook/model/bean/BookCount.java | 38 - .../webebook/model/bean/BookRecordBean.java | 54 - .../webebook/model/bean/ChapterInfoBean.java | 89 - .../webebook/model/bean/ChapterPageCount.java | 52 - .../yzx/webebook/model/bean/CollBookBean.java | 372 ---- .../yzx/webebook/model/bean/CommentBean.java | 81 - .../yzx/webebook/model/bean/DetailBean.java | 31 - .../webebook/model/bean/DownloadTaskBean.java | 212 --- .../yzx/webebook/model/bean/ReplyToBean.java | 67 - .../webebook/model/local/BookRepository.java | 276 --- .../yzx/webebook/model/local/DaoDbHelper.java | 56 - .../webebook/model/local/DeleteDbHelper.java | 16 - .../yzx/webebook/model/local/GetDbHelper.java | 23 - .../webebook/model/local/LocalRepository.java | 116 -- .../webebook/model/local/MyOpenHelper.java | 34 - .../model/local/ReadSettingManager.java | 134 -- .../webebook/model/local/SaveDbHelper.java | 28 - .../com/yzx/webebook/model/local/Void.java | 8 - .../model/local/update/MigrationHelper.java | 207 --- .../model/local/update/Update2Helper.java | 284 ---- .../yzx/webebook/modules/ActivityWXModule.kt | 25 - .../yzx/webebook/presenter/ReadPresenter.java | 211 --- .../com/yzx/webebook/presenter/ReadView.java | 15 - .../com/yzx/webebook/utils/AppInstance.java | 16 - .../com/yzx/webebook/utils/BookManager.java | 221 --- .../yzx/webebook/utils/BrightnessUtils.java | 108 -- .../java/com/yzx/webebook/utils/Charset.java | 22 - .../java/com/yzx/webebook/utils/Constant.java | 101 -- .../com/yzx/webebook/utils/FileStack.java | 49 - .../com/yzx/webebook/utils/FileUtils.java | 328 ---- .../com/yzx/webebook/utils/GsonHelper.java | 58 - .../java/com/yzx/webebook/utils/IOUtils.java | 21 - .../java/com/yzx/webebook/utils/KotlinX.kt | 2 - .../com/yzx/webebook/utils/ListUtils.java | 204 --- .../java/com/yzx/webebook/utils/LogUtils.java | 222 --- .../java/com/yzx/webebook/utils/MD5Utils.java | 43 - .../com/yzx/webebook/utils/NetworkUtils.java | 63 - .../webebook/utils/PermissionsChecker.java | 34 - .../java/com/yzx/webebook/utils/RxUtils.java | 60 - .../com/yzx/webebook/utils/ScreenUtils.java | 127 -- .../yzx/webebook/utils/SharedPreUtils.java | 61 - .../com/yzx/webebook/utils/StringUtils.java | 190 --- .../yzx/webebook/utils/SystemBarUtils.java | 162 -- .../com/yzx/webebook/utils/ToastUtils.java | 17 - .../webebook/utils/media/LoaderCreator.java | 31 - .../webebook/utils/media/LocalFileLoader.java | 137 -- .../utils/media/MediaStoreHelper.java | 67 - .../com/yzx/webebook/widget/EBookView.java | 22 - .../webebook/widget/ReadSettingDialog.java | 380 ----- .../com/yzx/webebook/widget/ScrollTextView.kt | 32 - .../widget/animation/AnimationProvider.java | 98 -- .../widget/animation/CoverPageAnim.java | 100 -- .../widget/animation/HorizonPageAnim.java | 230 --- .../widget/animation/NonePageAnim.java | 37 - .../widget/animation/PageAnimation.java | 157 -- .../widget/animation/ScrollPageAnim.java | 408 ----- .../widget/animation/SimulationPageAnim.java | 668 -------- .../widget/animation/SlidePageAnim.java | 101 -- .../webebook/widget/page/LocalPageLoader.java | 440 ----- .../webebook/widget/page/NetPageLoader.java | 226 --- .../yzx/webebook/widget/page/PageLoader.java | 1495 ----------------- .../yzx/webebook/widget/page/PageMode.java | 10 - .../yzx/webebook/widget/page/PageStyle.java | 38 - .../yzx/webebook/widget/page/PageView.java | 378 ----- .../yzx/webebook/widget/page/TxtChapter.java | 70 - .../com/yzx/webebook/widget/page/TxtPage.java | 14 - app/src/main/res/drawable/Thumbs.db | Bin 31744 -> 0 bytes app/src/main/res/layout/activity_book.xml | 309 ---- app/src/main/res/layout/activity_main.xml | 170 +- app/src/main/res/layout/activity_main1.xml | 120 -- app/src/main/res/layout/activity_note.xml | 206 --- app/src/main/res/layout/activity_read.xml | 2 +- app/src/main/res/mipmap-xhdpi/home_select.png | Bin 0 -> 581 bytes .../main/res/mipmap-xhdpi/home_unselect.png | Bin 0 -> 836 bytes app/src/main/res/mipmap-xhdpi/my_select.png | Bin 0 -> 998 bytes app/src/main/res/mipmap-xhdpi/my_unselect.png | Bin 0 -> 1248 bytes .../{webebook => escreen}/ExampleUnitTest.kt | 2 +- 131 files changed, 256 insertions(+), 14320 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/deploymentTargetDropDown.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 app/libs/wenote.jar rename app/src/androidTest/java/com/yzx/{webebook => escreen}/ExampleInstrumentedTest.kt (96%) create mode 100644 app/src/main/java/com/yzx/escreen/App.kt create mode 100644 app/src/main/java/com/yzx/escreen/MainActivity.kt rename app/src/main/java/com/yzx/{webebook => escreen}/activity/HomeActivity.kt (94%) rename app/src/main/java/com/yzx/{webebook => escreen}/activity/WebActivity.kt (81%) rename app/src/main/java/com/yzx/{webebook => escreen}/activity/base/BaseActivity.kt (74%) rename app/src/main/java/com/yzx/{webebook => escreen}/adapter/HomeAdapter.kt (82%) rename app/src/main/java/com/yzx/{webebook => escreen}/adapter/base/BaseListAdapter.java (99%) rename app/src/main/java/com/yzx/{webebook => escreen}/adapter/base/BaseViewHolder.java (90%) rename app/src/main/java/com/yzx/{webebook => escreen}/adapter/base/EasyAdapter.java (98%) rename app/src/main/java/com/yzx/{webebook => escreen}/adapter/base/GroupAdapter.java (99%) rename app/src/main/java/com/yzx/{webebook => escreen}/adapter/base/IViewHolder.java (86%) rename app/src/main/java/com/yzx/{webebook => escreen}/adapter/base/ViewHolderImpl.java (95%) rename app/src/main/java/com/yzx/{webebook => escreen}/config/Config.kt (65%) rename app/src/main/java/com/yzx/{webebook => escreen}/model/BaseBean.kt (77%) rename app/src/main/java/com/yzx/{webebook => escreen}/model/Book.kt (94%) rename app/src/main/java/com/yzx/{webebook => escreen}/model/HomeItem.kt (71%) rename app/src/main/java/com/yzx/{webebook => escreen}/model/Note.kt (73%) create mode 100644 app/src/main/java/com/yzx/escreen/model/TabEntity.kt rename app/src/main/java/com/yzx/{webebook => escreen}/model/UploadBean.kt (87%) rename app/src/main/java/com/yzx/{webebook => escreen}/model/User.kt (97%) rename app/src/main/java/com/yzx/{webebook => escreen}/model/Version.kt (86%) rename app/src/main/java/com/yzx/{webebook => escreen}/presenter/base/BasePresenter.kt (87%) rename app/src/main/java/com/yzx/{webebook => escreen}/presenter/base/IView.kt (73%) rename app/src/main/java/com/yzx/{webebook => escreen}/presenter/base/JsonCallBack.kt (88%) create mode 100644 app/src/main/java/com/yzx/escreen/utils/KotlinX.kt rename app/src/main/java/com/yzx/{webebook => escreen}/utils/YzxFileProvider.kt (75%) rename app/src/main/java/com/yzx/{webebook => escreen}/widget/BaseDialog.kt (90%) rename app/src/main/java/com/yzx/{webebook => escreen}/widget/YzxPDFViewPager.kt (94%) delete mode 100644 app/src/main/java/com/yzx/webebook/App.kt delete mode 100644 app/src/main/java/com/yzx/webebook/MainActivity.kt delete mode 100644 app/src/main/java/com/yzx/webebook/activity/BookActivity.java delete mode 100644 app/src/main/java/com/yzx/webebook/activity/NoteActivity.kt delete mode 100644 app/src/main/java/com/yzx/webebook/activity/PDFViewActivity.kt delete mode 100644 app/src/main/java/com/yzx/webebook/activity/ReadActivity.java delete mode 100644 app/src/main/java/com/yzx/webebook/activity/WeexTestActivity.kt delete mode 100644 app/src/main/java/com/yzx/webebook/activity/base/BaseWeexActivity.kt delete mode 100644 app/src/main/java/com/yzx/webebook/adapter/CategoryAdapter.java delete mode 100644 app/src/main/java/com/yzx/webebook/adapter/CategoryHolder.java delete mode 100644 app/src/main/java/com/yzx/webebook/adapter/ImageAdapter.kt delete mode 100644 app/src/main/java/com/yzx/webebook/adapter/PageStyleAdapter.java delete mode 100644 app/src/main/java/com/yzx/webebook/adapter/PageStyleHolder.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/AuthorBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/BookChapterBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/BookCount.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/BookRecordBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/ChapterInfoBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/ChapterPageCount.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/CollBookBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/CommentBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/DetailBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/DownloadTaskBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/bean/ReplyToBean.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/BookRepository.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/DaoDbHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/DeleteDbHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/GetDbHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/LocalRepository.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/MyOpenHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/ReadSettingManager.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/SaveDbHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/Void.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/update/MigrationHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/model/local/update/Update2Helper.java delete mode 100644 app/src/main/java/com/yzx/webebook/modules/ActivityWXModule.kt delete mode 100644 app/src/main/java/com/yzx/webebook/presenter/ReadPresenter.java delete mode 100644 app/src/main/java/com/yzx/webebook/presenter/ReadView.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/AppInstance.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/BookManager.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/BrightnessUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/Charset.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/Constant.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/FileStack.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/FileUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/GsonHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/IOUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/KotlinX.kt delete mode 100644 app/src/main/java/com/yzx/webebook/utils/ListUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/LogUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/MD5Utils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/NetworkUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/PermissionsChecker.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/RxUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/ScreenUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/SharedPreUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/StringUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/SystemBarUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/ToastUtils.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/media/LoaderCreator.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/media/LocalFileLoader.java delete mode 100644 app/src/main/java/com/yzx/webebook/utils/media/MediaStoreHelper.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/EBookView.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/ReadSettingDialog.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/ScrollTextView.kt delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/AnimationProvider.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/CoverPageAnim.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/HorizonPageAnim.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/NonePageAnim.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/PageAnimation.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/ScrollPageAnim.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/SimulationPageAnim.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/animation/SlidePageAnim.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/LocalPageLoader.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/NetPageLoader.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/PageLoader.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/PageMode.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/PageStyle.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/PageView.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/TxtChapter.java delete mode 100644 app/src/main/java/com/yzx/webebook/widget/page/TxtPage.java delete mode 100644 app/src/main/res/drawable/Thumbs.db delete mode 100644 app/src/main/res/layout/activity_book.xml delete mode 100644 app/src/main/res/layout/activity_main1.xml delete mode 100644 app/src/main/res/layout/activity_note.xml create mode 100644 app/src/main/res/mipmap-xhdpi/home_select.png create mode 100644 app/src/main/res/mipmap-xhdpi/home_unselect.png create mode 100644 app/src/main/res/mipmap-xhdpi/my_select.png create mode 100644 app/src/main/res/mipmap-xhdpi/my_unselect.png rename app/src/test/java/com/yzx/{webebook => escreen}/ExampleUnitTest.kt (92%) diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..b2bb3a4 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +WebEBook \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 61a9130..fb7f4a8 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..a411cf0 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 91320a1..894f3f9 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -5,7 +5,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index d5d35ec..cf88d0f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,16 @@ - + + + + diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 70aa3a6..ab97ec3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,13 +6,13 @@ apply plugin: 'kotlin-android-extensions' //apply from: 'https://raw.githubusercontent.com/apache/incubator-weex/release/0.28/android/sdk/buildSrc/download_jsc.gradle' -apply plugin: 'org.greenrobot.greendao' +//apply plugin: 'org.greenrobot.greendao' android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { - applicationId "com.yzx.webebook" + applicationId "com.yzx.escreen" // minSdkVersion 26 minSdkVersion 21 targetSdkVersion 25 @@ -20,9 +20,9 @@ android { versionName "2.0.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - ndk { - abiFilters "armeabi-v7a", "arm64-v8a", "x86" - } +// ndk { +// abiFilters "armeabi-v7a", "arm64-v8a", "x86" +// } } signingConfigs { yzx { @@ -115,11 +115,11 @@ android { } -greendao{ - schemaVersion 4 - daoPackage 'com.yzx.webebook.model.gen' - targetGenDir 'src/main/java' -} +//greendao{ +// schemaVersion 4 +// daoPackage 'com.yzx.webebook.model.gen' +// targetGenDir 'src/main/java' +//} repositories { maven { @@ -144,7 +144,6 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' - implementation files('libs/wenote.jar') implementation 'com.github.bumptech.glide:glide:4.11.0' implementation 'com.lzy.net:okgo:3.0.4' implementation 'com.blankj:utilcodex:1.30.5' @@ -157,17 +156,19 @@ dependencies { implementation 'com.github.thomhurst:RoundImageView:1.0.2' implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4' - implementation 'org.apache.weex:sdk:0.28.0' - implementation 'com.alibaba:fastjson:1.1.46.android' +// implementation 'org.apache.weex:sdk:0.28.0' +// implementation 'com.alibaba:fastjson:1.1.46.android' //ORM Database - implementation deps.greendao.runtime - testImplementation deps.testing.junit +// implementation deps.greendao.runtime +// testImplementation deps.testing.junit //RxJava - implementation deps.reactivex.rxandroid - implementation deps.reactivex.rxjava2 +// implementation deps.reactivex.rxandroid +// implementation deps.reactivex.rxjava2 implementation 'es.voghdev.pdfviewpager:library:1.1.2' + + implementation 'io.github.h07000223:flycoTabLayout:3.0.0' } diff --git a/app/libs/wenote.jar b/app/libs/wenote.jar deleted file mode 100644 index 746e5b220630277527eeeadeb7f61c029ab1de36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13559 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 Dmw0(9 diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 44a5173..f633c77 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -65,10 +65,10 @@ } #bean --keep class com.yzx.webebook.model.** { *; } --keep class com.yzx.webebook.model.Note { *; } --keep class com.yzx.webebook.model.UploadBean { *; } --keep class com.yzx.webebook.model.UploadContent { *; } +-keep class com.yzx.escreen.model.** { *; } +-keep class com.yzx.escreen.model.Note { *; } +-keep class com.yzx.escreen.model.UploadBean { *; } +-keep class com.yzx.escreen.model.UploadContent { *; } -keep class **$Properties {*;} diff --git a/app/src/androidTest/java/com/yzx/webebook/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/yzx/escreen/ExampleInstrumentedTest.kt similarity index 96% rename from app/src/androidTest/java/com/yzx/webebook/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/com/yzx/escreen/ExampleInstrumentedTest.kt index b594d48..2a37ccb 100644 --- a/app/src/androidTest/java/com/yzx/webebook/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/yzx/escreen/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook +package com.yzx.escreen import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 16cba6b..ad09147 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + package="com.yzx.escreen"> @@ -17,7 +17,7 @@ - - - + + android:screenOrientation="landscape"> - - + + - - - + + + + + >() { + + + override val inflateId: Int + get() = R.layout.activity_main + + + override fun initView() { + val tabData = arrayListOf() + tabData.add(TabEntity("首页",R.mipmap.home_select,R.mipmap.home_unselect)) + tabData.add(TabEntity("我的",R.mipmap.my_select,R.mipmap.my_unselect)) + tabLayout.setTabData(tabData) + } + + override fun initData() { + + + } + + override fun initPresenter(): BasePresenter<*>? { + return null + } + + @SuppressLint("SetTextI18n") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + } + +} diff --git a/app/src/main/java/com/yzx/webebook/activity/HomeActivity.kt b/app/src/main/java/com/yzx/escreen/activity/HomeActivity.kt similarity index 94% rename from app/src/main/java/com/yzx/webebook/activity/HomeActivity.kt rename to app/src/main/java/com/yzx/escreen/activity/HomeActivity.kt index a91989e..9788503 100644 --- a/app/src/main/java/com/yzx/webebook/activity/HomeActivity.kt +++ b/app/src/main/java/com/yzx/escreen/activity/HomeActivity.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.activity +package com.yzx.escreen.activity import android.Manifest import android.annotation.SuppressLint @@ -6,12 +6,9 @@ import android.app.AlertDialog import android.app.Dialog import android.content.Context import android.content.DialogInterface -import android.content.IntentFilter -import android.net.ConnectivityManager import android.util.Log import android.view.View import android.widget.TextView -import androidx.core.app.ActivityCompat import androidx.core.widget.ContentLoadingProgressBar import androidx.recyclerview.widget.GridLayoutManager import com.allenliu.versionchecklib.v2.AllenVersionChecker @@ -24,17 +21,17 @@ import com.google.gson.reflect.TypeToken import com.lzy.okgo.OkGo import com.lzy.okgo.callback.StringCallback import com.lzy.okgo.model.Response -import com.yzx.webebook.MainActivity -import com.yzx.webebook.R -import com.yzx.webebook.activity.base.BaseActivity -import com.yzx.webebook.adapter.HomeAdapter -import com.yzx.webebook.config.Config -import com.yzx.webebook.model.BaseBean -import com.yzx.webebook.model.HomeItem -import com.yzx.webebook.model.User -import com.yzx.webebook.model.Version -import com.yzx.webebook.presenter.base.BasePresenter -import com.yzx.webebook.widget.BaseDialog +import com.yzx.escreen.MainActivity +import com.yzx.escreen.R +import com.yzx.escreen.activity.base.BaseActivity +import com.yzx.escreen.adapter.HomeAdapter +import com.yzx.escreen.config.Config +import com.yzx.escreen.model.BaseBean +import com.yzx.escreen.model.HomeItem +import com.yzx.escreen.model.User +import com.yzx.escreen.model.Version +import com.yzx.escreen.presenter.base.BasePresenter +import com.yzx.escreen.widget.BaseDialog import kotlinx.android.synthetic.main.activity_home.* import org.jetbrains.anko.find import org.jetbrains.anko.startActivity diff --git a/app/src/main/java/com/yzx/webebook/activity/WebActivity.kt b/app/src/main/java/com/yzx/escreen/activity/WebActivity.kt similarity index 81% rename from app/src/main/java/com/yzx/webebook/activity/WebActivity.kt rename to app/src/main/java/com/yzx/escreen/activity/WebActivity.kt index ebedb1b..932b4e4 100644 --- a/app/src/main/java/com/yzx/webebook/activity/WebActivity.kt +++ b/app/src/main/java/com/yzx/escreen/activity/WebActivity.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.activity +package com.yzx.escreen.activity import android.annotation.SuppressLint import android.app.Activity @@ -22,29 +22,24 @@ import com.allenliu.versionchecklib.v2.builder.UIData import com.allenliu.versionchecklib.v2.callback.CustomDownloadingDialogListener import com.blankj.utilcode.util.AppUtils import com.blankj.utilcode.util.SPUtils -import com.blankj.utilcode.util.ToastUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.lzy.okgo.OkGo import com.lzy.okgo.callback.StringCallback import com.lzy.okgo.model.Response -import com.yzx.webebook.R -import com.yzx.webebook.activity.base.BaseActivity -import com.yzx.webebook.config.Config -import com.yzx.webebook.model.BaseBean -import com.yzx.webebook.model.User -import com.yzx.webebook.model.Version -import com.yzx.webebook.model.local.BookRepository -import com.yzx.webebook.presenter.ReadPresenter -import com.yzx.webebook.presenter.ReadView -import com.yzx.webebook.presenter.base.BasePresenter -import com.yzx.webebook.widget.BaseDialog +import com.yzx.escreen.R +import com.yzx.escreen.activity.base.BaseActivity +import com.yzx.escreen.config.Config +import com.yzx.escreen.model.BaseBean +import com.yzx.escreen.model.User +import com.yzx.escreen.model.Version +import com.yzx.escreen.presenter.base.BasePresenter +import com.yzx.escreen.widget.BaseDialog import kotlinx.android.synthetic.main.activity_web.* import org.jetbrains.anko.ctx import org.jetbrains.anko.find import org.jetbrains.anko.startActivity import org.jetbrains.anko.toast -import org.json.JSONObject import java.util.* /** @@ -346,22 +341,7 @@ class WebActivity : BaseActivity>() { @SuppressLint("SetTextI18n") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == BookActivity.REQ_CODE && resultCode == Activity.RESULT_OK) { - val mKey = data?.getStringExtra("key") ?: "" - val mIdentity = data?.getStringExtra("identity") ?: "" - val obj = JSONObject() - obj.put("key", mKey) - obj.put("identity", mIdentity) - obj.put("name", data?.getStringExtra("name") ?: "") - obj.put("index", data?.getIntExtra("index", 0)) - obj.put("type", data?.getIntExtra("type", 1)) - evaluateJavascript("onImageUploadSuccess", obj.toString()) - } - if (requestCode == NoteActivity.REQ_CODE && resultCode == Activity.RESULT_OK) { - val json = data?.getStringExtra("note_info") ?: "" - evaluateJavascript("onImageUploadSuccess", json) - } } } @@ -387,7 +367,7 @@ class YzxJavascriptInterface(var ctx: Activity) { index: Int, type: Int ) { - BookActivity.active(ctx, title, key, identity, name, index, type) + } /** @@ -402,7 +382,7 @@ class YzxJavascriptInterface(var ctx: Activity) { note_info: String, can_add_page: Int = 1 ) { - NoteActivity.active(ctx, title, note_info, can_add_page) + } /** @@ -415,7 +395,7 @@ class YzxJavascriptInterface(var ctx: Activity) { title: String, note_info: String ) { - NoteActivity.active(ctx, title, note_info, 1) + } /** @@ -479,68 +459,12 @@ class YzxJavascriptInterface(var ctx: Activity) { @JavascriptInterface fun readPage(bookTaskId: String) { - val presenter = ReadPresenter(object : ReadView { - override fun finishChapter() { - - } - - override fun onProgressSuccess(progress: Float) { - } - - override fun errorChapter() { - - } - - override fun showCategory(localId: String?) { - val collBook = BookRepository.getInstance().getCollBook(localId) - if (collBook.cover.endsWith(".txt")) { - ctx.startActivity("book_id" to localId) - } else { - ToastUtils.showLong("暂不支持该格式预览!") - } - } - - }) - presenter.loadCategory(bookTaskId) } @JavascriptInterface fun readPage(bookTaskId: String, readTaskId: String) { - val presenter = ReadPresenter(object : ReadView { - override fun finishChapter() { - - } - - override fun errorChapter() { - - } - - override fun showCategory(localId: String?) { - val collBook = BookRepository.getInstance().getCollBook(localId) - if (collBook.cover.endsWith(".txt")) { - ctx.startActivity( - "book_id" to localId, - "read_task_id" to readTaskId, - "real_book_id" to bookTaskId - ) - } else if (collBook.cover.endsWith(".pdf")) { - ctx.startActivity( - "book_id" to localId, - "read_task_id" to readTaskId, - "real_book_id" to bookTaskId - ) - } else { - ToastUtils.showLong("暂不支持该格式预览!") - } - } - - override fun onProgressSuccess(progress: Float) { - - } - }) - presenter.loadCategory(bookTaskId) } } diff --git a/app/src/main/java/com/yzx/webebook/activity/base/BaseActivity.kt b/app/src/main/java/com/yzx/escreen/activity/base/BaseActivity.kt similarity index 74% rename from app/src/main/java/com/yzx/webebook/activity/base/BaseActivity.kt rename to app/src/main/java/com/yzx/escreen/activity/base/BaseActivity.kt index 91a3eef..28cf719 100644 --- a/app/src/main/java/com/yzx/webebook/activity/base/BaseActivity.kt +++ b/app/src/main/java/com/yzx/escreen/activity/base/BaseActivity.kt @@ -1,12 +1,10 @@ -package com.yzx.webebook.activity.base +package com.yzx.escreen.activity.base import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.gyf.immersionbar.ktx.immersionBar -import com.yzx.webebook.R -import com.yzx.webebook.presenter.base.BasePresenter -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.disposables.Disposable +import com.yzx.escreen.R +import com.yzx.escreen.presenter.base.BasePresenter /** * 类名:BaseActivity @@ -40,7 +38,6 @@ abstract class BaseActivity> : AppCompatActivity() { abstract fun initPresenter(): P? - protected var mDisposable: CompositeDisposable? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -61,12 +58,7 @@ abstract class BaseActivity> : AppCompatActivity() { } - protected open fun addDisposable(d: Disposable?) { - if (mDisposable == null) { - mDisposable = CompositeDisposable() - } - mDisposable!!.add(d!!) - } + override fun onBackPressed() { @@ -75,9 +67,7 @@ abstract class BaseActivity> : AppCompatActivity() { override fun onDestroy() { super.onDestroy() - if (mDisposable != null) { - mDisposable!!.dispose() - } + } } \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/adapter/HomeAdapter.kt b/app/src/main/java/com/yzx/escreen/adapter/HomeAdapter.kt similarity index 82% rename from app/src/main/java/com/yzx/webebook/adapter/HomeAdapter.kt rename to app/src/main/java/com/yzx/escreen/adapter/HomeAdapter.kt index aadd092..a631aa1 100644 --- a/app/src/main/java/com/yzx/webebook/adapter/HomeAdapter.kt +++ b/app/src/main/java/com/yzx/escreen/adapter/HomeAdapter.kt @@ -1,9 +1,9 @@ -package com.yzx.webebook.adapter +package com.yzx.escreen.adapter import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder -import com.yzx.webebook.R -import com.yzx.webebook.model.HomeItem +import com.yzx.escreen.R +import com.yzx.escreen.model.HomeItem import kotlinx.android.synthetic.main.item_home.view.* class HomeAdapter(list: MutableList) : BaseQuickAdapter(R.layout.item_home,list) { diff --git a/app/src/main/java/com/yzx/webebook/adapter/base/BaseListAdapter.java b/app/src/main/java/com/yzx/escreen/adapter/base/BaseListAdapter.java similarity index 99% rename from app/src/main/java/com/yzx/webebook/adapter/base/BaseListAdapter.java rename to app/src/main/java/com/yzx/escreen/adapter/base/BaseListAdapter.java index 60dd9b7..dcd9bc1 100644 --- a/app/src/main/java/com/yzx/webebook/adapter/base/BaseListAdapter.java +++ b/app/src/main/java/com/yzx/escreen/adapter/base/BaseListAdapter.java @@ -1,4 +1,4 @@ -package com.yzx.webebook.adapter.base; +package com.yzx.escreen.adapter.base; import android.os.Handler; import android.view.View; diff --git a/app/src/main/java/com/yzx/webebook/adapter/base/BaseViewHolder.java b/app/src/main/java/com/yzx/escreen/adapter/base/BaseViewHolder.java similarity index 90% rename from app/src/main/java/com/yzx/webebook/adapter/base/BaseViewHolder.java rename to app/src/main/java/com/yzx/escreen/adapter/base/BaseViewHolder.java index de188af..a29b587 100644 --- a/app/src/main/java/com/yzx/webebook/adapter/base/BaseViewHolder.java +++ b/app/src/main/java/com/yzx/escreen/adapter/base/BaseViewHolder.java @@ -1,4 +1,4 @@ -package com.yzx.webebook.adapter.base; +package com.yzx.escreen.adapter.base; import android.view.View; diff --git a/app/src/main/java/com/yzx/webebook/adapter/base/EasyAdapter.java b/app/src/main/java/com/yzx/escreen/adapter/base/EasyAdapter.java similarity index 98% rename from app/src/main/java/com/yzx/webebook/adapter/base/EasyAdapter.java rename to app/src/main/java/com/yzx/escreen/adapter/base/EasyAdapter.java index b16cf89..264a00a 100644 --- a/app/src/main/java/com/yzx/webebook/adapter/base/EasyAdapter.java +++ b/app/src/main/java/com/yzx/escreen/adapter/base/EasyAdapter.java @@ -1,4 +1,4 @@ -package com.yzx.webebook.adapter.base; +package com.yzx.escreen.adapter.base; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/yzx/webebook/adapter/base/GroupAdapter.java b/app/src/main/java/com/yzx/escreen/adapter/base/GroupAdapter.java similarity index 99% rename from app/src/main/java/com/yzx/webebook/adapter/base/GroupAdapter.java rename to app/src/main/java/com/yzx/escreen/adapter/base/GroupAdapter.java index 4f35dc1..cd3dea7 100644 --- a/app/src/main/java/com/yzx/webebook/adapter/base/GroupAdapter.java +++ b/app/src/main/java/com/yzx/escreen/adapter/base/GroupAdapter.java @@ -1,4 +1,4 @@ -package com.yzx.webebook.adapter.base; +package com.yzx.escreen.adapter.base; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/yzx/webebook/adapter/base/IViewHolder.java b/app/src/main/java/com/yzx/escreen/adapter/base/IViewHolder.java similarity index 86% rename from app/src/main/java/com/yzx/webebook/adapter/base/IViewHolder.java rename to app/src/main/java/com/yzx/escreen/adapter/base/IViewHolder.java index 1e8612f..03c4af4 100644 --- a/app/src/main/java/com/yzx/webebook/adapter/base/IViewHolder.java +++ b/app/src/main/java/com/yzx/escreen/adapter/base/IViewHolder.java @@ -1,4 +1,4 @@ -package com.yzx.webebook.adapter.base; +package com.yzx.escreen.adapter.base; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/yzx/webebook/adapter/base/ViewHolderImpl.java b/app/src/main/java/com/yzx/escreen/adapter/base/ViewHolderImpl.java similarity index 95% rename from app/src/main/java/com/yzx/webebook/adapter/base/ViewHolderImpl.java rename to app/src/main/java/com/yzx/escreen/adapter/base/ViewHolderImpl.java index bc5d8d7..0aee22f 100644 --- a/app/src/main/java/com/yzx/webebook/adapter/base/ViewHolderImpl.java +++ b/app/src/main/java/com/yzx/escreen/adapter/base/ViewHolderImpl.java @@ -1,4 +1,4 @@ -package com.yzx.webebook.adapter.base; +package com.yzx.escreen.adapter.base; import android.content.Context; import android.view.LayoutInflater; diff --git a/app/src/main/java/com/yzx/webebook/config/Config.kt b/app/src/main/java/com/yzx/escreen/config/Config.kt similarity index 65% rename from app/src/main/java/com/yzx/webebook/config/Config.kt rename to app/src/main/java/com/yzx/escreen/config/Config.kt index cdb8631..2122ba7 100644 --- a/app/src/main/java/com/yzx/webebook/config/Config.kt +++ b/app/src/main/java/com/yzx/escreen/config/Config.kt @@ -1,6 +1,6 @@ -package com.yzx.webebook.config +package com.yzx.escreen.config -import com.yzx.webebook.BuildConfig +import com.yzx.escreen.BuildConfig object Config { var BASE_URL = BuildConfig.BASE_URL diff --git a/app/src/main/java/com/yzx/webebook/model/BaseBean.kt b/app/src/main/java/com/yzx/escreen/model/BaseBean.kt similarity index 77% rename from app/src/main/java/com/yzx/webebook/model/BaseBean.kt rename to app/src/main/java/com/yzx/escreen/model/BaseBean.kt index 9a13abd..11e0287 100644 --- a/app/src/main/java/com/yzx/webebook/model/BaseBean.kt +++ b/app/src/main/java/com/yzx/escreen/model/BaseBean.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.model +package com.yzx.escreen.model data class BaseBean( var code: Int, diff --git a/app/src/main/java/com/yzx/webebook/model/Book.kt b/app/src/main/java/com/yzx/escreen/model/Book.kt similarity index 94% rename from app/src/main/java/com/yzx/webebook/model/Book.kt rename to app/src/main/java/com/yzx/escreen/model/Book.kt index c80946b..2abe532 100644 --- a/app/src/main/java/com/yzx/webebook/model/Book.kt +++ b/app/src/main/java/com/yzx/escreen/model/Book.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.model +package com.yzx.escreen.model class Book { var book_name:String = "" diff --git a/app/src/main/java/com/yzx/webebook/model/HomeItem.kt b/app/src/main/java/com/yzx/escreen/model/HomeItem.kt similarity index 71% rename from app/src/main/java/com/yzx/webebook/model/HomeItem.kt rename to app/src/main/java/com/yzx/escreen/model/HomeItem.kt index 739d2e8..9fbc5ed 100644 --- a/app/src/main/java/com/yzx/webebook/model/HomeItem.kt +++ b/app/src/main/java/com/yzx/escreen/model/HomeItem.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.model +package com.yzx.escreen.model class HomeItem ( var title:String, diff --git a/app/src/main/java/com/yzx/webebook/model/Note.kt b/app/src/main/java/com/yzx/escreen/model/Note.kt similarity index 73% rename from app/src/main/java/com/yzx/webebook/model/Note.kt rename to app/src/main/java/com/yzx/escreen/model/Note.kt index f6fe42b..7da5d5f 100644 --- a/app/src/main/java/com/yzx/webebook/model/Note.kt +++ b/app/src/main/java/com/yzx/escreen/model/Note.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.model +package com.yzx.escreen.model class Note { var key:String = "" diff --git a/app/src/main/java/com/yzx/escreen/model/TabEntity.kt b/app/src/main/java/com/yzx/escreen/model/TabEntity.kt new file mode 100644 index 0000000..ccea0c6 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/model/TabEntity.kt @@ -0,0 +1,21 @@ +package com.yzx.escreen.model + +import com.flyco.tablayout.listener.CustomTabEntity + +data class TabEntity(var title: String, + var selectedIcon: Int, + var unSelectedIcon: Int) : + CustomTabEntity { + override fun getTabTitle(): String { + return title + } + + override fun getTabSelectedIcon(): Int { + return selectedIcon + } + + override fun getTabUnselectedIcon(): Int { + return unSelectedIcon + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/model/UploadBean.kt b/app/src/main/java/com/yzx/escreen/model/UploadBean.kt similarity index 87% rename from app/src/main/java/com/yzx/webebook/model/UploadBean.kt rename to app/src/main/java/com/yzx/escreen/model/UploadBean.kt index d3ab83e..21846fb 100644 --- a/app/src/main/java/com/yzx/webebook/model/UploadBean.kt +++ b/app/src/main/java/com/yzx/escreen/model/UploadBean.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.model +package com.yzx.escreen.model class UploadBean { var code:Int = 0 diff --git a/app/src/main/java/com/yzx/webebook/model/User.kt b/app/src/main/java/com/yzx/escreen/model/User.kt similarity index 97% rename from app/src/main/java/com/yzx/webebook/model/User.kt rename to app/src/main/java/com/yzx/escreen/model/User.kt index 28ac934..3ab7e97 100644 --- a/app/src/main/java/com/yzx/webebook/model/User.kt +++ b/app/src/main/java/com/yzx/escreen/model/User.kt @@ -1,6 +1,5 @@ -package com.yzx.webebook.model +package com.yzx.escreen.model -import android.content.Context import com.blankj.utilcode.util.SPUtils class User( diff --git a/app/src/main/java/com/yzx/webebook/model/Version.kt b/app/src/main/java/com/yzx/escreen/model/Version.kt similarity index 86% rename from app/src/main/java/com/yzx/webebook/model/Version.kt rename to app/src/main/java/com/yzx/escreen/model/Version.kt index 83060c4..9001e81 100644 --- a/app/src/main/java/com/yzx/webebook/model/Version.kt +++ b/app/src/main/java/com/yzx/escreen/model/Version.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.model +package com.yzx.escreen.model class Version { var version: String = "" diff --git a/app/src/main/java/com/yzx/webebook/presenter/base/BasePresenter.kt b/app/src/main/java/com/yzx/escreen/presenter/base/BasePresenter.kt similarity index 87% rename from app/src/main/java/com/yzx/webebook/presenter/base/BasePresenter.kt rename to app/src/main/java/com/yzx/escreen/presenter/base/BasePresenter.kt index 46903c7..96b08c2 100644 --- a/app/src/main/java/com/yzx/webebook/presenter/base/BasePresenter.kt +++ b/app/src/main/java/com/yzx/escreen/presenter/base/BasePresenter.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.presenter.base +package com.yzx.escreen.presenter.base /** * 类名:BasePresenter diff --git a/app/src/main/java/com/yzx/webebook/presenter/base/IView.kt b/app/src/main/java/com/yzx/escreen/presenter/base/IView.kt similarity index 73% rename from app/src/main/java/com/yzx/webebook/presenter/base/IView.kt rename to app/src/main/java/com/yzx/escreen/presenter/base/IView.kt index 4330164..617707a 100644 --- a/app/src/main/java/com/yzx/webebook/presenter/base/IView.kt +++ b/app/src/main/java/com/yzx/escreen/presenter/base/IView.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.presenter.base +package com.yzx.escreen.presenter.base /** * 类名:IView diff --git a/app/src/main/java/com/yzx/webebook/presenter/base/JsonCallBack.kt b/app/src/main/java/com/yzx/escreen/presenter/base/JsonCallBack.kt similarity index 88% rename from app/src/main/java/com/yzx/webebook/presenter/base/JsonCallBack.kt rename to app/src/main/java/com/yzx/escreen/presenter/base/JsonCallBack.kt index 75ec8cf..b391f23 100644 --- a/app/src/main/java/com/yzx/webebook/presenter/base/JsonCallBack.kt +++ b/app/src/main/java/com/yzx/escreen/presenter/base/JsonCallBack.kt @@ -1,10 +1,10 @@ -package com.yzx.webebook.presenter.base +package com.yzx.escreen.presenter.base import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.lzy.okgo.callback.AbsCallback import com.lzy.okgo.convert.StringConvert -import com.yzx.webebook.model.BaseBean +import com.yzx.escreen.model.BaseBean import okhttp3.Response abstract class JsonCallBack : AbsCallback>() { diff --git a/app/src/main/java/com/yzx/escreen/utils/KotlinX.kt b/app/src/main/java/com/yzx/escreen/utils/KotlinX.kt new file mode 100644 index 0000000..cd95140 --- /dev/null +++ b/app/src/main/java/com/yzx/escreen/utils/KotlinX.kt @@ -0,0 +1,2 @@ +package com.yzx.escreen.utils + diff --git a/app/src/main/java/com/yzx/webebook/utils/YzxFileProvider.kt b/app/src/main/java/com/yzx/escreen/utils/YzxFileProvider.kt similarity index 75% rename from app/src/main/java/com/yzx/webebook/utils/YzxFileProvider.kt rename to app/src/main/java/com/yzx/escreen/utils/YzxFileProvider.kt index a861c7e..ad9e139 100644 --- a/app/src/main/java/com/yzx/webebook/utils/YzxFileProvider.kt +++ b/app/src/main/java/com/yzx/escreen/utils/YzxFileProvider.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.utils +package com.yzx.escreen.utils import androidx.core.content.FileProvider diff --git a/app/src/main/java/com/yzx/webebook/widget/BaseDialog.kt b/app/src/main/java/com/yzx/escreen/widget/BaseDialog.kt similarity index 90% rename from app/src/main/java/com/yzx/webebook/widget/BaseDialog.kt rename to app/src/main/java/com/yzx/escreen/widget/BaseDialog.kt index dd39a82..e934885 100644 --- a/app/src/main/java/com/yzx/webebook/widget/BaseDialog.kt +++ b/app/src/main/java/com/yzx/escreen/widget/BaseDialog.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.widget +package com.yzx.escreen.widget import android.app.Dialog import android.content.Context diff --git a/app/src/main/java/com/yzx/webebook/widget/YzxPDFViewPager.kt b/app/src/main/java/com/yzx/escreen/widget/YzxPDFViewPager.kt similarity index 94% rename from app/src/main/java/com/yzx/webebook/widget/YzxPDFViewPager.kt rename to app/src/main/java/com/yzx/escreen/widget/YzxPDFViewPager.kt index d3eab06..a9cdcb6 100644 --- a/app/src/main/java/com/yzx/webebook/widget/YzxPDFViewPager.kt +++ b/app/src/main/java/com/yzx/escreen/widget/YzxPDFViewPager.kt @@ -1,4 +1,4 @@ -package com.yzx.webebook.widget +package com.yzx.escreen.widget import android.content.Context import android.view.MotionEvent diff --git a/app/src/main/java/com/yzx/webebook/App.kt b/app/src/main/java/com/yzx/webebook/App.kt deleted file mode 100644 index 9d6aad8..0000000 --- a/app/src/main/java/com/yzx/webebook/App.kt +++ /dev/null @@ -1,73 +0,0 @@ -package com.yzx.webebook - -import android.app.Application -import android.content.Context -import android.util.Log -import com.blankj.utilcode.util.Utils -import com.lzy.okgo.OkGo -import com.lzy.okgo.model.HttpHeaders -import com.umeng.analytics.MobclickAgent -import com.umeng.commonsdk.UMConfigure -import com.yzx.webebook.adapter.ImageAdapter -import com.yzx.webebook.model.User -import com.yzx.webebook.modules.ActivityWXModule -import org.apache.weex.InitConfig -import org.apache.weex.WXEnvironment -import org.apache.weex.WXSDKEngine -import org.apache.weex.adapter.DefaultWXHttpAdapter -import org.apache.weex.bridge.WXBridgeManager - -class App : Application() { - - - companion object { - var app: App? = null - fun getContext(): App { - return app ?: App() - } - } - - override fun onCreate() { - super.onCreate() - app = this - val config = InitConfig.Builder() //图片库接口 - .setImgAdapter(ImageAdapter()) //网络库接口 - .setHttpAdapter(DefaultWXHttpAdapter()) - .build() - WXSDKEngine.initialize(this, config) - - WXBridgeManager.updateGlobalConfig("wson_on") - WXEnvironment.setOpenDebugLog(true) - WXEnvironment.setApkDebugable(true) - WXSDKEngine.addCustomOptions("appName", "WXSample") - WXSDKEngine.addCustomOptions("appGroup", "WXApp") - val registerSuccess = WXSDKEngine.registerModule("navevent", ActivityWXModule::class.java) - - Log.i("welog", "WXSDKEngine.isInitializedApplication: " + WXSDKEngine.isInitialized()) - Log.i("welog", "WXSDKEngine.registerModule: $registerSuccess") - - - val headers = HttpHeaders() - val user = User.getUser() - headers.put("phone",user.phone) - headers.put("token",user.token) - OkGo.getInstance() - .addCommonHeaders(headers) - .init(this) - - - Utils.init(this) - - UMConfigure.init( - this, - "60334d01425ec25f10fbd5b4", - "ebook", - UMConfigure.DEVICE_TYPE_PHONE, - "" - ) - MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO) - - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/MainActivity.kt b/app/src/main/java/com/yzx/webebook/MainActivity.kt deleted file mode 100644 index 224baa2..0000000 --- a/app/src/main/java/com/yzx/webebook/MainActivity.kt +++ /dev/null @@ -1,211 +0,0 @@ -package com.yzx.webebook - -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Intent -import android.text.TextUtils -import android.util.Log -import com.blankj.utilcode.util.StringUtils -import com.bumptech.glide.Glide -import com.yzx.webebook.activity.* -import com.yzx.webebook.activity.base.BaseActivity -import com.yzx.webebook.config.Config -import com.yzx.webebook.model.User -import com.yzx.webebook.model.bean.CollBookBean -import com.yzx.webebook.model.local.BookRepository -import com.yzx.webebook.presenter.ReadPresenter -import com.yzx.webebook.presenter.ReadView -import kotlinx.android.synthetic.main.activity_main.* -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.toast - - -/** - * Yun.Lei - * 2020年5月6日14:49:10 - */ -class MainActivity : BaseActivity(),ReadView { - - - override val inflateId: Int - get() = R.layout.activity_main - - - override fun initView() { - btn1.setOnClickListener { - Config.APP_NAME = "家校互通" - Config.BASE_URL = "https://oa.qbjjyyun.net/api" - Config.M_URL = "https://m.qbjjyyun.net" - User.clearUserInfo() - startActivity() - } - btn2.setOnClickListener { - Config.APP_NAME = "家校互通(LIVE)" - Config.BASE_URL = "https://oa.live.educlouddata.com/api" - Config.M_URL = "https://m.live.educlouddata.com" - User.clearUserInfo() - startActivity() - } - btn6.setOnClickListener { - Config.APP_NAME = "家校互通(测试)" - Config.BASE_URL = "http://192.168.69.99:9009" - Config.M_URL = "http://192.168.69.99:8098" - if (BuildConfig.BUILD_TYPE != "debug") { - User.clearUserInfo() - } - startActivity() - } - btn3.setOnClickListener { - val mBaseUrl = mBaseUrlTv.text.toString() - if(StringUtils.isTrimEmpty(mBaseUrl)){ - toast("请输入BASE_URL") - return@setOnClickListener - } - val mUrl = mUrlTv.text.toString() - if(StringUtils.isTrimEmpty(mUrl)){ - toast("请输入M_URL") - return@setOnClickListener - } - Config.APP_NAME = "家校互通(本地)" - Config.BASE_URL = mBaseUrl - Config.M_URL = mUrl - if (BuildConfig.BUILD_TYPE != "debug") { - User.clearUserInfo() - } - startActivity() - } - btn4.setOnClickListener { - BookActivity.active( - this, - "教育云空间", - "f04be754f6cb3f6168f582403a514c39", - "filec", - "", - 1, - 1 - ) - } - btn5.setOnClickListener { -// BookActivity.active(this,"教育云空间(无图)","","","",2,2) - val json ="" - NoteActivity.active(this, "测试笔记写字", json,1) - } - - btn7.setOnClickListener { - startActivity() - -// mPresenter?.loadCategory("17") - } - - /*OkGo.post("https://fileupload.oa.qbjjyyun.net/edufile/fileUpload") - .tag(this) - .params("token","0fc58a8df03c46d3f85b1047c4693cf6") - .params("user","97244") - .params("file",file) - .execute(object : StringCallback(){ - override fun onError(response: Response?) { - super.onError(response) - Log.d("onError",response?.body()) - } - - override fun onSuccess(response: Response?) { - val json = response?.body() - Log.d("onSuccess",response?.body()) - val jsonObject = JSONObject(json) - val content = jsonObject.optString("content") - Log.d("onSuccess,content",content) - val contentObject = JSONObject(content) - val key = contentObject.optString("key") - val identity = contentObject.optString("identity") - Log.d("onSuccess,identity",identity) - Log.d("onSuccess,key",key) - } - })*/ - -// val apps = AppUtils.getAppInfo("com.tencent.weread.eink") -// appInfos.text = apps.toString(); - appInfos.setOnClickListener { - val intent = packageManager.getLaunchIntentForPackage("com.tencent.weread.eink") - intent?.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED - startActivity(intent) - Log.d("AppUtils", "initView: ${intent.toString()}") - } - - - btn8.setOnClickListener { - startActivity("url" to "weex/index.js","params" to "我是android传递的消息") - } - - btn9.setOnClickListener { - val intent = packageManager.getLaunchIntentForPackage("com.example.weexdemo") - intent?.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED - startActivity(intent) - Log.d("AppUtils", "initView: ${intent.toString()}") - } - } - - override fun initData() { - - saveDb() - } - - fun saveDb(){ - val path = "/storage/emulated/0/xxjs.pdf"; - val collBook = CollBookBean() - collBook._id = "xxjs" - collBook.title = "三国演义sgyy" - collBook.author = "yzx" - collBook.shortIntro = "" - collBook.cover = path - collBook.lastChapter = "开始阅读" - collBook.updated = "2021年5月7日18:20:25" - collBook.lastRead = "2021年5月7日18:20:34" - collBook.setIsLocal(true) - - BookRepository.getInstance() - .saveCollBooks(mutableListOf(collBook)) - } - - override fun initPresenter(): ReadPresenter = ReadPresenter(this) - - @SuppressLint("SetTextI18n") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == BookActivity.REQ_CODE && resultCode == Activity.RESULT_OK) { - val mKey = data?.getStringExtra("key") - val mIdentity = data?.getStringExtra("identity") - - if(!TextUtils.isEmpty(mKey)&&!TextUtils.isEmpty(mIdentity)){ - - val url = "https://$mIdentity.oa.qbjjyyun.net/edufile/imageView?uniqueKey=$mKey" - Glide.with(this) - .load(url) - .into(testImageView) - } - val json = data?.getStringExtra("note_info")?:"" - backInfo.text = json - } - if (requestCode == NoteActivity.REQ_CODE && resultCode == Activity.RESULT_OK) { - val json = data?.getStringExtra("note_info")?:"" - backInfo.text = json - } - } - - override fun finishChapter() { - - } - - override fun errorChapter() { - - } - - override fun showCategory(localId: String?) { -// startActivity("book_id" to "xxjs") - - - } - - override fun onProgressSuccess(progress: Float) { - - } -} diff --git a/app/src/main/java/com/yzx/webebook/activity/BookActivity.java b/app/src/main/java/com/yzx/webebook/activity/BookActivity.java deleted file mode 100644 index 6a8e967..0000000 --- a/app/src/main/java/com/yzx/webebook/activity/BookActivity.java +++ /dev/null @@ -1,1084 +0,0 @@ -package com.yzx.webebook.activity; - -import android.Manifest; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.PixelFormat; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.text.TextUtils; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.Window; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.request.target.CustomTarget; -import com.bumptech.glide.request.target.Target; -import com.bumptech.glide.request.transition.Transition; -import com.lzy.okgo.OkGo; -import com.lzy.okgo.callback.StringCallback; -import com.lzy.okgo.model.Response; -import com.wetao.note.NotePageInfo; -import com.wetao.note.OnInitedListener; -import com.wetao.note.WeNoteView; -import com.wetao.note.WePoint; -import com.yzx.webebook.R; - -import org.json.JSONObject; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Date; - - -public class BookActivity extends Activity { - private static final String TAG = "BookActivity"; - public static final int REQ_CODE = 0x99; - - private static final String BACKGROUND1_PATH = "/mnt/sdcard/test.png"; - private static final String BACKGROUND2_PATH = "/mnt/sdcard/net.png"; - private static final String SAVE_PIC_PATH = "/mnt/sdcard/Note01.png"; - - private static final String NOTE_FOLDER_DIR = "/mnt/sdcard/ebook/"; - private static final String NOTE_FILE_NAME = "note.png"; - private static final String DRAWABLE_FILE_NAME = ".drawable.txt"; - - static final int[] mBGDrawableList = {R.drawable.background0, R.drawable.background1, R.drawable.background2, - R.drawable.background3, R.drawable.background4, R.drawable.background5, R.drawable.background6, - R.drawable.background7, R.drawable.background8, R.drawable.background9, R.drawable.background10}; - - String SCREEN_ON = "android.intent.action.SCREEN_ON"; - String SCREEN_OFF = "android.intent.action.SCREEN_OFF"; - - private static final int MSG_SAVE_END = 2001; - private int imageIndex = 0; - - private static Context mContext; - private static Handler mHandler; - - private WeNoteView mView; - - - private TextView mLeftView; - private TextView mRightView; - private TextView btnSave; - private TextView mTotalTv; - private TextView mIndexTv; - private Button mDeleteBtn; - private Button mPicBtn; - private View mClearBtn; - private Button mUndoBtn; - private Button mRedoBtn; - private Button mPenWidthBtn; - private Button mPenWidthSubBtn; - private Button mEraserWidthBtn; - private Button mCancelBtn; -// private CheckBox mCBEraser; -// private CheckBox mCBStrokes; - private TextView mPenBtn; - private TextView mRubberBtn; - - private static int mScreenH; - private static int mScreenW; - - //private boolean mPage = false; - private static int mBGId = 0; - private Drawable mBGDrawable = null; - - private boolean mReDrawEnable = false; - - private static ArrayList mWePointList = null; - - private static NotePageInfo mNotePageInfo = null; - - private Runnable mRunnable = new Runnable() { - public void run() { - int count = 0; - while (mView.getHeight() <= 0) { - try { - Thread.sleep(50); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (count++ > 40) { - Log.d(TAG, "Flash test : ++++++++ removeCallbacks"); - mHandler.removeCallbacks(mRunnable); - System.exit(0); - } - - } - Log.d(TAG, "Flash test : ++++++++ mView.getHeight() = " + mView.getHeight() + ", count = " + count); - //mView.initNative(new Rect(mScreenW, mScreenH - mView.getHeight(), 0, mScreenH), SAVE_PIC_PATH); -// mView.initNative(new Rect(mScreenW, mScreenH - mView.getHeight(), 0, mScreenH)); - mView.setTouchEventHander(mPointHandler); - - Log.d(TAG, "Flash test : ++++++ mRunnable() start loader notepageinfo"); - if (mNotePageInfo == null) { - mNotePageInfo = getNotePageInfo(NOTE_FOLDER_DIR); - } - if (mNotePageInfo == null) { - Log.d(TAG, "Flash test : +++++ no note, so init a page"); - initPage(); - } - initNoteView(); - if (!TextUtils.isEmpty(mKey) && !TextUtils.isEmpty(mIdentity)) { //没有传递突变则加载空页面 - loadImage(); - } else { - loadOldPage(); - } - } - }; - - private static String[] imgList = new String[]{}; - - public static void active(Activity activity, String title, String key, String identity, String name, int index, int type) { - Intent intent = new Intent(activity, BookActivity.class); - intent.putExtra("title", title); - intent.putExtra("key", key); - intent.putExtra("identity", identity); - intent.putExtra("name", name); - intent.putExtra("index", index); - intent.putExtra("type", type); - activity.startActivityForResult(intent, REQ_CODE); - } - - private String mTitle; - private String mKey; - private String mIdentity; - private String mName; - private int mIndex; - private int mType; - - private AlertDialog loadingDialog; - - private void getIntentInfo() { - Intent intent = getIntent(); - mTitle = intent.getStringExtra("title"); - mKey = intent.getStringExtra("key"); - mIdentity = intent.getStringExtra("identity"); - mName = intent.getStringExtra("name"); - mIndex = intent.getIntExtra("index", 0); - mType = intent.getIntExtra("type", 1); - if (!TextUtils.isEmpty(mKey) && !TextUtils.isEmpty(mIdentity)) { - imgList = new String[]{"https://" + mIdentity + ".oa.qbjjyyun.net/edufile/imageView?uniqueKey=" + mKey}; - } else { - - } - } - - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - if (hasFocus) { - mView.onResume(); - } else { - mView.onPause(); - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); - setContentView(R.layout.activity_book); - checkPermission(); - Log.d(TAG, "Flash test : +++++++ onCreate()"); - mContext = BookActivity.this; - - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - getIntentInfo(); - mView = (WeNoteView) findViewById(R.id.note_view); - // mView.setBackground(Drawable.createFromPath(BACKGROUND1_PATH)); - mView.setBackground(null); - mBGId = 0; - - mDeleteBtn = (Button) findViewById(R.id.delete); - mDeleteBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (deleteNote()) { - cancel(false); - BookActivity.this.finish(); - } - } - }); - - mPicBtn = (Button) findViewById(R.id.init); - mPicBtn.setText("背景" + mBGId); - mPicBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - //mView.clear(); - mView.setEnable(false); - mBGId++; - if (mBGId >= mBGDrawableList.length) mBGId = 0; - mView.setBackgroundResource(mBGDrawableList[mBGId]); - mPicBtn.setText("背景" + mBGId); - saveBGId(); - } - }); - -// mClearBtn = findViewById(R.id.clear); - mClearBtn = findViewById(R.id.new_clear); - mClearBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - mView.clear(); - } - }); - - mPenWidthBtn = (Button) findViewById(R.id.pen_width); - mPenWidthBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - int width = mView.getPenWidth(); - if (width == 10) { - width = 1; - } else { - width++; - } - - if (width > 0 && width <= 10) { - mView.setPenWidth(width); - mPenWidthBtn.setText("+宽度" + width); - mPenWidthSubBtn.setText("-宽度" + width); - } - } - }); - mPenWidthSubBtn = (Button) findViewById(R.id.pen_width_sub); - mPenWidthSubBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - int width = mView.getPenWidth(); - if (width == 1) { - width = 10; - } else { - width--; - } - - if (width > 0 && width <= 10) { - mView.setPenWidth(width); - mPenWidthBtn.setText("+宽度" + width); - mPenWidthSubBtn.setText("-宽度" + width); - } - } - }); - - mUndoBtn = (Button) findViewById(R.id.undo); - mUndoBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - mView.unDo(); - } - }); - - mRedoBtn = (Button) findViewById(R.id.redo); - mRedoBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - mView.reDo(); - } - }); - - mEraserWidthBtn = (Button) findViewById(R.id.eraser_width); - mEraserWidthBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - int width = mView.getEraserWidth(); - if (width == 20) { - width = 1; - } else { - width++; - } - - if (width > 0 && width <= 20) { - mView.setEraserWidth(width); - mEraserWidthBtn.setText("橡皮宽" + width); - } - } - }); - - mCancelBtn = (Button) findViewById(R.id.cancel); - mCancelBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - cancel(true); - BookActivity.this.finish(); - } - }); - - - //mCBEraser.setVisibility(View.GONE); - - - mWePointList = new ArrayList(); - mWePointList.clear(); - - DisplayMetrics metrics = new DisplayMetrics(); - metrics = getApplicationContext().getResources().getDisplayMetrics(); - mScreenW = metrics.widthPixels; - mScreenH = metrics.heightPixels; - - mHandler = new Handler(); -// mHandler.postDelayed(mRunnable, 1000); - - mView.setOnFinishListener(new OnInitedListener() { - @Override - public void onInited() { - mView.post(new Runnable() { - @Override - public void run() { - mHandler.post(mRunnable); - } - }); - } - - @Override - public void onSizeChanged() { - - } - }); - - - IntentFilter filter = new IntentFilter(); - filter.addAction(SCREEN_ON); - filter.addAction(SCREEN_OFF); - mContext.registerReceiver(mReceiver, filter); - - mPenBtn = findViewById(R.id.pen); - mPenBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mView.getPenType() == WeNoteView.TYPE_DRAW_ERASER) { - mView.setPenType(WeNoteView.TYPE_DRAW_CURVE); - mView.updateEnableStatus(); - mPenBtn.setCompoundDrawablesWithIntrinsicBounds(0, R.mipmap.ic_book_pen_select, 0, 0); - mRubberBtn.setCompoundDrawablesWithIntrinsicBounds(0, R.mipmap.ic_book_rubber, 0, 0); - } - } - }); - - mRubberBtn = findViewById(R.id.new_eraser); - mRubberBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mView.getPenType() != WeNoteView.TYPE_DRAW_ERASER) { - mView.setPenType(WeNoteView.TYPE_DRAW_ERASER); - mView.updateEnableStatus(); - mPenBtn.setCompoundDrawablesWithIntrinsicBounds(0, R.mipmap.ic_book_pen, 0, 0); - mRubberBtn.setCompoundDrawablesWithIntrinsicBounds(0, R.mipmap.ic_book_rubber_select, 0, 0); - } - } - }); - - initTabBar(); - } - - private void initNoteView() { - //宽度 - mView.setPenWidth(3); - mPenWidthBtn.setText("+宽度5"); - mPenWidthSubBtn.setText("-宽度5"); - //橡皮擦 -// mCBEraser.setSelected(false); - mView.setPenType(WeNoteView.TYPE_DRAW_CURVE); - mView.updateEnableStatus(); - //笔锋 -// mCBStrokes.setSelected(false); - //橡皮擦 - mView.setEraserWidth(20); - mEraserWidthBtn.setText("橡皮宽20"); - mView.updateEnableStatus(); - } - - private void initTabBar() { - findViewById(R.id.btnBack).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - onBackPressed(); - } - }); - TextView titleTv = findViewById(R.id.titleTv); - titleTv.setText(mTitle); - mLeftView = findViewById(R.id.btnPre); - mRightView = findViewById(R.id.btnNext); - mIndexTv = findViewById(R.id.tvIndex); - mTotalTv = findViewById(R.id.tvTotal); - btnSave = findViewById(R.id.save); - mLeftView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (imageIndex == 0) { - return; - } - pre(); - } - }); - mRightView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (imageIndex == imgList.length - 1) { - return; - } - next(); - } - }); - btnSave.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mView.isHandwritingExist()) { - save(); - } else { - toast("暂无可保存的内容!"); - } - } - }); - -// if (mType == 2) { -// mPicBtn.setVisibility(View.VISIBLE); -// } else { -// mPicBtn.setVisibility(View.GONE); -// } - - } - - private void showDialog(String msg) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(msg); - builder.setCancelable(false); - loadingDialog = builder.create(); - if (loadingDialog != null) { - loadingDialog.setCanceledOnTouchOutside(false); - loadingDialog.show(); - } - } - - private void dismissDialog() { - if (loadingDialog != null) { - loadingDialog.dismiss(); - } - } - - private void save() { - mView.post(new Runnable() { - @Override - public void run() { - showDialog("保存中..."); - } - }); - - String noteName = mKey + ".png"; - if (mKey.length() == 0) { - noteName = "note.png"; - mBGDrawable = getDrawable(mBGDrawableList[mBGId]); - } - String path = NOTE_FOLDER_DIR + "/" + noteName; - boolean success = saveAll(path, mView.getCurrentNoteBitmap(), mBGDrawable); - if (success) { - OkGo.post("https://fileupload.oa.qbjjyyun.net/edufile/fileUpload") - .tag(this) - .params("token", "0fc58a8df03c46d3f85b1047c4693cf6") - .params("user", new Date().getTime()) - .params("file", new File(path)) - .execute(new StringCallback() { - @Override - public void onSuccess(Response response) { - try { - String json = response.body(); - Log.d("onSuccess", response.body()); - JSONObject jsonObject = new JSONObject(json); - String content = jsonObject.optString("content"); - Log.d("onSuccess,content", content); - JSONObject contentObject = new JSONObject(content); - String key = contentObject.optString("key"); - String identity = contentObject.optString("identity"); - Log.d("onSuccess,identity", identity); - Log.d("onSuccess,key", key); - - toast("保存成功!"); - Intent intent = new Intent(); - intent.putExtra("key", key); - intent.putExtra("identity", identity); - intent.putExtra("name", mName); - intent.putExtra("index", mIndex); - intent.putExtra("type", mType); - setResult(Activity.RESULT_OK, intent); - finish(); - } catch (Exception e) { - - } - } - - @Override - public void onError(Response response) { - super.onError(response); - toast("保存失败!"); - } - - @Override - public void onFinish() { - super.onFinish(); - dismissDialog(); - } - }); - } else { - toast("保存失败!"); - } - } - - private void pre() { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage("是否保存当前页面内容?"); - builder.setPositiveButton("保存", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { -// boolean success = mView.savePicture(NOTE_FOLDER_DIR+"/"+imgList[imageIndex]+".png",true); - String noteName = "note2.png"; - String path = NOTE_FOLDER_DIR + "/" + noteName; - boolean success = saveAll(path, mView.getCurrentNoteBitmap(), mBGDrawable); - if (success) { - toast("保存成功!"); - } else { - toast("保存失败!"); - } - imageIndex--; - loadImage(); - mIndexTv.setText(String.valueOf(imageIndex + 1)); - } - }); - builder.setNegativeButton("不保存", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - imageIndex--; - loadImage(); - mIndexTv.setText(String.valueOf(imageIndex + 1)); - } - }); - builder.show(); - } - - private void next() { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage("是否保存当前页面内容?"); - builder.setPositiveButton("保存", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { -// boolean success = mView.savePicture(NOTE_FOLDER_DIR+"/"+imgList[imageIndex]+".png",true); - String noteName = "note1.png"; - String path = NOTE_FOLDER_DIR + "/" + noteName; - boolean success = saveAll(path, mView.getCurrentNoteBitmap(), mBGDrawable); - if (success) { - toast("保存成功!"); - } else { - toast("保存失败!"); - } - imageIndex++; - loadImage(); - mIndexTv.setText(String.valueOf(imageIndex + 1)); - } - }); - builder.setNegativeButton("不保存", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - imageIndex++; - loadImage(); - mIndexTv.setText(String.valueOf(imageIndex + 1)); - } - }); - builder.show(); - } - - private void loadImage() { - showDialog("加载中..."); - CustomTarget customTarget = new CustomTarget() { - @Override - public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { - loadOldPage(); - mView.setBackground(resource); - mBGDrawable = resource; - dismissDialog(); - } - - @Override - public void onLoadCleared(@Nullable Drawable placeholder) { - - } - - @Override - public void onLoadFailed(@Nullable Drawable errorDrawable) { - super.onLoadFailed(errorDrawable); - dismissDialog(); - toast(mTitle + "加载失败!"); - } - }; - Glide.with(this) - .load(imgList[imageIndex]) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) - .into(customTarget); - } - - private void toast(String msg) { - Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); - } - - private void loadOldPage() { - if (mNotePageInfo == null) { - return; - } - Log.d(TAG, "Flash test : +++++ loadOldPage() mNotePageInfo = " + mNotePageInfo); - mBGId = mNotePageInfo.drwId; - mView.showExistPage(mNotePageInfo.notePath); - mView.setBackgroundResource(mBGDrawableList[mBGId]); - mPicBtn.setText("背景" + mBGId); - } - - public void onResume() { - Log.d(TAG, "Flash test : +++++++ onResume()"); - mView.onResume(); - mReDrawEnable = true; - super.onResume(); - } - - public void onPause() { - Log.d(TAG, "Flash test : +++++++ onPause()"); - mView.onPause(); - mReDrawEnable = false; - super.onPause(); - } - - public void onDestroy() { - Log.d(TAG, "Flash test : +++++++ onDestroy()"); - //mView.exitView(); - mHandler.removeCallbacks(mRunnable); - mView.exitView(); - if (mReceiver != null) { - mContext.unregisterReceiver(mReceiver); - mReceiver = null; - } - super.onDestroy(); - } - - private static Handler mPointHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - int what = msg.what; - //同步获取的笔记点坐标信息msg - if (what == WeNoteView.TOUCH_EVENT) { - WePoint point = (WePoint) msg.obj; - Log.d(TAG, "Flash test : ++++++++ mPointHandler WePoint = " + point); - mWePointList.add(point); - } - - //保存笔记结束msg - if (what == MSG_SAVE_END) { - int status = msg.arg1; - if (status > 0) { //保存成功 - Log.d(TAG, "Flash test : ++++++++ mPointHandler page save ok"); - //Toast.makeText(mContext, "Note saved OK", Toast.LENGTH_SHORT).show(); - } else { //保存失败 - Log.d(TAG, "Flash test : ++++++++ mPointHandler page save failed"); - //Toast.makeText(mContext, "Note saved Fail", Toast.LENGTH_SHORT).show(); - } - } - } - }; - - private void cancel(boolean save) { - mView.exitView(); - if (save && mView.isHandwritingExist()) { - saveNote(); - } - mView.exitView(); - BookActivity.this.finish(); - } - - private static boolean initPage() { - Log.d(TAG, "Flash test : +++++++++ intPage()"); - File file = new File(NOTE_FOLDER_DIR); - if (!file.exists()) { - Log.e(TAG, "Flash test : +++++++++ addPageFolder() no folder path = " + NOTE_FOLDER_DIR); - if (!makeDir(file)) { - return false; - } - } - - String notePath = null; - file = new File(NOTE_FOLDER_DIR + "/note.png"); - if (file.exists()) { - notePath = NOTE_FOLDER_DIR + "/note.png"; - } - file = new File(NOTE_FOLDER_DIR + "/.drawable.txt"); - if (!file.exists()) { - try { - file.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - saveBGId(); - mNotePageInfo = new NotePageInfo(notePath, mBGId); - return true; - } - - private boolean deleteNote() { - Log.d(TAG, "Flash test : +++++++++ deletdNote()"); - File file = new File(NOTE_FOLDER_DIR); - if (!file.exists()) { - Log.e(TAG, "Flash test : +++++++++ deletdPageFolder() no folder path = " + NOTE_FOLDER_DIR); - return true; - } - deleteDirWithFile(file); - return true; - } - - @Override - protected void onStart() { - File f = new File(NOTE_FOLDER_DIR + "/" + "note.png"); - if (f.exists()) { - f.delete(); - } - super.onStart(); - } - - private boolean saveNote() { - Log.d(TAG, "Flash test : ++++++++ saveNote()"); - File f = new File(NOTE_FOLDER_DIR); - if (!f.exists()) { - Log.d(TAG, "Flash test : +++++++ saveNote() create folder " + NOTE_FOLDER_DIR); - if (!makeDir(f)) { - return false; - } - } - - String noteName = "note.png"; - final Bitmap bmp = Bitmap.createBitmap(mView.getCurrentNoteBitmap()); - if (bmp == null) { - Log.e(TAG, "Flash test : ++++ saveNote() getCurrentNoteBitmap is null"); - return false; - } - - String path = NOTE_FOLDER_DIR + "/" + noteName; - if (!saveNoteWithoutBG(path, bmp)) { - Log.e(TAG, "Flash test : ++++ saveNote() saveNoteWithoutBG fail"); - freeBitmap(bmp); - return false; - } - - saveBGId(); - freeBitmap(bmp); - Log.e(TAG, "Flash test : ++++ saveNote() OK !!!!!"); - return true; - } - - private static boolean saveBGId() { - Log.d(TAG, "Flash test : ++++++++ saveBGId drwId = " + mBGId); - File f = new File(NOTE_FOLDER_DIR); - if (!f.exists()) { - Log.d(TAG, "Flash test : +++++++ saveAllNote() create folder " + NOTE_FOLDER_DIR); - if (!makeDir(f)) { - return false; - } - } - - String path = NOTE_FOLDER_DIR + "/.drawable.txt"; - writeFileData(path, String.valueOf(mBGId)); - return true; - } - - private static void freeBitmap(Bitmap bit) { - if (bit != null && !bit.isRecycled()) { - bit.recycle(); - } - } - - //保存不带背景的笔记为png - private boolean saveNoteWithoutBG(String picPath, Bitmap bmp) { - Log.d(TAG, "Flash test : +++++++ saveNoteWithoutBG() picPath = " + picPath); - File f = new File(picPath); - if (f.exists()) { - f.delete(); - } - FileOutputStream fos = null; - try { - fos = new FileOutputStream(f); - bmp.compress(Bitmap.CompressFormat.PNG, 90, fos); - try { - fos.flush(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - try { - fos.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return true; - } - - //保存带背景的笔记为png - private boolean saveAll(String picPath, Bitmap bmp, Drawable drw) { - Log.d(TAG, "Flash test : ++++ saveAll() picPath = " + picPath); - int width = bmp.getWidth(); - int height = bmp.getHeight(); - - Bitmap bitmap = Bitmap.createBitmap(width, height, - drw.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); - Canvas canvas = new Canvas(bitmap); - drw.setBounds(0, 0, width, height); - drw.draw(canvas); - - canvas.drawBitmap(bmp, new Rect(0, 0, width, height), - new Rect(0, 0, width, height), null); - canvas.save();//Canvas.ALL_SAVE_FLAG); - canvas.restore(); - - boolean result = saveNoteWithoutBG(picPath, bitmap); - if (bitmap != null && !bitmap.isRecycled()) { - bitmap.recycle(); - bitmap = null; - } - System.gc(); - return result; - } - - //保存笔记背景为png - private boolean saveNoteBG(String picPath, Drawable drw, int width, int height) { - Log.d(TAG, "Flash test : ++++ saveNoteBG() picPath = " + picPath); - Bitmap bitmap = Bitmap.createBitmap(width, height, - drw.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); - Canvas canvas = new Canvas(bitmap); - drw.setBounds(0, 0, width, height); - drw.draw(canvas); - - boolean result = saveNoteWithoutBG(picPath, bitmap); - if (bitmap != null && !bitmap.isRecycled()) { - bitmap.recycle(); - bitmap = null; - } - System.gc(); - return result; - } - - //重绘之前绘制的画笔 - private void drawWePointList() { - if (mView.isReDrawDoing()) { - Log.i(TAG, "Flash test : +++++ drawWePointList() return because isReDrawDoing is true"); - return; - } - if (mWePointList != null && !mWePointList.isEmpty()) { - new Thread(new Runnable() { - @Override - public void run() { - mView.setReDrawEnable(true); - mReDrawEnable = true; - int size = mWePointList.size(); - int i = 0; - while (i < size) { - while (!mReDrawEnable) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - WePoint wp = mWePointList.get(i); - mView.drawPoint(wp); - try { - if (i + 1 < size) - Thread.sleep(mWePointList.get(i + 1).eventTime - wp.eventTime); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - i++; - } - mView.setReDrawEnable(false); - } - }).start(); - } - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - //to-do - mView.exitView(); - if (mReceiver != null) { - mContext.unregisterReceiver(mReceiver); - mReceiver = null; - } - BookActivity.this.finish(); - return true; - } - return super.onKeyDown(keyCode, event); - } - - //从笔记文件夹中读取当前笔记的页面信息 - private static NotePageInfo getNotePageInfo(String path) { - Log.d(TAG, "Flash test : +++++++++ getNotePageInfo() path = " + path); - File file = new File(path); - if (!file.exists()) { - Log.e(TAG, "Flash test : +++++++++ getNotePageInfo() no folder path = " + path); - return null; - } - File[] files = file.listFiles(); - if (files == null) { - Log.e(TAG, "Flash test : +++++++++ getNotePageInfo() no files in this Note folder = " + path); - return null; - } - NotePageInfo info = new NotePageInfo(null, 0); - String notePath = path + "/note.png"; - file = new File(notePath); - if (file.exists()) { - info.notePath = notePath; - } - //String drwId = readFileData(path + "/.drawable.txt"); - info.drwId = 0; //Integer.parseInt(drwId); - return info; - } - - private void checkPermission() { - boolean isGranted = true; - if (android.os.Build.VERSION.SDK_INT >= 23) { - if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - //如果没有写sd卡权限 - isGranted = false; - } - if (this.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - isGranted = false; - } - Log.i("cbs", "isGranted == " + isGranted); - if (!isGranted) { - this.requestPermissions( - new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission - .ACCESS_FINE_LOCATION, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE}, - 102); - } - } - } - - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - // 屏幕唤醒 -// if (SCREEN_ON.equals(intent.getAction())) { -// Log.e(TAG, "Flash test : ++++++ " + SCREEN_ON); -// /*if (mDialog != null && mDialog.isShowing()) { -// mView.setEnable(false); -// }*/ -// mView.setSleepMode(true); -// } -// // 屏幕休眠 -// else if (SCREEN_OFF.equals(intent.getAction())) { -// Log.e(TAG, "Flash test : ++++++ " + SCREEN_OFF); -// mView.setSleepMode(true); -// } - } - }; - - private static boolean makeDir(File folder) { - try { - //按照指定的路径创建文件夹 - folder.mkdirs(); - } catch (Exception e) { - // TODO: handle exception - Log.e(TAG, "Flash test : +++++ makeDir() create dir " + folder.getPath() + " error = " + e); - return false; - } - Log.d(TAG, "Flash test : +++++ makeDir() create dir " + folder.getPath()); - return true; - } - - private void deleteDirWithFile(File dir) { - if (dir == null || !dir.exists() || !dir.isDirectory()) - return; - for (File file : dir.listFiles()) { - if (file.isFile()) - file.delete(); // 删除所有文件 - else if (file.isDirectory()) - deleteDirWithFile(file); // 递规的方式删除文件夹 - } - dir.delete();// 删除目录本身 - } - - public static void writeFileData(String fileName, String content) { - File file = new File(fileName); - if (!file.exists()) { - try { - file.createNewFile(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - try { - BufferedWriter bw = new BufferedWriter(new FileWriter(file)); - bw.write(content); - bw.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - //打开指定文件,读取其数据,返回字符串对象 - public static String readFileData(String fileName) { - File file = new File(fileName); - if (!file.exists()) { - return "1"; - } - BufferedReader br; - try { - br = new BufferedReader(new FileReader(file)); - //System.out.println("br.readLine=" + br.readLine()); - return br.readLine(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return "1"; - } - -} - diff --git a/app/src/main/java/com/yzx/webebook/activity/NoteActivity.kt b/app/src/main/java/com/yzx/webebook/activity/NoteActivity.kt deleted file mode 100644 index f9381d1..0000000 --- a/app/src/main/java/com/yzx/webebook/activity/NoteActivity.kt +++ /dev/null @@ -1,687 +0,0 @@ -package com.yzx.webebook.activity - -import android.Manifest -import android.annotation.SuppressLint -import android.app.Activity -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.content.pm.ActivityInfo -import android.content.pm.PackageManager -import android.graphics.Bitmap -import android.graphics.Rect -import android.graphics.drawable.Drawable -import android.os.Handler -import android.os.Message -import android.text.TextUtils -import android.util.Log -import android.view.KeyEvent -import android.view.View -import android.widget.Toast -import com.blankj.utilcode.util.FileUtils -import com.blankj.utilcode.util.GsonUtils -import com.blankj.utilcode.util.ImageUtils -import com.bumptech.glide.Glide -import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.request.target.CustomTarget -import com.bumptech.glide.request.target.Target -import com.bumptech.glide.request.transition.Transition -import com.google.gson.Gson -import com.lzy.okgo.OkGo -import com.lzy.okgo.callback.StringCallback -import com.lzy.okgo.model.Response -import com.wetao.note.NotePageInfo -import com.wetao.note.OnInitedListener -import com.wetao.note.WeNoteView -import com.wetao.note.WePoint -import com.yzx.webebook.R -import com.yzx.webebook.activity.base.BaseActivity -import com.yzx.webebook.model.Note -import com.yzx.webebook.presenter.base.BasePresenter -import kotlinx.android.synthetic.main.activity_note.* -import org.jetbrains.anko.startActivityForResult -import org.jetbrains.anko.toast -import org.json.JSONArray -import org.json.JSONObject -import java.io.File -import java.util.* -import kotlin.system.exitProcess - - -/** - * 笔记页面 - */ -class NoteActivity : BaseActivity>() { - - private val mBGDrawableList = intArrayOf( - R.drawable.background0, - R.drawable.background1, - R.drawable.background2, - R.drawable.background3, - R.drawable.background4, - R.drawable.background5, - R.drawable.background6, - R.drawable.background7, - R.drawable.background8, - R.drawable.background9, - R.drawable.background10 - ) - private var mBgId = 0 - private var mWePointList = mutableListOf() - private var mHandler = Handler() - private var mScreenH = 0 - private var mScreenW = 0 - private val MSG_SAVE_END = 2001 - private var mNotePageInfo: NotePageInfo? = null - private var notList = mutableListOf() - private var currKey = "" - private var currIndex = 0 - val TAG = "NoteActivity" - - - companion object { - const val NOTE_FOLDER_DIR = "/mnt/sdcard/ebook/" - const val REQ_CODE = 0x98 - fun active(act: Activity, title: String, noteInfo: String, can_add_page: Int = 1) { - act.startActivityForResult( - REQ_CODE, - "note_info" to noteInfo, - "title" to title, - "can_add_page" to can_add_page - ) - } - } - - override val inflateId: Int - get() = R.layout.activity_note - - override fun initView() { - checkPermission() - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - - mScreenH = resources.displayMetrics.heightPixels - mScreenW = resources.displayMetrics.widthPixels - - //背景 - new_init.setOnClickListener { - mBgId++ - if (mBgId >= mBGDrawableList.size) { - mBgId = 0 - } - note_view.setBackgroundResource(mBGDrawableList[mBgId]) - val note = notList[currIndex] - note.BGid = mBgId - } - //清除 - new_clear.setOnClickListener { - note_view.clear(); - } - //笔 - pen.setOnClickListener { - if (note_view.penType == WeNoteView.TYPE_DRAW_ERASER) { - note_view.penType = WeNoteView.TYPE_DRAW_CURVE - note_view.updateEnableStatus() - Log.d(TAG, "initNoteView: ${note_view.penType}") - pen.setCompoundDrawablesWithIntrinsicBounds( - 0, - R.mipmap.ic_book_pen_select, - 0, - 0 - ) - new_eraser.setCompoundDrawablesWithIntrinsicBounds( - 0, - R.mipmap.ic_book_rubber, - 0, - 0 - ) - } - } - //橡皮 - new_eraser.setOnClickListener { - if (note_view.penType != WeNoteView.TYPE_DRAW_ERASER) { - note_view.penType = WeNoteView.TYPE_DRAW_ERASER - note_view.updateEnableStatus() - Log.d(TAG, "initNoteView: ${note_view.penType}") - pen.setCompoundDrawablesWithIntrinsicBounds(0, R.mipmap.ic_book_pen, 0, 0) - new_eraser.setCompoundDrawablesWithIntrinsicBounds( - 0, - R.mipmap.ic_book_rubber_select, - 0, - 0 - ) - } - } - //加纸 - new_add.setOnClickListener { - val lastBGid = notList[notList.size - 1].BGid - val note = Note() - note.BGid = lastBGid - notList.add(note) - tv_page_index.text = "${currIndex + 1}/${notList.size}" - indexBox.visibility = if (notList.size > 1) { - View.VISIBLE - } else { - View.GONE - } - } - //title - btnBack.setOnClickListener { onBackPressed() } - titleTv.text = intent.getStringExtra("title") - - //初始化笔记 - mWePointList.clear() - - //屏幕初始化 - val filter = IntentFilter() - filter.addAction(SCREEN_ON) - filter.addAction(SCREEN_OFF) - if (mReceiver != null) { - registerReceiver(mReceiver, filter) - } - - btnPre.setOnClickListener { - if (currIndex - 1 >= 0) { - ImageUtils.save( - note_view.currentNoteBitmap, - "${NOTE_FOLDER_DIR}/${currKey}.png", - Bitmap.CompressFormat.PNG - ) - loadImage(currIndex - 1) - } - } - - btnNext.setOnClickListener { - if (currIndex + 1 < notList.size) { - ImageUtils.save( - note_view.currentNoteBitmap, - "${NOTE_FOLDER_DIR}/${currKey}.png", - Bitmap.CompressFormat.PNG - ) - loadImage(currIndex + 1) - } - } - - saveBtn.setOnClickListener { - saveTip.visibility = View.VISIBLE - saveTip.text = "保存中..." - ImageUtils.save( - note_view.currentNoteBitmap, - "${NOTE_FOLDER_DIR}/${currKey}.png", - Bitmap.CompressFormat.PNG - ) - save(0) - } - } - - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - if (hasFocus) { - note_view.onResume() - } else { - note_view.onPause() - } - } - - @SuppressLint("SetTextI18n") - override fun initData() { - val json = intent.getStringExtra("note_info") - notList.clear() - if (!TextUtils.isEmpty(json)) { - val jsonArray = JSONArray(json) - if (jsonArray.length() > 0) { - for (index in 0 until jsonArray.length()) { - val jsonObj: JSONObject? = jsonArray?.opt(index) as JSONObject - val identity = jsonObj?.getString("identity"); - val key = jsonObj?.getString("key") - val bgId = jsonObj?.getInt("BGid") - val note = Note() - note.BGid = bgId ?: 0 - note.identity = identity ?: "" - note.key = key ?: "" - notList.add(note) - } - } else { - notList.add(Note()) - } - } else { - notList.add(Note()) - } - -// Log.d(TAG, "初始化开始note_view") -// note_view.post { -// Log.d(TAG, "初始化开始note_view.post") -// mHandler.post(mRunnable) -// } - Log.d(TAG, "初始化开始note_view") - note_view.setOnFinishListener(object : OnInitedListener { - override fun onSizeChanged() { - - } - - override fun onInited() { -// note_view.post { -// Log.d(TAG, "初始化开始note_view.post") -// mHandler.post(mRunnable) -// } - - - if (mNotePageInfo == null) { - mNotePageInfo = getNotePageInfo(NOTE_FOLDER_DIR) - } - if (mNotePageInfo == null) { - Log.d(TAG, "Flash test : +++++ no note, so init a page"); - initPage() - } - loadImage(0) - initNoteView() - } - - }) - - tv_page_index.text = "1/${notList.size}" - indexBox.visibility = if (notList.size > 1) { - View.VISIBLE - } else { - View.GONE - } - - val canAddPage = intent.getIntExtra("can_add_page", 1) - if (canAddPage == 1) { - new_add.visibility = View.VISIBLE - } else { - new_add.visibility = View.GONE - } - } - - private fun loadImage(index: Int = 0) { - val note = notList[index] - val identity = note.identity - val key = note.key - val bgId = note.BGid - if (TextUtils.isEmpty(key)) { - note.key = Date().time.toString() - note_view.showExistPage("") - note_view.setBackgroundResource(mBGDrawableList[bgId]) - currKey = note.key - currIndex = index - mBgId = bgId - tv_page_index.text = "${index + 1}/${notList.size}" - return - } - val path = "${NOTE_FOLDER_DIR}/${key}.png" - if (FileUtils.isFileExists(path)) { - if (mNotePageInfo == null) { - return - } - mBgId = bgId ?: 0 - note_view.showExistPage(path) - note_view.setBackgroundResource(mBGDrawableList[bgId]) - currKey = key - currIndex = index - - tv_page_index.text = "${index + 1}/${notList.size}" - } else { - if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(identity)) { - saveTip.visibility = View.VISIBLE - saveTip.text = "加载中..." - val url = "https://${identity}.oa.qbjjyyun.net/edufile/imageView?uniqueKey=${key}" - val customTarget: CustomTarget = object : CustomTarget() { - - override fun onLoadCleared(placeholder: Drawable?) {} - override fun onLoadFailed(errorDrawable: Drawable?) { - toast("文档加载失败!") - saveTip.visibility = View.GONE - } - - override fun onResourceReady( - resource: Drawable, - transition: Transition? - ) { - val bmp = ImageUtils.drawable2Bitmap(resource) - - ImageUtils.save(bmp, path, Bitmap.CompressFormat.PNG) - if (FileUtils.isFileExists(path)) { - if (mNotePageInfo == null) { - return - } - mBgId = bgId ?: 0 - note_view.showExistPage(path) - note_view.setBackgroundResource(mBGDrawableList[bgId]) - currKey = key - currIndex = index - - tv_page_index.text = "${index + 1}/${notList.size}" - } - saveTip.visibility = View.GONE - } - } - Glide.with(this) - .load(url) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .override( - Target.SIZE_ORIGINAL, - Target.SIZE_ORIGINAL - ) - .into(customTarget) - } else { - note.key = Date().time.toString() - note_view.showExistPage("") - note_view.setBackgroundResource(mBGDrawableList[bgId]) - currKey = note.key - currIndex = index - mBgId = bgId ?: 0 - tv_page_index.text = "${index + 1}/${notList.size}" - } - } - } - - private fun save(index: Int) { - val item = notList[index] - val path = "${NOTE_FOLDER_DIR}/${item.key}.png" - - if (!TextUtils.isEmpty(item.key)) { - if (FileUtils.isFileExists(path)) { //存在就上传 - OkGo.post("https://fileupload.oa.qbjjyyun.net/edufile/fileUpload") - .tag(this) - .params("token", "0fc58a8df03c46d3f85b1047c4693cf6") - .params("user", Date().time) - .params("file", File(path)) - .execute(object : StringCallback() { - override fun onSuccess(response: Response) { - try { - val json = response.body() - Log.d("onSuccess", response.body()) - val jsonObject = JSONObject(json) - val content = jsonObject.optString("content") - Log.d("onSuccess,content", content) - val contentObject = JSONObject(content) - val key = contentObject.optString("key") - val identity = contentObject.optString("identity") - Log.d("onSuccess,identity", identity) - Log.d("onSuccess,key", key) - item.key = key - item.identity = identity - FileUtils.copy(path, "${NOTE_FOLDER_DIR}/${key}.png") - if (index == notList.size - 1) { - saveTip.visibility = View.GONE - toast("保存成功!") - backToH5() - } else { - save(index + 1) - } - } catch (e: Exception) { - } - } - - override fun onError(response: Response) { - super.onError(response) - toast("保存失败!") - } - - override fun onFinish() { - super.onFinish() - saveTip.visibility = View.GONE - } - }) - } else { - if (index == notList.size - 1) { - saveTip.visibility = View.GONE - toast("保存成功!") - backToH5() - } else { - save(index + 1) - } - } - - } else { - if (index == notList.size - 1) { - saveTip.visibility = View.GONE - toast("保存成功!") - backToH5() - } else { - save(index + 1) - } - } - - } - - private fun backToH5() { - val intent = Intent() - Log.d(TAG + "--------1------->", copyList().toString()) - Log.d(TAG + "---------2------>", Gson().toJson(copyList())) - Log.d(TAG + "---------3------>", GsonUtils.toJson(notList)) - intent.putExtra("note_info", GsonUtils.toJson(copyList())) - setResult(Activity.RESULT_OK, intent) - onBackPressed() - } - - private fun copyList(): MutableList { - val list = mutableListOf() - notList.forEach { - if (!TextUtils.isEmpty(it.key) && !TextUtils.isEmpty(it.identity)) { - val item = Note() - item.key = it.key - item.identity = it.identity - item.BGid = it.BGid - list.add(item) - } - } - return list - } - - data class CopyNote(val key: String, val identity: String, val BGid: Int) - - override fun initPresenter(): BasePresenter<*>? = null - - private fun checkPermission() { - var isGranted = true - if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - //如果没有写sd卡权限 - isGranted = false - } - if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - isGranted = false - } - Log.i("cbs", "isGranted == $isGranted") - if (!isGranted) { - requestPermissions( - arrayOf( - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ), - 102 - ) - } - } - - override fun onResume() { - note_view.onResume() - super.onResume() - } - - override fun onPause() { - note_view.onPause() - super.onPause() - } - - override fun onDestroy() { - //mView.exitView(); - mHandler.removeCallbacks(mRunnable) - note_view.exitView() - if (mReceiver != null) { - unregisterReceiver(mReceiver) - mReceiver = null - } - super.onDestroy() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - note_view.exitView() - if (mReceiver != null) { - unregisterReceiver(mReceiver) - mReceiver = null - } - finish() - return true - } - return super.onKeyDown(keyCode, event) - } - - val SCREEN_ON = "android.intent.action.SCREEN_ON" - val SCREEN_OFF = "android.intent.action.SCREEN_OFF" - - private var mReceiver: BroadcastReceiver? = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - // 屏幕唤醒 -// if (SCREEN_ON == intent.action) { -// note_view.setSleepMode(true) -// } else if (SCREEN_OFF == intent.action) { -// note_view.setSleepMode(true) -// } - } - } - - private val mRunnable: Runnable = object : Runnable { - override fun run() { - Log.d(TAG, "初始化开始-------------》"); - var count = 0 - while (note_view.height <= 0) { - try { - Thread.sleep(50) - } catch (e: InterruptedException) { - e.printStackTrace() - } - if (count++ > 40) { - Log.d(TAG, "Flash test : ++++++++ removeCallbacks"); - mHandler.removeCallbacks(this) - exitProcess(0) - } - } - //note_view.initNative(new Rect(mScreenW, mScreenH - note_view.getHeight(), 0, mScreenH), SAVE_PIC_PATH); - Log.d( - TAG, - "Flash test : ++++++++ mView.getHeight() = " + note_view.height + ", count = " + count - ); -// note_view.initNative( -// Rect( -// mScreenW, -// mScreenH - note_view.height, -// 0, -// mScreenH -// ) -// ) - note_view.setTouchEventHander(mPointHandler) - Log.d(TAG, "Flash test : ++++++ mRunnable() start loader notepageinfo"); - if (mNotePageInfo == null) { - mNotePageInfo = getNotePageInfo(NOTE_FOLDER_DIR) - } - if (mNotePageInfo == null) { - Log.d(TAG, "Flash test : +++++ no note, so init a page"); - initPage() - } - loadImage(0) - initNoteView() - - Log.d(TAG, "初始化结束-------------》"); - } - } - - private fun initNoteView() { - //写字板初始化 -// note_view.setEnable(true) - note_view.penWidth = 3 - note_view.eraserWidth = 20 - note_view.penType = WeNoteView.TYPE_DRAW_CURVE - note_view.updateEnableStatus() - - Log.d(TAG, "initNoteView: ${note_view.penType}") - } - - override fun finish() { - note_view.exitView() - if (mReceiver != null) { - unregisterReceiver(mReceiver) - mReceiver = null - } - super.finish() - } - - override fun onBackPressed() { - note_view.exitView() - if (mReceiver != null) { - unregisterReceiver(mReceiver) - mReceiver = null - } - super.onBackPressed() - } - - private fun initPage(): Boolean { - var file = File(NOTE_FOLDER_DIR) - if (!file.exists()) { - if (!FileUtils.createOrExistsDir(file)) { - return false - } - } - var notePath: String? = null - file = File("$NOTE_FOLDER_DIR/${currKey}.png") - if (file.exists()) { - notePath = "$NOTE_FOLDER_DIR/${currKey}.png" - } - mNotePageInfo = NotePageInfo(notePath, mBgId) - return true - } - - private fun loadOldPage() { - if (mNotePageInfo == null) { - return - } - mBgId = mNotePageInfo?.drwId ?: 0 - note_view.showExistPage(mNotePageInfo?.notePath) - note_view.setBackgroundResource(mBGDrawableList[mBgId]) - } - - //从笔记文件夹中读取当前笔记的页面信息 - private fun getNotePageInfo(path: String): NotePageInfo? { - - var file = File(path) - if (!file.exists()) { - return null - } - file.listFiles() ?: return null - val info = NotePageInfo(null, 0) - val notePath = "$path/${currKey}.png" - file = File(notePath) - if (file.exists()) { - info.notePath = notePath - } - info.drwId = 0 //Integer.parseInt(drwId); - return info - } - - private val mPointHandler: Handler = @SuppressLint("HandlerLeak") - object : Handler() { - override fun handleMessage(msg: Message) { - val what = msg.what - //同步获取的笔记点坐标信息msg - if (what == WeNoteView.TOUCH_EVENT) { - val point = msg.obj as WePoint - mWePointList.add(point) - } - - //保存笔记结束msg - if (what == MSG_SAVE_END) { - val status = msg.arg1 - if (status > 0) { //保存成功 - Toast.makeText(applicationContext, "保存成功!", Toast.LENGTH_SHORT).show(); - } else { //保存失败 - Toast.makeText(applicationContext, "保存失败!", Toast.LENGTH_SHORT) - .show(); - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/activity/PDFViewActivity.kt b/app/src/main/java/com/yzx/webebook/activity/PDFViewActivity.kt deleted file mode 100644 index 1ff06ff..0000000 --- a/app/src/main/java/com/yzx/webebook/activity/PDFViewActivity.kt +++ /dev/null @@ -1,171 +0,0 @@ -package com.yzx.webebook.activity - -import android.content.Context -import android.os.PowerManager -import android.os.PowerManager.WakeLock -import androidx.viewpager.widget.ViewPager -import com.blankj.utilcode.util.NumberUtils -import com.yzx.webebook.R -import com.yzx.webebook.activity.base.BaseActivity -import com.yzx.webebook.model.bean.BookRecordBean -import com.yzx.webebook.model.bean.CollBookBean -import com.yzx.webebook.model.local.BookRepository -import com.yzx.webebook.presenter.ReadPresenter -import com.yzx.webebook.presenter.ReadView -import com.yzx.webebook.widget.YzxPDFViewPager -import kotlinx.android.synthetic.main.activity_pdf_view.* - -/** - * pdf 预览页面 - */ -class PDFViewActivity : BaseActivity(), ReadView { - - private var mBookRecord: BookRecordBean? = null - private var mCollBook: CollBookBean? = null - private var mRealBookId: String = "" - private var mReadTaskId: String = "" - private var mBookId: String = "" - var currPage = 0 - var total = 0 - var oldPosition = 0 - var lastProgress = 0f - - //控制屏幕常亮 - private var mWakeLock: WakeLock? = null - - override val inflateId: Int - get() = R.layout.activity_pdf_view - - override fun initView() { - mBookId = intent.getStringExtra("book_id") ?: "" - mReadTaskId = intent.getStringExtra("read_task_id") ?: "" - mRealBookId = intent.getStringExtra("real_book_id") ?: "" - - mCollBook = BookRepository.getInstance().getCollBook(mBookId) - - mCollBook.apply { - loadPdf() - } - - mPresenter?.getReadProgress(mRealBookId, mReadTaskId) - } - - private fun loadPdf() { - val pdf = YzxPDFViewPager(this, mCollBook?.cover ?: "") - pdfView.addView(pdf) - - total = pdf.adapter?.count ?: 0 - btnLeft.setOnClickListener { - if (currPage > 0) { - pdf.currentItem = --currPage - } - } - - btnRight.setOnClickListener { - if (currPage < total - 1) { - pdf.currentItem = ++currPage - } - } - prepareBook() - - pdf.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrollStateChanged(state: Int) { - - } - - override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int - ) { - - } - - override fun onPageSelected(position: Int) { - currPageTv.text = "${position + 1}" - percentTv.text = "${getPercent(position.toFloat(), total.toFloat())}%" - mBookRecord?.pagePos = position - } - - }) - val pos = mBookRecord?.pagePos ?: 0; - pdf.currentItem = pos - currPage = pos - } - - /** - * 初始化书籍 - */ - private fun prepareBook() { - mBookRecord = BookRepository.getInstance() - .getBookRecord(mCollBook!!._id) - if (mBookRecord == null) { - mBookRecord = BookRecordBean() - mBookRecord?.bookId = mBookId - totalPageTv.text = "$total" - currPageTv.text = "${currPage + 1}" - percentTv.text = "${getPercent(1f, total.toFloat())}%" - oldPosition = 0 - } else { - oldPosition = mBookRecord!!.pagePos - totalPageTv.text = "$total" - currPageTv.text = "${mBookRecord!!.pagePos + 1}" - percentTv.text = - "${getPercent((mBookRecord!!.pagePos + 1).toFloat(), total.toFloat())}%" - } - } - - override fun initData() { - //初始化屏幕常亮类 - - //初始化屏幕常亮类 - val pm = - getSystemService(Context.POWER_SERVICE) as PowerManager - mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "ireader:keep bright") - - } - - private fun getPercent(curr: Float, total: Float): String { - val percent = NumberUtils.format(curr * 100f / total, 2) - return "$percent" - } - - override fun initPresenter(): ReadPresenter = ReadPresenter(this) - override fun onResume() { - super.onResume() - mWakeLock?.acquire() - } - - override fun onPause() { - super.onPause() - mWakeLock?.release() - //存储到数据库 - if (mBookRecord != null) { - BookRepository.getInstance() - .saveBookRecord(mBookRecord) - - val currProgress = getPercent( - (mBookRecord!!.pagePos + 1).toFloat(), - total.toFloat() - ).toFloat() - if (mBookRecord!!.pagePos > oldPosition && currProgress > lastProgress) { - mPresenter?.updateReadProgress( - mRealBookId, mReadTaskId, currProgress.toString() - ) - } - } - } - - override fun finishChapter() { - } - - override fun errorChapter() { - } - - override fun showCategory(localId: String?) { - } - - override fun onProgressSuccess(progress: Float) { - lastProgress = progress - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/activity/ReadActivity.java b/app/src/main/java/com/yzx/webebook/activity/ReadActivity.java deleted file mode 100644 index 31f010f..0000000 --- a/app/src/main/java/com/yzx/webebook/activity/ReadActivity.java +++ /dev/null @@ -1,730 +0,0 @@ -package com.yzx.webebook.activity; - - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.database.ContentObserver; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.PowerManager; -import android.provider.Settings; -import android.util.Log; -import android.view.Gravity; -import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.SeekBar; -import android.widget.TextView; - -import androidx.core.content.ContextCompat; -import androidx.core.view.GravityCompat; -import androidx.drawerlayout.widget.DrawerLayout; - -import com.blankj.utilcode.util.NumberUtils; -import com.google.android.material.appbar.AppBarLayout; -import com.yzx.webebook.R; -import com.yzx.webebook.activity.base.BaseActivity; -import com.yzx.webebook.adapter.CategoryAdapter; -import com.yzx.webebook.model.bean.BookChapterBean; -import com.yzx.webebook.model.bean.CollBookBean; -import com.yzx.webebook.model.local.BookRepository; -import com.yzx.webebook.model.local.ReadSettingManager; -import com.yzx.webebook.presenter.ReadPresenter; -import com.yzx.webebook.presenter.ReadView; -import com.yzx.webebook.utils.BrightnessUtils; -import com.yzx.webebook.utils.Constant; -import com.yzx.webebook.utils.LogUtils; -import com.yzx.webebook.utils.RxUtils; -import com.yzx.webebook.utils.ScreenUtils; -import com.yzx.webebook.utils.StringUtils; -import com.yzx.webebook.utils.SystemBarUtils; -import com.yzx.webebook.widget.ReadSettingDialog; -import com.yzx.webebook.widget.page.PageLoader; -import com.yzx.webebook.widget.page.PageView; -import com.yzx.webebook.widget.page.TxtChapter; - -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -import io.reactivex.disposables.Disposable; - -import static android.view.View.GONE; -import static android.view.View.VISIBLE; - -public class ReadActivity extends BaseActivity implements ReadView { - private static final String TAG = "ReadActivity"; - public static final int REQUEST_MORE_SETTING = 1; - public static final String EXTRA_COLL_BOOK = "extra_coll_book"; - public static final String EXTRA_IS_COLLECTED = "extra_is_collected"; - - // 注册 Brightness 的 uri - private final Uri BRIGHTNESS_MODE_URI = - Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE); - private final Uri BRIGHTNESS_URI = - Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); - private final Uri BRIGHTNESS_ADJ_URI = - Settings.System.getUriFor("screen_auto_brightness_adj"); - - private static final int WHAT_CATEGORY = 1; - private static final int WHAT_CHAPTER = 2; - - DrawerLayout mDlSlide; - /*************top_menu_view*******************/ -// AppBarLayout mAblTopMenu; -// TextView mTvCommunity; -// TextView mTvBrief; - /***************content_view******************/ - PageView mPvPage; - /***************bottom_menu_view***************************/ - TextView mTvPageTip; - - LinearLayout mLlBottomMenu; - TextView mTvPreChapter; - SeekBar mSbChapterProgress; - TextView mTvNextChapter; - TextView mTvCategory; - TextView mTvNightMode; - TextView mTvSetting; - /***************left slide*******************************/ - ListView mLvCategory; - /*****************view******************/ - private ReadSettingDialog mSettingDialog; - private PageLoader mPageLoader; - private Animation mTopInAnim; - private Animation mTopOutAnim; - private Animation mBottomInAnim; - private Animation mBottomOutAnim; - private CategoryAdapter mCategoryAdapter; - private CollBookBean mCollBook; - //控制屏幕常亮 - private PowerManager.WakeLock mWakeLock; - - - /***************params*****************/ - private boolean isCollected = false; // isFromSDCard - private boolean isNightMode = false; - private boolean isFullScreen = false; - private boolean isRegistered = false; - - private String mBookId; - private String mRealBookId; - private String mReadTaskId; - private float lastProgress = 0f; - - - private Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - - switch (msg.what) { - case WHAT_CATEGORY: - mLvCategory.setSelection(mPageLoader.getChapterPos()); - break; - case WHAT_CHAPTER: - mPageLoader.openChapter(); - break; - } - } - }; - // 接收电池信息和时间更新的广播 - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { - int level = intent.getIntExtra("level", 0); - if (mPageLoader != null) { - mPageLoader.updateBattery(level); - } - } - // 监听分钟的变化 - else if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) { - if (mPageLoader != null) { - mPageLoader.updateTime(); - } - } - } - }; - - // 亮度调节监听 - // 由于亮度调节没有 Broadcast 而是直接修改 ContentProvider 的。所以需要创建一个 Observer 来监听 ContentProvider 的变化情况。 - private ContentObserver mBrightObserver = new ContentObserver(new Handler()) { - @Override - public void onChange(boolean selfChange) { - onChange(selfChange, null); - } - - @Override - public void onChange(boolean selfChange, Uri uri) { - super.onChange(selfChange); - - // 判断当前是否跟随屏幕亮度,如果不是则返回 - if (selfChange || !mSettingDialog.isBrightFollowSystem()) return; - - // 如果系统亮度改变,则修改当前 Activity 亮度 - if (BRIGHTNESS_MODE_URI.equals(uri)) { - Log.d(TAG, "亮度模式改变"); - } else if (BRIGHTNESS_URI.equals(uri) && !BrightnessUtils.isAutoBrightness(ReadActivity.this)) { - Log.d(TAG, "亮度模式为手动模式 值改变"); - BrightnessUtils.setBrightness(ReadActivity.this, BrightnessUtils.getScreenBrightness(ReadActivity.this)); - } else if (BRIGHTNESS_ADJ_URI.equals(uri) && BrightnessUtils.isAutoBrightness(ReadActivity.this)) { - Log.d(TAG, "亮度模式为自动模式 值改变"); - BrightnessUtils.setDefaultBrightness(ReadActivity.this); - } else { - Log.d(TAG, "亮度调整 其他"); - } - } - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - public int getInflateId() { - return R.layout.activity_read; - } - - @Override - public void initView() { - mDlSlide = findViewById(R.id.read_dl_slide); -// mTvCommunity = findViewById(R.id.read_tv_community); -// mTvBrief = findViewById(R.id.read_tv_brief); - mPvPage = findViewById(R.id.read_pv_page); - mTvPageTip = findViewById(R.id.read_tv_page_tip); - mLlBottomMenu = findViewById(R.id.read_ll_bottom_menu); - mTvPreChapter = findViewById(R.id.read_tv_pre_chapter); - mSbChapterProgress = findViewById(R.id.read_sb_chapter_progress); - mTvNextChapter = findViewById(R.id.read_tv_next_chapter); - mTvCategory = findViewById(R.id.read_tv_category); - mTvNightMode = findViewById(R.id.read_tv_night_mode); - mTvSetting = findViewById(R.id.read_tv_setting); - mLvCategory = findViewById(R.id.read_iv_category); - } - - @Override - public void initData() { - String id = getIntent().getStringExtra("book_id"); - mReadTaskId = getIntent().getStringExtra("read_task_id"); - mRealBookId = getIntent().getStringExtra("real_book_id"); - loadBookData(id); - - getMPresenter().getReadProgress(mRealBookId, mReadTaskId); - } - - - private void loadBookData(String id) { - mCollBook = BookRepository.getInstance().getCollBook(id); - - isNightMode = ReadSettingManager.getInstance().isNightMode(); - isFullScreen = ReadSettingManager.getInstance().isFullScreen(); - mBookId = mCollBook.get_id(); - Log.d(TAG, "initData: " + mCollBook.toString()); - - //获取页面加载器 - mPageLoader = mPvPage.getPageLoader(mCollBook); - - //禁止滑动展示DrawerLayout - mDlSlide.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); - //侧边打开后,返回键能够起作用 - mDlSlide.setFocusableInTouchMode(false); - mSettingDialog = new ReadSettingDialog(this, mPageLoader); - - setUpAdapter(); - - //夜间模式按钮的状态 - toggleNightMode(); - - //注册广播 - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); - intentFilter.addAction(Intent.ACTION_TIME_TICK); - registerReceiver(mReceiver, intentFilter); - - //设置当前Activity的Brightness - if (ReadSettingManager.getInstance().isBrightnessAuto()) { - BrightnessUtils.setDefaultBrightness(this); - } else { - BrightnessUtils.setBrightness(this, ReadSettingManager.getInstance().getBrightness()); - } - - //初始化屏幕常亮类 - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "ireader:keep bright"); - - - //初始化BottomMenu - initBottomMenu(); - - - Disposable disposable = BookRepository.getInstance() - .getBookChaptersInRx(mBookId) - .compose(RxUtils::toSimpleSingle) - .subscribe( - (bookChapterBeen, throwable) -> { - // 设置 CollBook - mPageLoader.getCollBook().setBookChapters(bookChapterBeen); - // 刷新章节列表 - mPageLoader.refreshChapterList(); - LogUtils.e(throwable); - } - ); - addDisposable(disposable); - initClick(); - } - - private void saveBookInfo() { - if (mCollBook != null) { - mCollBook.setLastRead(StringUtils. - dateConvert(System.currentTimeMillis(), Constant.FORMAT_BOOK_DATE)); - - BookRepository.getInstance() - .saveCollBookWithAsync(mCollBook); - } - } - - - private void initClick() { - mPageLoader.setOnPageChangeListener( - new PageLoader.OnPageChangeListener() { - - @Override - public void onChapterChange(int pos) { - mCategoryAdapter.setChapter(pos); - } - - @Override - public void requestChapters(List requestChapters) { - getMPresenter().loadChapter(mBookId, requestChapters); - mHandler.sendEmptyMessage(WHAT_CATEGORY); - //隐藏提示 - mTvPageTip.setVisibility(GONE); - } - - @Override - public void onCategoryFinish(List chapters) { - for (TxtChapter chapter : chapters) { - chapter.setTitle(StringUtils.convertCC(chapter.getTitle(), mPvPage.getContext())); - } - mCategoryAdapter.refreshItems(chapters); - } - - @Override - public void onPageCountChange(int count) { - mSbChapterProgress.setMax(Math.max(0, count - 1)); - mSbChapterProgress.setProgress(0); - // 如果处于错误状态,那么就冻结使用 - if (mPageLoader.getPageStatus() == PageLoader.STATUS_LOADING - || mPageLoader.getPageStatus() == PageLoader.STATUS_ERROR) { - mSbChapterProgress.setEnabled(false); - } else { - mSbChapterProgress.setEnabled(true); - } - } - - @Override - public void onPageChange(int pos) { - mSbChapterProgress.post( - () -> { - mSbChapterProgress.setProgress(pos); - } - ); - } - } - ); - - mSbChapterProgress.setOnSeekBarChangeListener( - new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (mLlBottomMenu.getVisibility() == VISIBLE) { - //显示标题 - mTvPageTip.setText((progress + 1) + "/" + (mSbChapterProgress.getMax() + 1)); - mTvPageTip.setVisibility(VISIBLE); - } - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - //进行切换 - int pagePos = mSbChapterProgress.getProgress(); - if (pagePos != mPageLoader.getPagePos()) { - mPageLoader.skipToPage(pagePos); - } - //隐藏提示 - mTvPageTip.setVisibility(GONE); - } - } - ); - - mPvPage.setTouchListener(new PageView.TouchListener() { - @Override - public boolean onTouch() { - return !hideReadMenu(); - } - - @Override - public void center() { - toggleMenu(true); - } - - @Override - public void prePage() { - } - - @Override - public void nextPage() { - } - - @Override - public void cancel() { - } - }); - mLvCategory.setOnItemClickListener( - (parent, view, position, id) -> { - mDlSlide.closeDrawer(GravityCompat.START); - mPageLoader.skipToChapter(position); - } - ); - - mTvCategory.setOnClickListener( - (v) -> { - //移动到指定位置 - if (mCategoryAdapter.getCount() > 0) { - mLvCategory.setSelection(mPageLoader.getChapterPos()); - } - //切换菜单 - toggleMenu(true); - //打开侧滑动栏 - mDlSlide.openDrawer(GravityCompat.START); - } - ); - mTvSetting.setOnClickListener( - (v) -> { - toggleMenu(false); - mSettingDialog.show(); - } - ); - - mTvPreChapter.setOnClickListener( - (v) -> { - if (mPageLoader.skipPreChapter()) { - mCategoryAdapter.setChapter(mPageLoader.getChapterPos()); - } - } - ); - - mTvNextChapter.setOnClickListener( - (v) -> { - if (mPageLoader.skipNextChapter()) { - mCategoryAdapter.setChapter(mPageLoader.getChapterPos()); - } - } - ); - - mTvNightMode.setOnClickListener( - (v) -> { - if (isNightMode) { - isNightMode = false; - } else { - isNightMode = true; - } - mPageLoader.setNightMode(isNightMode); - toggleNightMode(); - } - ); - - } - - @Nullable - @Override - public ReadPresenter initPresenter() { - return new ReadPresenter(this); - } - - @Override - public void showCategory(String localId) { - loadBookData(localId); - } - - @Override - public void finishChapter() { - - } - - @Override - public void errorChapter() { - - } - - private void initBottomMenu() { - //判断是否全屏 - if (ReadSettingManager.getInstance().isFullScreen()) { - //还需要设置mBottomMenu的底部高度 - ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mLlBottomMenu.getLayoutParams(); - params.bottomMargin = ScreenUtils.getNavigationBarHeight(); - mLlBottomMenu.setLayoutParams(params); - } else { - //设置mBottomMenu的底部距离 - ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mLlBottomMenu.getLayoutParams(); - params.bottomMargin = 0; - mLlBottomMenu.setLayoutParams(params); - } - } - - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - } - - private void toggleNightMode() { - if (isNightMode) { - mTvNightMode.setText("日间"); - Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_read_menu_morning); - mTvNightMode.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); - } else { - mTvNightMode.setText("夜间"); - Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_read_menu_night); - mTvNightMode.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); - } - } - - private void setUpAdapter() { - mCategoryAdapter = new CategoryAdapter(); - mLvCategory.setAdapter(mCategoryAdapter); - mLvCategory.setFastScrollEnabled(true); - } - - // 注册亮度观察者 - private void registerBrightObserver() { - try { - if (mBrightObserver != null) { - if (!isRegistered) { - final ContentResolver cr = getContentResolver(); - cr.unregisterContentObserver(mBrightObserver); - cr.registerContentObserver(BRIGHTNESS_MODE_URI, false, mBrightObserver); - cr.registerContentObserver(BRIGHTNESS_URI, false, mBrightObserver); - cr.registerContentObserver(BRIGHTNESS_ADJ_URI, false, mBrightObserver); - isRegistered = true; - } - } - } catch (Throwable throwable) { - LogUtils.e(TAG, "register mBrightObserver error! " + throwable); - } - } - - //解注册 - private void unregisterBrightObserver() { - try { - if (mBrightObserver != null) { - if (isRegistered) { - getContentResolver().unregisterContentObserver(mBrightObserver); - isRegistered = false; - } - } - } catch (Throwable throwable) { - LogUtils.e(TAG, "unregister BrightnessObserver error! " + throwable); - } - } - - /** - * 隐藏阅读界面的菜单显示 - * - * @return 是否隐藏成功 - */ - private boolean hideReadMenu() { - if (mLlBottomMenu.getVisibility() == VISIBLE) { - toggleMenu(true); - return true; - } else if (mSettingDialog.isShowing()) { - mSettingDialog.dismiss(); - return true; - } - return false; - } - - - /** - * 切换菜单栏的可视状态 - * 默认是隐藏的 - */ - private void toggleMenu(boolean hideStatusBar) { - initMenuAnim(); - - if (mLlBottomMenu.getVisibility() == View.VISIBLE) { - //关闭 - mLlBottomMenu.setVisibility(GONE); - mTvPageTip.setVisibility(GONE); - } else { - mLlBottomMenu.setVisibility(View.VISIBLE); - } - } - - //初始化菜单动画 - private void initMenuAnim() { - if (mTopInAnim != null) return; - - mTopInAnim = AnimationUtils.loadAnimation(this, R.anim.slide_top_in); - mTopOutAnim = AnimationUtils.loadAnimation(this, R.anim.slide_top_out); - mBottomInAnim = AnimationUtils.loadAnimation(this, R.anim.slide_bottom_in); - mBottomOutAnim = AnimationUtils.loadAnimation(this, R.anim.slide_bottom_out); - //退出的速度要快 - mTopOutAnim.setDuration(200); - mBottomOutAnim.setDuration(200); - } - - @Override - public void onBackPressed() { - if (mLlBottomMenu.getVisibility() == View.VISIBLE) { - // 非全屏下才收缩,全屏下直接退出 - if (!ReadSettingManager.getInstance().isFullScreen()) { - toggleMenu(true); - return; - } - } else if (mSettingDialog.isShowing()) { - mSettingDialog.dismiss(); - return; - } else if (mDlSlide.isDrawerOpen(GravityCompat.START)) { - mDlSlide.closeDrawer(GravityCompat.START); - return; - } - - if (!mCollBook.isLocal() && !isCollected - && !mCollBook.getBookChapters().isEmpty() && false) { - AlertDialog alertDialog = new AlertDialog.Builder(this) - .setTitle("加入书架") - .setMessage("喜欢本书就加入书架吧") - .setPositiveButton("确定", (dialog, which) -> { - //设置为已收藏 - isCollected = true; - //设置阅读时间 - mCollBook.setLastRead(StringUtils. - dateConvert(System.currentTimeMillis(), Constant.FORMAT_BOOK_DATE)); - - BookRepository.getInstance() - .saveCollBookWithAsync(mCollBook); - - exit(); - }) - .setNegativeButton("取消", (dialog, which) -> { - exit(); - }).create(); - alertDialog.show(); - } else { - exit(); - } - } - - // 退出 - private void exit() { - // 退出 - super.onBackPressed(); - } - - @Override - protected void onStart() { - super.onStart(); - registerBrightObserver(); - } - - @Override - protected void onResume() { - super.onResume(); - if (mWakeLock != null) { - mWakeLock.acquire(); - } - } - - @Override - protected void onPause() { - super.onPause(); - if (mWakeLock != null) { - mWakeLock.release(); - } - if (mPageLoader != null) { - saveBookInfo(); - mPageLoader.saveRecord(); - } - if (getMPresenter() != null && mPageLoader != null) { - float currProgress = Float.parseFloat(mPageLoader.getPercent()); - if (currProgress > lastProgress) { - getMPresenter().updateReadProgress(mRealBookId, mReadTaskId, String.valueOf(mPageLoader.getPercent())); - } - } - } - - @Override - protected void onStop() { - super.onStop(); - unregisterBrightObserver(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - unregisterReceiver(mReceiver); - - mHandler.removeMessages(WHAT_CATEGORY); - mHandler.removeMessages(WHAT_CHAPTER); - - mPageLoader.closeBook(); - mPageLoader = null; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - boolean isVolumeTurnPage = ReadSettingManager - .getInstance().isVolumeTurnPage(); - switch (keyCode) { - case KeyEvent.KEYCODE_VOLUME_UP: - if (isVolumeTurnPage) { - return mPageLoader.skipToPrePage(); - } - break; - case KeyEvent.KEYCODE_VOLUME_DOWN: - if (isVolumeTurnPage) { - return mPageLoader.skipToNextPage(); - } - break; - } - return super.onKeyDown(keyCode, event); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_MORE_SETTING) { - boolean fullScreen = ReadSettingManager.getInstance().isFullScreen(); - if (isFullScreen != fullScreen) { - isFullScreen = fullScreen; - // 刷新BottomMenu - initBottomMenu(); - } - - } - } - - @Override - public void onProgressSuccess(float progress) { - lastProgress = progress; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/activity/WeexTestActivity.kt b/app/src/main/java/com/yzx/webebook/activity/WeexTestActivity.kt deleted file mode 100644 index 3b00ecf..0000000 --- a/app/src/main/java/com/yzx/webebook/activity/WeexTestActivity.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.yzx.webebook.activity - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle -import com.yzx.webebook.activity.base.BaseWeexActivity - -class WeexTestActivity : BaseWeexActivity() { - - - override fun initView() { - - } - - override fun initData() { - val url = intent.getStringExtra("url") ?: "" - val params = intent.getStringExtra("params") ?: "" - setUrlInfo(url, "RaderPage", params) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/activity/base/BaseWeexActivity.kt b/app/src/main/java/com/yzx/webebook/activity/base/BaseWeexActivity.kt deleted file mode 100644 index eddf943..0000000 --- a/app/src/main/java/com/yzx/webebook/activity/base/BaseWeexActivity.kt +++ /dev/null @@ -1,201 +0,0 @@ -package com.yzx.webebook.activity.base - -import android.annotation.SuppressLint -import android.os.Bundle -import android.os.Handler -import android.os.Message -import android.util.Log -import android.view.View -import androidx.appcompat.app.AppCompatActivity -import com.gyf.immersionbar.ktx.immersionBar -import com.yzx.webebook.R -import com.yzx.webebook.modules.ActivityWXModule -import com.yzx.webebook.utils.StringUtils -import kotlinx.android.synthetic.main.activity_base_weex.* -import org.apache.weex.IWXRenderListener -import org.apache.weex.WXSDKEngine -import org.apache.weex.WXSDKInstance -import org.apache.weex.common.WXRenderStrategy -import org.apache.weex.utils.WXFileUtils - -/** - * 类名:BaseActivity - * 作者:Yun.Lei - * 功能: - * 创建日期:2020年5月6日14:27:04 - * 修改人: - * 修改时间: - * 修改备注: - */ -abstract class BaseWeexActivity : AppCompatActivity(), IWXRenderListener { - - - /** - * 初始化视图操作在这里执行,执行时机为onCreate之后 - */ - abstract fun initView(): Unit - - /** - * 数据初始化在这里执行,执行时机为initView之后 - */ - abstract fun initData(): Unit - - var mWXSDKInstance: WXSDKInstance? = null - var pageName: String = "WeexPage" - var bundleUrl: String = "" - var params: String = "" - - private val handler: Handler = @SuppressLint("HandlerLeak") - object : Handler() { - override fun handleMessage(msg: Message) { - super.handleMessage(msg) - /** - * 轮询访问 WXSDKEngine 初始化状态 防止异步造成的初始化失败问题 - */ - if (msg.what == 1) { - Log.i( - "welog", - "WXSDKEngine.isInitializedActivity: " + WXSDKEngine.isInitialized() - ) - //&& !StringUtils.isEmpty(pageName) && !StringUtils.isEmpty( bundleUrl) - if (WXSDKEngine.isInitialized()) { - startRender() - } else { - sendEmptyMessageDelayed(1, 300) - } - } - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_base_weex) - initView() - initData() - setStatusBar() - - mWXSDKInstance = WXSDKInstance(this) - mWXSDKInstance!!.registerRenderListener(this) - - startRender() - if (WXSDKEngine.isInitialized()) { - } else { - handler.sendEmptyMessageDelayed(1, 300) - } - } - - /** - * WXSDKEngine 初始化成功后 开始渲染 - */ - private fun startRender() { - - /** - * 防止空指针 - */ - if (mWXSDKInstance == null) { - mWXSDKInstance = WXSDKInstance(this) - mWXSDKInstance!!.registerRenderListener(this) - } - /** - * 渲染远程js - */ -// bundleUrl = "http://dotwe.org/raw/dist/38e202c16bdfefbdb88a8754f975454c.bundle.wx"; - try { - Log.d("welog", "开始加载") - bundleUrl = "https://oa.live.educlouddata.com/index.js"; - mWXSDKInstance?.renderByUrl("https://oa.live.educlouddata.com", bundleUrl, null, null, WXRenderStrategy.APPEND_ASYNC) - Log.d("welog", "加载中") - }catch (e:Exception){ - Log.d("welog", "加载失败,$e") - } - - /** - * 渲染本地js - */ -// val options = mapOf("params" to this.params) -// Log.d("welog", "startRender: $options") -// mWXSDKInstance!!.render( -// pageName, -// WXFileUtils.loadAsset(bundleUrl, this), -// options, -// null, -// WXRenderStrategy.APPEND_ASYNC -// ) - } - - fun setUrlInfo(url: String, pageName: String, params: String = "") { - this.pageName = pageName - this.bundleUrl = url - this.params = params - } - - open fun setStatusBar() { - immersionBar { - statusBarColor(R.color.white) - fitsSystemWindows(true) - statusBarDarkFont(true, 0.2f) - keyboardEnable(true) - init() - } - - btnBack.setOnClickListener { onBackPressed() } - btnClose.setOnClickListener { - finish() - } - } - - - override fun onViewCreated(instance: WXSDKInstance?, view: View) { - Log.d("welog", "onViewCreated:") - if (view.parent == null) { - webLayout.addView(view); - } - webLayout.requestLayout(); - } - - override fun onRenderSuccess(instance: WXSDKInstance?, width: Int, height: Int) { - Log.d("welog", "onRenderSuccess:") - } - - override fun onRefreshSuccess(instance: WXSDKInstance?, width: Int, height: Int) { - Log.d("welog", "onRefreshSuccess:") - } - - override fun onException(instance: WXSDKInstance?, errCode: String?, msg: String?) { - Log.d("welog", "onException: $errCode//$msg") - handler.sendEmptyMessageDelayed(1, 300) - } - - override fun onResume() { - super.onResume() - if (mWXSDKInstance != null) { - mWXSDKInstance!!.onActivityResume() - } - } - - override fun onPause() { - super.onPause() - if (mWXSDKInstance != null) { - mWXSDKInstance!!.onActivityPause() - } - } - - override fun onStop() { - super.onStop() - if (mWXSDKInstance != null) { - mWXSDKInstance!!.onActivityStop() - } - } - - override fun onBackPressed() { - super.onBackPressed() - } - - override fun onDestroy() { - super.onDestroy() - if (mWXSDKInstance != null) { - mWXSDKInstance!!.onActivityDestroy() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/adapter/CategoryAdapter.java b/app/src/main/java/com/yzx/webebook/adapter/CategoryAdapter.java deleted file mode 100644 index ce4c07d..0000000 --- a/app/src/main/java/com/yzx/webebook/adapter/CategoryAdapter.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.yzx.webebook.adapter; - -import android.view.View; -import android.view.ViewGroup; - -import com.yzx.webebook.adapter.base.EasyAdapter; -import com.yzx.webebook.adapter.base.IViewHolder; -import com.yzx.webebook.widget.page.TxtChapter; - - -/** - * Created by newbiechen on 17-6-5. - */ - -public class CategoryAdapter extends EasyAdapter { - private int currentSelected = 0; - @Override - protected IViewHolder onCreateViewHolder(int viewType) { - return new CategoryHolder(); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View view = super.getView(position, convertView, parent); - CategoryHolder holder = (CategoryHolder) view.getTag(); - - if (position == currentSelected){ - holder.setSelectedChapter(); - } - - return view; - } - - public void setChapter(int pos){ - currentSelected = pos; - notifyDataSetChanged(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/adapter/CategoryHolder.java b/app/src/main/java/com/yzx/webebook/adapter/CategoryHolder.java deleted file mode 100644 index eebdec3..0000000 --- a/app/src/main/java/com/yzx/webebook/adapter/CategoryHolder.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.yzx.webebook.adapter; - -import android.graphics.drawable.Drawable; -import android.widget.TextView; - -import androidx.core.content.ContextCompat; - -import com.yzx.webebook.R; -import com.yzx.webebook.adapter.base.ViewHolderImpl; -import com.yzx.webebook.utils.BookManager; -import com.yzx.webebook.widget.page.TxtChapter; - - -/** - * Created by newbiechen on 17-5-16. - */ - -public class CategoryHolder extends ViewHolderImpl { - - private TextView mTvChapter; - - @Override - public void initView() { - mTvChapter = findById(R.id.category_tv_chapter); - } - - @Override - public void onBind(TxtChapter value, int pos){ - //首先判断是否该章已下载 - Drawable drawable = null; - - //TODO:目录显示设计的有点不好,需要靠成员变量是否为null来判断。 - //如果没有链接地址表示是本地文件 - if (value.getLink() == null){ - drawable = ContextCompat.getDrawable(getContext(),R.drawable.selector_category_load); - } - else { - if (value.getBookId() != null - && BookManager - .isChapterCached(value.getBookId(),value.getTitle())){ - drawable = ContextCompat.getDrawable(getContext(),R.drawable.selector_category_load); - } - else { - drawable = ContextCompat.getDrawable(getContext(), R.drawable.selector_category_unload); - } - } - - mTvChapter.setSelected(false); - mTvChapter.setTextColor(ContextCompat.getColor(getContext(),R.color.nb_text_default)); - mTvChapter.setCompoundDrawablesWithIntrinsicBounds(drawable,null,null,null); - mTvChapter.setText(value.getTitle()); - } - - @Override - protected int getItemLayoutId() { - return R.layout.item_category; - } - - public void setSelectedChapter(){ - mTvChapter.setTextColor(ContextCompat.getColor(getContext(),R.color.light_red)); - mTvChapter.setSelected(true); - } -} diff --git a/app/src/main/java/com/yzx/webebook/adapter/ImageAdapter.kt b/app/src/main/java/com/yzx/webebook/adapter/ImageAdapter.kt deleted file mode 100644 index c9c2f1f..0000000 --- a/app/src/main/java/com/yzx/webebook/adapter/ImageAdapter.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.yzx.webebook.adapter - -import android.widget.ImageView -import com.bumptech.glide.Glide -import org.apache.weex.WXEnvironment -import org.apache.weex.adapter.IWXImgLoaderAdapter -import org.apache.weex.common.WXImageStrategy -import org.apache.weex.dom.WXImageQuality - -class ImageAdapter:IWXImgLoaderAdapter { - override fun setImage( - url: String?, - view: ImageView?, - quality: WXImageQuality?, - strategy: WXImageStrategy? - ) { - Glide.with(WXEnvironment.sApplication) - .load(url) - .into(view!!) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/adapter/PageStyleAdapter.java b/app/src/main/java/com/yzx/webebook/adapter/PageStyleAdapter.java deleted file mode 100644 index e11070b..0000000 --- a/app/src/main/java/com/yzx/webebook/adapter/PageStyleAdapter.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.yzx.webebook.adapter; - -import android.graphics.drawable.Drawable; -import android.view.View; - -import androidx.recyclerview.widget.RecyclerView; - -import com.yzx.webebook.adapter.base.BaseListAdapter; -import com.yzx.webebook.adapter.base.BaseViewHolder; -import com.yzx.webebook.adapter.base.IViewHolder; -import com.yzx.webebook.widget.page.PageStyle; - - -/** - * Created by newbiechen on 17-5-19. - */ - -public class PageStyleAdapter extends BaseListAdapter { - private int currentChecked; - - @Override - protected IViewHolder createViewHolder(int viewType) { - return new PageStyleHolder(); - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - super.onBindViewHolder(holder, position); - IViewHolder iHolder = ((BaseViewHolder) holder).holder; - PageStyleHolder pageStyleHolder = (PageStyleHolder) iHolder; - if (currentChecked == position){ - pageStyleHolder.setChecked(); - } - } - - public void setPageStyleChecked(PageStyle pageStyle){ - currentChecked = pageStyle.ordinal(); - } - - @Override - protected void onItemClick(View v, int pos) { - super.onItemClick(v, pos); - currentChecked = pos; - notifyDataSetChanged(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/adapter/PageStyleHolder.java b/app/src/main/java/com/yzx/webebook/adapter/PageStyleHolder.java deleted file mode 100644 index 2370596..0000000 --- a/app/src/main/java/com/yzx/webebook/adapter/PageStyleHolder.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.yzx.webebook.adapter; - -import android.graphics.drawable.Drawable; -import android.view.View; -import android.widget.ImageView; - -import com.yzx.webebook.R; -import com.yzx.webebook.adapter.base.ViewHolderImpl; - - -/** - * Created by newbiechen on 17-5-19. - */ - -public class PageStyleHolder extends ViewHolderImpl { - - private View mReadBg; - private ImageView mIvChecked; - - @Override - public void initView() { - mReadBg = findById(R.id.read_bg_view); - mIvChecked = findById(R.id.read_bg_iv_checked); - } - - @Override - public void onBind(Drawable data, int pos) { - mReadBg.setBackground(data); - mIvChecked.setVisibility(View.GONE); - } - - @Override - protected int getItemLayoutId() { - return R.layout.item_read_bg; - } - - public void setChecked(){ - mIvChecked.setVisibility(View.VISIBLE); - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/bean/AuthorBean.java b/app/src/main/java/com/yzx/webebook/model/bean/AuthorBean.java deleted file mode 100644 index 44569b5..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/AuthorBean.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.yzx.webebook.model.bean; - -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Generated; -import org.greenrobot.greendao.annotation.Id; - -/** - * Created by newbiechen on 17-4-20. - * 作者 - */ -@Entity -public class AuthorBean { - /** - * _id : 553136ba70feaa764a096f6f - * avatar : /avatar/26/eb/26ebf8ede76d7f52cd377960bd66383b - * nickname : 九歌 - * activityAvatar : - * type : normal - * lv : 8 - * gender : female - */ - @Id - private String _id; - - private String avatar; - private String nickname; - private String activityAvatar; - private String type; - private int lv; - private String gender; - - @Generated(hash = 1152582024) - public AuthorBean(String _id, String avatar, String nickname, - String activityAvatar, String type, int lv, String gender) { - this._id = _id; - this.avatar = avatar; - this.nickname = nickname; - this.activityAvatar = activityAvatar; - this.type = type; - this.lv = lv; - this.gender = gender; - } - - @Generated(hash = 1694633584) - public AuthorBean() { - } - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String getAvatar() { - return avatar; - } - - public void setAvatar(String avatar) { - this.avatar = avatar; - } - - public String getNickname() { - return nickname; - } - - public void setNickname(String nickname) { - this.nickname = nickname; - } - - public String getActivityAvatar() { - return activityAvatar; - } - - public void setActivityAvatar(String activityAvatar) { - this.activityAvatar = activityAvatar; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public int getLv() { - return lv; - } - - public void setLv(int lv) { - this.lv = lv; - } - - public String getGender() { - return gender; - } - - public void setGender(String gender) { - this.gender = gender; - } - - @Override - public String toString() { - return "AuthorBean{" + - "_id='" + _id + '\'' + - ", avatar='" + avatar + '\'' + - ", nickname='" + nickname + '\'' + - ", activityAvatar='" + activityAvatar + '\'' + - ", type='" + type + '\'' + - ", lv=" + lv + - ", gender='" + gender + '\'' + - '}'; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/model/bean/BookChapterBean.java b/app/src/main/java/com/yzx/webebook/model/bean/BookChapterBean.java deleted file mode 100644 index 009f9ad..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/BookChapterBean.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.yzx.webebook.model.bean; - -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Generated; -import org.greenrobot.greendao.annotation.Id; -import org.greenrobot.greendao.annotation.Index; - -import java.io.Serializable; - -/** - * Created by newbiechen on 17-5-10. - * 书的章节链接(作为下载的进度数据) - * 同时作为网络章节和本地章节 (没有找到更好分离两者的办法) - */ -@Entity -public class BookChapterBean implements Serializable{ - private static final long serialVersionUID = 56423411313L; - /** - * title : 第一章 他叫白小纯 - * link : http://read.qidian.com/chapter/rJgN8tJ_cVdRGoWu-UQg7Q2/6jr-buLIUJSaGfXRMrUjdw2 - * unreadble : false - */ - @Id - private String id; - - private String link; - - private String title; - - //所属的下载任务 - private String taskName; - - private boolean unreadble; - - //所属的书籍 - @Index - private String bookId; - - //本地书籍参数 - - - //在书籍文件中的起始位置 - private long start; - - //在书籍文件中的终止位置 - private long end; - - @Generated(hash = 1508543635) - public BookChapterBean(String id, String link, String title, String taskName, - boolean unreadble, String bookId, long start, long end) { - this.id = id; - this.link = link; - this.title = title; - this.taskName = taskName; - this.unreadble = unreadble; - this.bookId = bookId; - this.start = start; - this.end = end; - } - - @Generated(hash = 853839616) - public BookChapterBean() { - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getLink() { - return link; - } - - public void setLink(String link) { - this.link = link; - } - - public boolean isUnreadble() { - return unreadble; - } - - public void setUnreadble(boolean unreadble) { - this.unreadble = unreadble; - } - - public String getTaskName() { - return taskName; - } - - public void setTaskName(String taskName) { - this.taskName = taskName; - } - - public boolean getUnreadble() { - return this.unreadble; - } - - public String getBookId() { - return bookId; - } - - public void setBookId(String bookId) { - this.bookId = bookId; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public long getStart() { - return start; - } - - public void setStart(long start) { - this.start = start; - } - - public long getEnd() { - return end; - } - - public void setEnd(long end) { - this.end = end; - } - - @Override - public String toString() { - return "BookChapterBean{" + - "id='" + id + '\'' + - ", link='" + link + '\'' + - ", title='" + title + '\'' + - ", taskName='" + taskName + '\'' + - ", unreadble=" + unreadble + - ", bookId='" + bookId + '\'' + - ", start=" + start + - ", end=" + end + - '}'; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/model/bean/BookCount.java b/app/src/main/java/com/yzx/webebook/model/bean/BookCount.java deleted file mode 100644 index 96de437..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/BookCount.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.yzx.webebook.model.bean; - -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Id; -import org.greenrobot.greendao.annotation.Generated; - -@Entity -public class BookCount { - @Id - private String _id; // 本地书籍中,path 的 md5 值作为本地书籍的 id - private int total; - - @Generated(hash = 433479827) - public BookCount(String _id, int total) { - this._id = _id; - this.total = total; - } - - @Generated(hash = 2056164259) - public BookCount() { - } - - public int getTotal() { - return total; - } - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public void setTotal(int total) { - this.total = total; - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/bean/BookRecordBean.java b/app/src/main/java/com/yzx/webebook/model/bean/BookRecordBean.java deleted file mode 100644 index cea4632..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/BookRecordBean.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.yzx.webebook.model.bean; - -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Generated; -import org.greenrobot.greendao.annotation.Id; - -/** - * Created by newbiechen on 17-5-20. - */ -@Entity -public class BookRecordBean { - //所属的书的id - @Id - private String bookId; - //阅读到了第几章 - private int chapter; - //当前的页码 - private int pagePos; - - @Generated(hash = 340380968) - public BookRecordBean(String bookId, int chapter, int pagePos) { - this.bookId = bookId; - this.chapter = chapter; - this.pagePos = pagePos; - } - - @Generated(hash = 398068002) - public BookRecordBean() { - } - - public String getBookId() { - return bookId; - } - - public void setBookId(String bookId) { - this.bookId = bookId; - } - - public int getChapter() { - return chapter; - } - - public void setChapter(int chapter) { - this.chapter = chapter; - } - - public int getPagePos() { - return pagePos; - } - - public void setPagePos(int pagePos) { - this.pagePos = pagePos; - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/bean/ChapterInfoBean.java b/app/src/main/java/com/yzx/webebook/model/bean/ChapterInfoBean.java deleted file mode 100644 index 0b6f439..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/ChapterInfoBean.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.yzx.webebook.model.bean; - -/** - * Created by newbiechen on 17-5-10. - */ - -public class ChapterInfoBean { - /** - * title : 第一章 他叫白小纯 - * body : 帽儿山,位于东林山脉中,山下有一个村子,民风淳朴,以耕田为生,与世隔绝。 - 清晨,村庄的大门前,整个村子里的乡亲,正为一个十五六岁少年送别,这少年瘦弱,但却白白净净,看起来很是乖巧,衣着尽管是寻常的青衫,可却洗的泛白,穿在这少年的身上,与他目中的纯净搭配在一起,透出一股子灵动。 - 他叫白小纯。 - “父老乡亲们,我要去修仙了,可我舍不得你们啊。”少年满脸不舍,原本就乖巧的样子,此刻看起来更为纯朴。 - 四周的乡亲,面面相觑,顿时摆出难舍之色。 - “小纯,你爹娘走的早,你是个……好孩子!!难道你不想长生了么,成为仙人就可以长生,能活的很久很久,走吧,雏鹰长大,总有飞出去的那一天。”人群内走出一个头发花白的老者,说道好孩子三个字时,他顿了一下。 - “在外面遇到任何事情,都要坚持下去,走出村子,就不要回来,因为你的路在前方!”老人神色慈祥,拍了拍少年的肩膀。 - “长生……”白小纯身体一震,目中慢慢坚定起来,在老者以及四周乡亲鼓励的目光下,他重重的点了点头,深深的看了一眼四周的乡亲,转身迈着大步,渐渐走出了村子。 - 眼看少年的身影远去,村中的众人,一个个都激动起来,目中的难舍刹那就被喜悦代替,那之前满脸慈祥的老者,此刻也在颤抖,眼中流下泪水。 - “苍天有眼,这白鼠狼,他终于……终于走了,是谁告诉他在附近看到仙人的,你为村子立下了大功!” - “这白鼠狼终于肯离开了,可怜我家的几只鸡,就因为这白鼠狼怕鸡打鸣,不知用了什么方法,唆使一群孩子吃鸡肉,把全村的鸡都给吃的干干净净……” - “今天过年了!”欢呼之声,立刻在这不大的村子里,沸腾而起,甚至有人拿出了锣鼓,高兴的敲打起来。 - 村子外,白小纯还没等走远,他就听到了身后村子内,传出了敲锣打鼓的声音,还夹着欢呼。 - 白小纯脚步一顿,神色有些古怪,干咳一声,伴随着耳边传来的锣鼓,白小纯顺着山路,走上了帽儿山。 - 这帽儿山虽不高,却灌木杂多,虽是清晨,可看起来也是黑压压一片,很是安静。 - “听二狗说,他前几天在这里被一头野猪追赶时,看到天上有仙人飞过……”白小纯走在山路上,心脏怦怦跳动时,忽然一旁的灌林中传来阵阵哗哗声,似野猪一样,这声音来的突然,让本就紧张的白小纯,顿时背后发凉。 - “谁,谁在那里!”白小纯右手快速从行囊中拿出四把斧头,六把柴刀,还觉得不放心,又从怀里取出了一小根黑色的香,死死的抓住。 - “别出来,千万别出来,我有斧头,有柴刀,手里的香还可以召唤天雷,能引仙人降临,你敢出来,就劈死你!”白小纯哆嗦的大喊,连滚带爬的夹着那些武器,赶紧顺着山路跑去,沿途叮当乱响,斧头柴刀掉了一地。 - 或许是真的被他给吓住了,很快的哗哗声就消失,没有什么野兽跑出来,白小纯面色苍白,擦了擦冷汗,有心放弃继续上山,可一想到手中这根香是他爹娘去世前留给他的,据说是祖上曾偶然的救下一个落魄的仙人,那仙人离去时留下这根香作为报答,曾言会收下白家血脉一人为弟子,只要点燃,仙人就会到来。 - 可至今为止,这根香他点过十多次,始终不见仙人到来,让白小纯开始怀疑仙人是不是真的会来,这一次之所以下定决心,一方面是香所剩不多,另一方面是他听村子里人说,头几天在这看到有仙人从天上飞过。 - 所以他这才到来,想着距离仙人近一些,或许仙人就察觉到了也说不定。 - 踌躇一番,白小纯咬牙继续,好在此山不高,不久他气喘吁吁的到了山顶,站在那里,他遥望山下的村庄,神色颇为感慨,又低头看着手中的只有指甲盖大小的黑香,此香似乎被燃烧了好多次,所剩不多。 - “三年了,爹娘保佑我,这次一定要成功!”白小纯深吸口气,小心的将香点燃,立刻四周狂风顿起,天空更是眨眼间乌云密布,一道道闪电划过,还有震耳欲聋的雷鸣在白小纯耳边直接炸开。 - 声音之大,气势之强,让白小纯身体哆嗦,有种随时会被雷劈死的感觉,下意识的就想要吐口唾沫将那根香灭掉,但却挣扎忍住。 - “三年了,我点这根香点了十二次,这是第十三次,这次一定要忍住,小纯不怕,应该不会被劈死……”白小纯想起了这三年的经历,不算这次,点了十二次,每次都是这样的雷鸣闪电,仙人也没有到来,吓的本就怕死的他每次都吐口唾沫将其熄灭,说来也怪,这根香看似不凡,可实际上一样是浇水就灭。 - 在白小纯这里心惊肉跳,艰难的于那雷声中等待时,距离这里不远处的天空上,有一道长虹正急速的呼啸而来。 - 长虹内是一个中年男子,这男子衣着华丽,仙风道骨,可偏偏风尘仆仆,甚至仔细去看,可以看到他神色内深深的疲惫。 - “我倒要看看,到底是个什么样的人,竟然点根香点了三年!” - 一想到自己这三年的经历,中年男子就气恼,三年前他察觉有人点燃自己还是凝气时送出的香药,想起了当年在凡俗中的一段人情。 - 这才飞出寻来,原本按照他的打算,很快就会回来,可没成想,刚寻着香气过去,还没等多远,那气息就瞬间消失,断了联系。若是一次也就罢了,这三年,气息出现了十多次。 - 使得他这里,多次在寻找时中断,就这样来来回回,折腾了三年…… - 此刻他遥遥的看到了帽儿山,看到了山顶上白小纯,气不打一处来,一瞬飞出,直接就站在了山顶,大手一挥,那根所剩不多的香,直接熄灭。 - 雷声刹那消失,白小纯愣了一下,抬头一看,看到了自己的身边多了一个中年男子。 - “仙人?”白小纯小心翼翼的开口,有些拿不准,背后偷偷捡起一把斧头。 - “本座李青候,你是白家后人?”中年修士目光如电,无视白小纯身后的斧子,打量了白小纯一番,觉得眼前此子眉清目秀,依稀与当年的故人相似,资质也不错,心底的恼意,也不由缓了一些。 - “晚辈正是白家后人,白小纯。”白小纯眨了眨眼,小声说道,虽然心中有些畏惧,但还是挺了挺腰板。 - “我问你,点一根香,为什么点了三年!”中年修士淡淡开口,问出了他这三年里,最想要知道的问题。 - 白小纯听到这个问题,脑筋飞速转动,然后脸上摆出惆怅,遥望山下的村庄。 - “晚辈是一个重情重义的人,舍不得那些乡亲们,每一次我点燃香,他们也都不舍得我离去,如今山下的他们,还在因为我的离去而悲伤呢。” - 中年修士一愣,这个缘由,是他之前没想到的,目中的恼色又少了一些,单单从话语上看,此子的本性还是不错的。 - 可当他的目光落在山下的村子时,他的神识随之扫过,听到了村子里的敲锣打鼓以及那一句句欢呼白鼠狼离去的话语,面色立刻难看起来,有些头疼,看着眼前这个外表乖巧纯朴,人畜无害的白小纯,已心底明朗对方实际上一肚子坏水。 - “说实话!”中年修士一瞪眼,声音如同雷声一样,白小纯吓得一个哆嗦。 - “这不怨我啊,你那什么破香啊,每次点燃都会打雷,好几次都差点劈死我,我躲过了十三次,已经很不容易了。”白小纯可怜兮兮的说道。 - 中年修士看着白小纯,半晌无语。 - “既然你这么害怕,为什么还要强行去点香十多次?”中年修士缓缓开口。 - “我怕死啊,修仙不是能长生么,我想长生啊。”白小纯委屈的说道。 - 中年修士再次无语,不过觉得此子总算执念可嘉,扔到门派里磨炼一番,或可在性子上改变一二。 - 于是略一思索,大袖一甩卷着白小纯化作一道长虹,直奔天边而去。 - “跟我走吧。” - “去哪?这也太高了吧……”白小纯看到自己在天上飞,下面是万丈深渊,立刻脸色苍白,斧头一扔,死死的抱住仙人的大腿。 - 中年修士看了眼自己的腿,无奈开口。 - “灵溪宗。” - 兄弟姐妹们,阔别2个月,你们想不想我啊,我非常想你们! - 这本书,我做了详细的大纲,每次回顾大纲里的情节,都很兴奋,有种燃烧的感觉,我非常满意,明天,正式更新,依旧是中午一章,晚上一章! - 很兴奋,我们已沉寂了数月,如今归来,要……再战起点! - 新书期,兄弟姐妹,别忘了收藏与推荐啊,收藏与推荐至关重要! - 求收藏!!求推荐!! - 让众人知晓,我们……归来了! - 我们的目标,依旧是……点击榜,推荐榜,第一! - */ - - private String title; - private String body; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/bean/ChapterPageCount.java b/app/src/main/java/com/yzx/webebook/model/bean/ChapterPageCount.java deleted file mode 100644 index f5b48c3..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/ChapterPageCount.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yzx.webebook.model.bean; - -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Id; -import org.greenrobot.greendao.annotation.Generated; -import org.greenrobot.greendao.annotation.Index; - -@Entity -public class ChapterPageCount { - @Id - private String _id; // 本地书籍中,path 的 md5 值作为本地书籍的 id - private int total; - @Index - private String book_id; - - @Generated(hash = 774780221) - public ChapterPageCount(String _id, int total, String book_id) { - this._id = _id; - this.total = total; - this.book_id = book_id; - } - - @Generated(hash = 876465118) - public ChapterPageCount() { - } - - public void setTotal(int total) { - this.total = total; - } - - public void set_id(String _id) { - this._id = _id; - } - - public void setBook_id(String book_id) { - this.book_id = book_id; - } - - public int getTotal() { - return total; - } - - public String get_id() { - return _id; - } - - public String getBook_id() { - return book_id; - } - - -} diff --git a/app/src/main/java/com/yzx/webebook/model/bean/CollBookBean.java b/app/src/main/java/com/yzx/webebook/model/bean/CollBookBean.java deleted file mode 100644 index 8bd66ca..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/CollBookBean.java +++ /dev/null @@ -1,372 +0,0 @@ -package com.yzx.webebook.model.bean; - -import android.os.Parcel; -import android.os.Parcelable; - -import com.yzx.webebook.App; -import com.yzx.webebook.utils.StringUtils; - -import org.greenrobot.greendao.DaoException; -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Generated; -import org.greenrobot.greendao.annotation.Id; -import org.greenrobot.greendao.annotation.ToMany; - -import java.util.List; -import com.yzx.webebook.model.gen.DaoSession; -import com.yzx.webebook.model.gen.BookChapterBeanDao; -import com.yzx.webebook.model.gen.CollBookBeanDao; - -/** - * Created by newbiechen on 17-5-8. - * 收藏的书籍 - */ -@Entity -public class CollBookBean implements Parcelable{ - - public static final int STATUS_UNCACHE = 0; //未缓存 - public static final int STATUS_CACHING = 1; //正在缓存 - public static final int STATUS_CACHED = 2; //已经缓存 - /** - * _id : 53663ae356bdc93e49004474 - * title : 逍遥派 - * author : 白马出淤泥 - * shortIntro : 金庸武侠中有不少的神秘高手,书中或提起名字,或不曾提起,总之他们要么留下了绝世秘笈,要么就名震武林。 独孤九剑的创始者,独孤求败,他真的只创出九剑吗? 残本葵花... - * cover : /cover/149273897447137 - * hasCp : true - * latelyFollower : 60213 - * retentionRatio : 22.87 - * updated : 2017-05-07T18:24:34.720Z - * - * chaptersCount : 1660 - * lastChapter : 第1659章 朱长老 - */ - @Id - private String _id; // 本地书籍中,path 的 md5 值作为本地书籍的 id - private String title; - private String author; - private String shortIntro; - private String cover; // 在本地书籍中,该字段作为本地文件的路径 - private boolean hasCp; - private int latelyFollower; - private double retentionRatio; - //最新更新日期 - private String updated; - //最新阅读日期 - private String lastRead; - private int chaptersCount; - private String lastChapter; - //是否更新或未阅读 - private boolean isUpdate = true; - //是否是本地文件 - private boolean isLocal = false; - - @ToMany(referencedJoinProperty = "bookId") - private List bookChapterList; - /** Used to resolve relations */ - @Generated(hash = 2040040024) - private transient DaoSession daoSession; - /** Used for active entity operations. */ - @Generated(hash = 1552163441) - private transient CollBookBeanDao myDao; - - @Generated(hash = 757968961) - public CollBookBean(String _id, String title, String author, String shortIntro, String cover, - boolean hasCp, int latelyFollower, double retentionRatio, String updated, String lastRead, - int chaptersCount, String lastChapter, boolean isUpdate, boolean isLocal) { - this._id = _id; - this.title = title; - this.author = author; - this.shortIntro = shortIntro; - this.cover = cover; - this.hasCp = hasCp; - this.latelyFollower = latelyFollower; - this.retentionRatio = retentionRatio; - this.updated = updated; - this.lastRead = lastRead; - this.chaptersCount = chaptersCount; - this.lastChapter = lastChapter; - this.isUpdate = isUpdate; - this.isLocal = isLocal; - } - - public CollBookBean() { - } - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String getTitle() { - return StringUtils.convertCC(title, App.Companion.getContext()); - } - - public void setTitle(String title) { - this.title = title; - } - - public String getAuthor() { - return StringUtils.convertCC(author, App.Companion.getContext()); - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getShortIntro() { - return StringUtils.convertCC(shortIntro, App.Companion.getContext()); - } - - public void setShortIntro(String shortIntro) { - this.shortIntro = shortIntro; - } - - public String getCover() { - return StringUtils.convertCC(cover, App.Companion.getContext()); - } - - public void setCover(String cover) { - this.cover = cover; - } - - public boolean isHasCp() { - return hasCp; - } - - public void setHasCp(boolean hasCp) { - this.hasCp = hasCp; - } - - public int getLatelyFollower() { - return latelyFollower; - } - - public void setLatelyFollower(int latelyFollower) { - this.latelyFollower = latelyFollower; - } - - public double getRetentionRatio() { - return retentionRatio; - } - - public void setRetentionRatio(double retentionRatio) { - this.retentionRatio = retentionRatio; - } - - public String getUpdated() { - return StringUtils.convertCC(updated, App.Companion.getContext()); - } - - public void setUpdated(String updated) { - this.updated = updated; - } - - public int getChaptersCount() { - return chaptersCount; - } - - public void setChaptersCount(int chaptersCount) { - this.chaptersCount = chaptersCount; - } - - public String getLastChapter() { - return StringUtils.convertCC(lastChapter, App.Companion.getContext()); - } - - public void setLastChapter(String lastChapter) { - this.lastChapter = lastChapter; - } - - public boolean isUpdate() { - return isUpdate; - } - - public void setUpdate(boolean update) { - isUpdate = update; - } - - public boolean getHasCp() { - return this.hasCp; - } - - public boolean getIsUpdate() { - return this.isUpdate; - } - - public void setIsUpdate(boolean isUpdate) { - this.isUpdate = isUpdate; - } - - public boolean isLocal() { - return isLocal; - } - - public void setLocal(boolean local) { - isLocal = local; - } - - public String getLastRead() { - return StringUtils.convertCC(lastRead, App.Companion.getContext()); - } - - public void setLastRead(String lastRead) { - this.lastRead = lastRead; - } - - public void setBookChapters(List beans){ - bookChapterList = beans; - for (BookChapterBean bean : bookChapterList){ - bean.setBookId(get_id()); - } - } - - public List getBookChapters(){ - if (daoSession == null){ - return bookChapterList; - } - else { - return getBookChapterList(); - } - } - - /** - * To-many relationship, resolved on first access (and after reset). - * Changes to to-many relations are not persisted, make changes to the target entity. - */ - @Generated(hash = 711740787) - public List getBookChapterList() { - if (bookChapterList == null) { - final DaoSession daoSession = this.daoSession; - if (daoSession == null) { - throw new DaoException("Entity is detached from DAO context"); - } - BookChapterBeanDao targetDao = daoSession.getBookChapterBeanDao(); - List bookChapterListNew = targetDao - ._queryCollBookBean_BookChapterList(_id); - synchronized (this) { - if (bookChapterList == null) { - bookChapterList = bookChapterListNew; - } - } - } - return bookChapterList; - } - - - /** Resets a to-many relationship, making the next get call to query for a fresh result. */ - @Generated(hash = 1077762221) - public synchronized void resetBookChapterList() { - bookChapterList = null; - } - - - /** - * Convenient call for {@link org.greenrobot.greendao.AbstractDao#delete(Object)}. - * Entity must attached to an entity context. - */ - @Generated(hash = 128553479) - public void delete() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.delete(this); - } - - - /** - * Convenient call for {@link org.greenrobot.greendao.AbstractDao#refresh(Object)}. - * Entity must attached to an entity context. - */ - @Generated(hash = 1942392019) - public void refresh() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.refresh(this); - } - - - /** - * Convenient call for {@link org.greenrobot.greendao.AbstractDao#update(Object)}. - * Entity must attached to an entity context. - */ - @Generated(hash = 713229351) - public void update() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.update(this); - } - - - public boolean getIsLocal() { - return this.isLocal; - } - - public void setIsLocal(boolean isLocal) { - this.isLocal = isLocal; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(this._id); - dest.writeString(this.title); - dest.writeString(this.author); - dest.writeString(this.shortIntro); - dest.writeString(this.cover); - dest.writeByte(this.hasCp ? (byte) 1 : (byte) 0); - dest.writeInt(this.latelyFollower); - dest.writeDouble(this.retentionRatio); - dest.writeString(this.updated); - dest.writeString(this.lastRead); - dest.writeInt(this.chaptersCount); - dest.writeString(this.lastChapter); - dest.writeByte(this.isUpdate ? (byte) 1 : (byte) 0); - dest.writeByte(this.isLocal ? (byte) 1 : (byte) 0); - } - - /** called by internal mechanisms, do not call yourself. */ - @Generated(hash = 159260324) - public void __setDaoSession(DaoSession daoSession) { - this.daoSession = daoSession; - myDao = daoSession != null ? daoSession.getCollBookBeanDao() : null; - } - - protected CollBookBean(Parcel in) { - this._id = in.readString(); - this.title = in.readString(); - this.author = in.readString(); - this.shortIntro = in.readString(); - this.cover = in.readString(); - this.hasCp = in.readByte() != 0; - this.latelyFollower = in.readInt(); - this.retentionRatio = in.readDouble(); - this.updated = in.readString(); - this.lastRead = in.readString(); - this.chaptersCount = in.readInt(); - this.lastChapter = in.readString(); - this.isUpdate = in.readByte() != 0; - this.isLocal = in.readByte() != 0; - } - - public static final Creator CREATOR = new Creator() { - @Override - public CollBookBean createFromParcel(Parcel source) { - return new CollBookBean(source); - } - - @Override - public CollBookBean[] newArray(int size) { - return new CollBookBean[size]; - } - }; -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/model/bean/CommentBean.java b/app/src/main/java/com/yzx/webebook/model/bean/CommentBean.java deleted file mode 100644 index 74b980e..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/CommentBean.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.yzx.webebook.model.bean; - -/** - * Created by newbiechen on 17-4-29. - */ - -public class CommentBean { - /** - * _id : 57fd69356b613e9d1e69febb - * content : 2000年 - * author : {"_id":"57b6794f138527405e83382c","avatar":"/avatar/bc/3f/bc3f0b58815e497b00dabb7a14476891","nickname":"孤独患者","activityAvatar":"","type":"normal","lv":6,"gender":"female"} - * floor : 7150 - * likeCount : 0 - * created : 2016-10-11T22:35:33.303Z - * replyTo : {"_id":"57caec937a142c2277757f2d","floor":7038,"author":{"_id":"576a96dd4cb19fa249303369","nickname":"刘"}} - */ - - private String _id; - private String content; - private AuthorBean author; - private int floor; - private int likeCount; - private String created; - private ReplyToBean replyTo; - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public AuthorBean getAuthor() { - return author; - } - - public void setAuthor(AuthorBean author) { - this.author = author; - } - - public int getFloor() { - return floor; - } - - public void setFloor(int floor) { - this.floor = floor; - } - - public int getLikeCount() { - return likeCount; - } - - public void setLikeCount(int likeCount) { - this.likeCount = likeCount; - } - - public String getCreated() { - return created; - } - - public void setCreated(String created) { - this.created = created; - } - - public ReplyToBean getReplyTo() { - return replyTo; - } - - public void setReplyTo(ReplyToBean replyTo) { - this.replyTo = replyTo; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/model/bean/DetailBean.java b/app/src/main/java/com/yzx/webebook/model/bean/DetailBean.java deleted file mode 100644 index 043b8a5..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/DetailBean.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.yzx.webebook.model.bean; - -import java.util.List; - -/** - * Created by newbiechen on 17-4-29. - */ - -public class DetailBean { - private T detail; - private List bestComments; - private List comments; - - public DetailBean(T details, List bestComments, List comments) { - this.detail = details; - this.bestComments = bestComments; - this.comments = comments; - } - - public T getDetail() { - return detail; - } - - public List getBestComments() { - return bestComments; - } - - public List getComments() { - return comments; - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/bean/DownloadTaskBean.java b/app/src/main/java/com/yzx/webebook/model/bean/DownloadTaskBean.java deleted file mode 100644 index d2eeb25..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/DownloadTaskBean.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.yzx.webebook.model.bean; - - -import org.greenrobot.greendao.DaoException; -import org.greenrobot.greendao.annotation.Entity; -import org.greenrobot.greendao.annotation.Generated; -import org.greenrobot.greendao.annotation.Id; -import org.greenrobot.greendao.annotation.ToMany; - -import java.util.List; -import com.yzx.webebook.model.gen.DaoSession; -import com.yzx.webebook.model.gen.BookChapterBeanDao; -import com.yzx.webebook.model.gen.DownloadTaskBeanDao; - -/** - * Created by newbiechen on 17-5-11. - */ -@Entity -public class DownloadTaskBean { - public static final int STATUS_LOADING = 1; - public static final int STATUS_WAIT = 2; - public static final int STATUS_PAUSE = 3; - public static final int STATUS_ERROR = 4; - public static final int STATUS_FINISH = 5; - - //任务名称 -> 名称唯一不重复 - @Id - private String taskName; - //所属的bookId(外健) - private String bookId; - - @ToMany(referencedJoinProperty = "taskName") - private List bookChapterList; - //章节的下载进度,默认为初始状态 - private int currentChapter = 0; - //最后的章节 - private int lastChapter = 0; - //状态:正在下载、下载完成、暂停、等待、下载错误。 - - private volatile int status = STATUS_WAIT; - //总大小 -> (完成之后才会赋值) - private long size = 0; - - /** Used to resolve relations */ - @Generated(hash = 2040040024) - private transient DaoSession daoSession; - /** Used for active entity operations. */ - @Generated(hash = 1584592296) - private transient DownloadTaskBeanDao myDao; - - @Generated(hash = 597395122) - public DownloadTaskBean(String taskName, String bookId, int currentChapter, int lastChapter, - int status, long size) { - this.taskName = taskName; - this.bookId = bookId; - this.currentChapter = currentChapter; - this.lastChapter = lastChapter; - this.status = status; - this.size = size; - } - - @Generated(hash = 2123101309) - public DownloadTaskBean() { - } - - public String getBookId() { - return bookId; - } - - public void setBookId(String bookId) { - this.bookId = bookId; - } - - public String getTaskName() { - return taskName; - } - - public void setTaskName(String taskName) { - this.taskName = taskName; - if (bookChapterList!=null){ - for (BookChapterBean bean : bookChapterList){ - bean.setTaskName(getTaskName()); - } - } - } - - /** - * To-many relationship, resolved on first access (and after reset). - * Changes to to-many relations are not persisted, make changes to the target entity. - */ - @Generated(hash = 389263273) - public List getBookChapterList() { - if (bookChapterList == null) { - final DaoSession daoSession = this.daoSession; - if (daoSession == null) { - throw new DaoException("Entity is detached from DAO context"); - } - BookChapterBeanDao targetDao = daoSession.getBookChapterBeanDao(); - List bookChapterListNew = targetDao - ._queryDownloadTaskBean_BookChapterList(taskName); - synchronized (this) { - if (bookChapterList == null) { - bookChapterList = bookChapterListNew; - } - } - } - return bookChapterList; - } - - /** - * 这才是真正的列表使用类。 - * - */ - public void setBookChapters(List beans){ - bookChapterList = beans; - for (BookChapterBean bean : bookChapterList){ - bean.setTaskName(getTaskName()); - } - } - - public List getBookChapters(){ - if (daoSession == null){ - return bookChapterList; - } - else { - return getBookChapterList(); - } - } - - public int getCurrentChapter() { - return currentChapter; - } - - public void setCurrentChapter(int current) { - this.currentChapter = current; - } - - public int getLastChapter() { - return lastChapter; - } - - public void setLastChapter(int lastChapter) { - this.lastChapter = lastChapter; - } - - //多线程访问的问题,所以需要同步机制 - public int getStatus() { - return status; - } - - public void setStatus(int status){ - this.status = status; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - /** Resets a to-many relationship, making the next get call to query for a fresh result. */ - @Generated(hash = 1077762221) - public synchronized void resetBookChapterList() { - bookChapterList = null; - } - - /** - * Convenient call for {@link org.greenrobot.greendao.AbstractDao#delete(Object)}. - * Entity must attached to an entity context. - */ - @Generated(hash = 128553479) - public void delete() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.delete(this); - } - - /** - * Convenient call for {@link org.greenrobot.greendao.AbstractDao#refresh(Object)}. - * Entity must attached to an entity context. - */ - @Generated(hash = 1942392019) - public void refresh() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.refresh(this); - } - - /** - * Convenient call for {@link org.greenrobot.greendao.AbstractDao#update(Object)}. - * Entity must attached to an entity context. - */ - @Generated(hash = 713229351) - public void update() { - if (myDao == null) { - throw new DaoException("Entity is detached from DAO context"); - } - myDao.update(this); - } - - /** called by internal mechanisms, do not call yourself. */ - @Generated(hash = 1923117869) - public void __setDaoSession(DaoSession daoSession) { - this.daoSession = daoSession; - myDao = daoSession != null ? daoSession.getDownloadTaskBeanDao() : null; - } - -} diff --git a/app/src/main/java/com/yzx/webebook/model/bean/ReplyToBean.java b/app/src/main/java/com/yzx/webebook/model/bean/ReplyToBean.java deleted file mode 100644 index a6ea344..0000000 --- a/app/src/main/java/com/yzx/webebook/model/bean/ReplyToBean.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.yzx.webebook.model.bean; - -/** - * Created by newbiechen on 17-4-29. - */ - -public class ReplyToBean { - /** - * _id : 57caec937a142c2277757f2d - * floor : 7038 - * author : {"_id":"576a96dd4cb19fa249303369","nickname":"刘"} - */ - - private String _id; - private int floor; - private ReplyAuthorBean author; - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public int getFloor() { - return floor; - } - - public void setFloor(int floor) { - this.floor = floor; - } - - public ReplyAuthorBean getAuthor() { - return author; - } - - public void setAuthor(ReplyAuthorBean author) { - this.author = author; - } - - public static class ReplyAuthorBean { - /** - * _id : 576a96dd4cb19fa249303369 - * nickname : 刘 - */ - - private String _id; - private String nickname; - - public String get_id() { - return _id; - } - - public void set_id(String _id) { - this._id = _id; - } - - public String getNickname() { - return nickname; - } - - public void setNickname(String nickname) { - this.nickname = nickname; - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/BookRepository.java b/app/src/main/java/com/yzx/webebook/model/local/BookRepository.java deleted file mode 100644 index de22da4..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/BookRepository.java +++ /dev/null @@ -1,276 +0,0 @@ -package com.yzx.webebook.model.local; - -import android.util.Log; - - -import com.yzx.webebook.model.bean.BookChapterBean; -import com.yzx.webebook.model.bean.BookRecordBean; -import com.yzx.webebook.model.bean.ChapterInfoBean; -import com.yzx.webebook.model.bean.CollBookBean; -import com.yzx.webebook.model.gen.BookChapterBeanDao; -import com.yzx.webebook.model.gen.BookRecordBeanDao; -import com.yzx.webebook.model.gen.CollBookBeanDao; -import com.yzx.webebook.model.gen.DaoSession; -import com.yzx.webebook.model.gen.DownloadTaskBeanDao; -import com.yzx.webebook.utils.BookManager; -import com.yzx.webebook.utils.Constant; -import com.yzx.webebook.utils.FileUtils; -import com.yzx.webebook.utils.IOUtils; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Reader; -import java.io.Writer; -import java.util.List; - -import io.reactivex.Single; -import io.reactivex.SingleEmitter; -import io.reactivex.SingleOnSubscribe; - -/** - * Created by newbiechen on 17-5-8. - * 存储关于书籍内容的信息(CollBook(收藏书籍),BookChapter(书籍列表),ChapterInfo(书籍章节),BookRecord(记录)) - */ - -public class BookRepository { - private static final String TAG = "CollBookManager"; - private static volatile BookRepository sInstance; - private DaoSession mSession; - private CollBookBeanDao mCollBookDao; - private BookRepository(){ - mSession = DaoDbHelper.getInstance() - .getSession(); - mCollBookDao = mSession.getCollBookBeanDao(); - } - - public static BookRepository getInstance(){ - if (sInstance == null){ - synchronized (BookRepository.class){ - if (sInstance == null){ - sInstance = new BookRepository(); - } - } - } - return sInstance; - } - - //存储已收藏书籍 - public void saveCollBookWithAsync(CollBookBean bean){ - //启动异步存储 - mSession.startAsyncSession() - .runInTx( - () -> { - if (bean.getBookChapters() != null){ - // 存储BookChapterBean - mSession.getBookChapterBeanDao() - .insertOrReplaceInTx(bean.getBookChapters()); - } - //存储CollBook (确保先后顺序,否则出错) - mCollBookDao.insertOrReplace(bean); - } - ); - } - /** - * 异步存储。 - * 同时保存BookChapter - * @param beans - */ - public void saveCollBooksWithAsync(List beans){ - mSession.startAsyncSession() - .runInTx( - () -> { - for (CollBookBean bean : beans){ - if (bean.getBookChapters() != null){ - //存储BookChapterBean(需要修改,如果存在id相同的则无视) - mSession.getBookChapterBeanDao() - .insertOrReplaceInTx(bean.getBookChapters()); - } - } - //存储CollBook (确保先后顺序,否则出错) - mCollBookDao.insertOrReplaceInTx(beans); - } - ); - } - - public void saveCollBook(CollBookBean bean){ - mCollBookDao.insertOrReplace(bean); - } - - public void saveCollBooks(List beans){ - mCollBookDao.insertOrReplaceInTx(beans); - } - - /** - * 异步存储BookChapter - * @param beans - */ - public void saveBookChaptersWithAsync(List beans){ - mSession.startAsyncSession() - .runInTx( - () -> { - //存储BookChapterBean - mSession.getBookChapterBeanDao() - .insertOrReplaceInTx(beans); - Log.d(TAG, "saveBookChaptersWithAsync: "+"进行存储"); - } - ); - } - - /** - * 存储章节 - * @param folderName - * @param fileName - * @param content - */ - public void saveChapterInfo(String folderName,String fileName,String content){ - File file = BookManager.getBookFile(folderName, fileName); - //获取流并存储 - Writer writer = null; - try { - writer = new BufferedWriter(new FileWriter(file)); - writer.write(content); - writer.flush(); - } catch (IOException e) { - e.printStackTrace(); - IOUtils.close(writer); - } - } - - public void saveBookRecord(BookRecordBean bean){ - mSession.getBookRecordBeanDao() - .insertOrReplace(bean); - } - - /*****************************get************************************************/ - public CollBookBean getCollBook(String bookId){ - CollBookBean bean = mCollBookDao.queryBuilder() - .where(CollBookBeanDao.Properties._id.eq(bookId)) - .unique(); - return bean; - } - - - public List getCollBooks(){ - return mCollBookDao - .queryBuilder() - .orderDesc(CollBookBeanDao.Properties.LastRead) - .list(); - } - - - - //获取书籍列表 - public Single> getBookChaptersInRx(String bookId){ - return Single.create(new SingleOnSubscribe>() { - @Override - public void subscribe(SingleEmitter> e) throws Exception { - List beans = mSession - .getBookChapterBeanDao() - .queryBuilder() - .where(BookChapterBeanDao.Properties.BookId.eq(bookId)) - .list(); - e.onSuccess(beans); - } - }); - } - - //获取阅读记录 - public BookRecordBean getBookRecord(String bookId){ - return mSession.getBookRecordBeanDao() - .queryBuilder() - .where(BookRecordBeanDao.Properties.BookId.eq(bookId)) - .unique(); - } - - //TODO:需要进行获取编码并转换的问题 - public ChapterInfoBean getChapterInfoBean(String folderName, String fileName){ - File file = new File(Constant.BOOK_CACHE_PATH + folderName - + File.separator + fileName + FileUtils.SUFFIX_NB); - if (!file.exists()) return null; - Reader reader = null; - String str = null; - StringBuilder sb = new StringBuilder(); - try { - reader = new FileReader(file); - BufferedReader br = new BufferedReader(reader); - while ((str = br.readLine()) != null){ - sb.append(str); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - }finally { - IOUtils.close(reader); - } - - ChapterInfoBean bean = new ChapterInfoBean(); - bean.setTitle(fileName); - bean.setBody(sb.toString()); - return bean; - } - - /************************************************************/ - - /************************************************************/ - public Single deleteCollBookInRx(CollBookBean bean) { - return Single.create(new SingleOnSubscribe() { - @Override - public void subscribe(SingleEmitter e) throws Exception { - //查看文本中是否存在删除的数据 - deleteBook(bean.get_id()); - //删除任务 - deleteDownloadTask(bean.get_id()); - //删除目录 - deleteBookChapter(bean.get_id()); - //删除CollBook - mCollBookDao.delete(bean); - e.onSuccess(new Void()); - } - }); - } - - //这个需要用rx,进行删除 - public void deleteBookChapter(String bookId){ - mSession.getBookChapterBeanDao() - .queryBuilder() - .where(BookChapterBeanDao.Properties.BookId.eq(bookId)) - .buildDelete() - .executeDeleteWithoutDetachingEntities(); - } - - public void deleteCollBook(CollBookBean collBook){ - mCollBookDao.delete(collBook); - } - - //删除书籍 - public void deleteBook(String bookId){ - FileUtils.deleteFile(Constant.BOOK_CACHE_PATH+bookId); - } - - public void deleteBookRecord(String id){ - mSession.getBookRecordBeanDao() - .queryBuilder() - .where(BookRecordBeanDao.Properties.BookId.eq(id)) - .buildDelete() - .executeDeleteWithoutDetachingEntities(); - } - - //删除任务 - public void deleteDownloadTask(String bookId){ - mSession.getDownloadTaskBeanDao() - .queryBuilder() - .where(DownloadTaskBeanDao.Properties.BookId.eq(bookId)) - .buildDelete() - .executeDeleteWithoutDetachingEntities(); - } - - public DaoSession getSession(){ - return mSession; - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/DaoDbHelper.java b/app/src/main/java/com/yzx/webebook/model/local/DaoDbHelper.java deleted file mode 100644 index f8b80f8..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/DaoDbHelper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.yzx.webebook.model.local; - -import android.database.sqlite.SQLiteDatabase; - -import com.yzx.webebook.App; -import com.yzx.webebook.model.gen.DaoMaster; -import com.yzx.webebook.model.gen.DaoSession; - - -/** - * Created by newbiechen on 17-4-26. - */ - -public class DaoDbHelper { - private static final String DB_NAME = "IReader_DB"; - - private static volatile DaoDbHelper sInstance; - private SQLiteDatabase mDb; - private DaoMaster mDaoMaster; - private DaoSession mSession; - - private DaoDbHelper(){ - //封装数据库的创建、更新、删除 - DaoMaster.DevOpenHelper openHelper = new MyOpenHelper(App.Companion.getContext(),DB_NAME,null); - //获取数据库 - mDb = openHelper.getWritableDatabase(); - //封装数据库中表的创建、更新、删除 - mDaoMaster = new DaoMaster(mDb); //合起来就是对数据库的操作 - //对表操作的对象。 - mSession = mDaoMaster.newSession(); //可以认为是对数据的操作 - } - - - public static DaoDbHelper getInstance(){ - if (sInstance == null){ - synchronized (DaoDbHelper.class){ - if (sInstance == null){ - sInstance = new DaoDbHelper(); - } - } - } - return sInstance; - } - - public DaoSession getSession(){ - return mSession; - } - - public SQLiteDatabase getDatabase(){ - return mDb; - } - - public DaoSession getNewSession(){ - return mDaoMaster.newSession(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/DeleteDbHelper.java b/app/src/main/java/com/yzx/webebook/model/local/DeleteDbHelper.java deleted file mode 100644 index 7b7cc0e..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/DeleteDbHelper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.yzx.webebook.model.local; - - - -import com.yzx.webebook.model.bean.AuthorBean; - -import java.util.List; - -/** - * Created by newbiechen on 17-4-28. - */ - -public interface DeleteDbHelper { - void deleteAuthors(List beans); - void deleteAll(); -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/GetDbHelper.java b/app/src/main/java/com/yzx/webebook/model/local/GetDbHelper.java deleted file mode 100644 index 6f17938..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/GetDbHelper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.yzx.webebook.model.local; - - - -import com.yzx.webebook.model.bean.AuthorBean; -import com.yzx.webebook.model.bean.DownloadTaskBean; - -import java.util.List; - -import io.reactivex.Single; - -/** - * Created by newbiechen on 17-4-28. - */ - -public interface GetDbHelper { - - - AuthorBean getAuthor(String id); - - /******************************/ - List getDownloadTaskList(); -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/LocalRepository.java b/app/src/main/java/com/yzx/webebook/model/local/LocalRepository.java deleted file mode 100644 index a9c5ea7..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/LocalRepository.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.yzx.webebook.model.local; - - -import com.google.gson.Gson; -import com.yzx.webebook.model.bean.AuthorBean; -import com.yzx.webebook.model.bean.BookCount; -import com.yzx.webebook.model.bean.ChapterPageCount; -import com.yzx.webebook.model.bean.DownloadTaskBean; -import com.yzx.webebook.model.gen.BookCountDao; -import com.yzx.webebook.model.gen.ChapterPageCountDao; -import com.yzx.webebook.model.gen.DaoSession; - -import org.greenrobot.greendao.Property; -import org.greenrobot.greendao.query.Join; -import org.greenrobot.greendao.query.QueryBuilder; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.Single; -import io.reactivex.SingleEmitter; -import io.reactivex.SingleOnSubscribe; - -/** - * Created by newbiechen on 17-4-26. - */ - -public class LocalRepository implements SaveDbHelper,GetDbHelper,DeleteDbHelper{ - private static final String TAG = "LocalRepository"; - private static final String DISTILLATE_ALL = "normal"; - private static final String DISTILLATE_BOUTIQUES = "distillate"; - - private static volatile LocalRepository sInstance; - private DaoSession mSession; - private LocalRepository(){ - mSession = DaoDbHelper.getInstance().getSession(); - } - - public static LocalRepository getInstance(){ - if (sInstance == null){ - synchronized (LocalRepository.class){ - if (sInstance == null){ - sInstance = new LocalRepository(); - } - } - } - return sInstance; - } - - - @Override - public void deleteAuthors(List beans) { - - } - - @Override - public void deleteAll() { - //清空全部数据。 - } - - @Override - public AuthorBean getAuthor(String id) { - return null; - } - - @Override - public List getDownloadTaskList() { - return null; - } - - @Override - public void saveAuthors(List beans) { - - } - - @Override - public void saveDownloadTask(DownloadTaskBean bean) { - - } - - @Override - public void saveBookCount(BookCount bookCount) { - mSession.getBookCountDao().insertOrReplaceInTx(bookCount); - } - - @Override - public int getBookCount(String id) { - - BookCount list = mSession.getBookCountDao() - .queryBuilder() - .where(BookCountDao.Properties._id.eq(id)) - .unique(); - if(list!=null){ - return list.getTotal(); - } - return 0; - } - - @Override - public void saveChapterCount(List list) { - mSession.getChapterPageCountDao().insertOrReplaceInTx(list); - } - - @Override - public List getChapterCount(String book_id) { - List list = mSession.getChapterPageCountDao() - .queryBuilder() - .where(ChapterPageCountDao.Properties.Book_id.eq(book_id)) - .list(); - if(list!=null && list.size()>0){ - return list; - } - return new ArrayList(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/MyOpenHelper.java b/app/src/main/java/com/yzx/webebook/model/local/MyOpenHelper.java deleted file mode 100644 index 3fdf24a..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/MyOpenHelper.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.yzx.webebook.model.local; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; - - -import com.yzx.webebook.model.gen.DaoMaster; -import com.yzx.webebook.model.local.update.Update2Helper; - -import org.greenrobot.greendao.database.Database; - -/** - * Created by newbiechen on 2017/10/9. - */ - -public class MyOpenHelper extends DaoMaster.DevOpenHelper{ - public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { - super(context, name, factory); - } - - @Override - public void onUpgrade(Database db, int oldVersion, int newVersion) { - // 跨版本更新策略 - switch (oldVersion){ - case 1: - // 暂无 1.0 - case 2: - // 更新数据到 3.0 - Update2Helper.getInstance().update(db); - default: - break; - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/ReadSettingManager.java b/app/src/main/java/com/yzx/webebook/model/local/ReadSettingManager.java deleted file mode 100644 index 3e26a34..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/ReadSettingManager.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.yzx.webebook.model.local; - - -import com.yzx.webebook.utils.ScreenUtils; -import com.yzx.webebook.utils.SharedPreUtils; -import com.yzx.webebook.widget.page.PageMode; -import com.yzx.webebook.widget.page.PageStyle; - -/** - * Created by newbiechen on 17-5-17. - * 阅读器的配置管理 - */ - -public class ReadSettingManager { - /*************实在想不出什么好记的命名方式。。******************/ - public static final int READ_BG_DEFAULT = 0; - public static final int READ_BG_1 = 1; - public static final int READ_BG_2 = 2; - public static final int READ_BG_3 = 3; - public static final int READ_BG_4 = 4; - public static final int NIGHT_MODE = 5; - - public static final String SHARED_READ_BG = "shared_read_bg"; - public static final String SHARED_READ_BRIGHTNESS = "shared_read_brightness"; - public static final String SHARED_READ_IS_BRIGHTNESS_AUTO = "shared_read_is_brightness_auto"; - public static final String SHARED_READ_TEXT_SIZE = "shared_read_text_size"; - public static final String SHARED_READ_IS_TEXT_DEFAULT = "shared_read_text_default"; - public static final String SHARED_READ_PAGE_MODE = "shared_read_mode"; - public static final String SHARED_READ_NIGHT_MODE = "shared_night_mode"; - public static final String SHARED_READ_VOLUME_TURN_PAGE = "shared_read_volume_turn_page"; - public static final String SHARED_READ_FULL_SCREEN = "shared_read_full_screen"; - public static final String SHARED_READ_CONVERT_TYPE = "shared_read_convert_type"; - - private static volatile ReadSettingManager sInstance; - - private SharedPreUtils sharedPreUtils; - - public static ReadSettingManager getInstance() { - if (sInstance == null) { - synchronized (ReadSettingManager.class) { - if (sInstance == null) { - sInstance = new ReadSettingManager(); - } - } - } - return sInstance; - } - - private ReadSettingManager() { - sharedPreUtils = SharedPreUtils.getInstance(); - } - - public void setPageStyle(PageStyle pageStyle) { - sharedPreUtils.putInt(SHARED_READ_BG, pageStyle.ordinal()); - } - - public void setBrightness(int progress) { - sharedPreUtils.putInt(SHARED_READ_BRIGHTNESS, progress); - } - - public void setAutoBrightness(boolean isAuto) { - sharedPreUtils.putBoolean(SHARED_READ_IS_BRIGHTNESS_AUTO, isAuto); - } - - public void setDefaultTextSize(boolean isDefault) { - sharedPreUtils.putBoolean(SHARED_READ_IS_TEXT_DEFAULT, isDefault); - } - - public void setTextSize(int textSize) { - sharedPreUtils.putInt(SHARED_READ_TEXT_SIZE, textSize); - } - - public void setPageMode(PageMode mode) { - sharedPreUtils.putInt(SHARED_READ_PAGE_MODE, mode.ordinal()); - } - - public void setNightMode(boolean isNight) { - sharedPreUtils.putBoolean(SHARED_READ_NIGHT_MODE, isNight); - } - - public int getBrightness() { - return sharedPreUtils.getInt(SHARED_READ_BRIGHTNESS, 40); - } - - public boolean isBrightnessAuto() { - return sharedPreUtils.getBoolean(SHARED_READ_IS_BRIGHTNESS_AUTO, false); - } - - public int getTextSize() { - return sharedPreUtils.getInt(SHARED_READ_TEXT_SIZE, ScreenUtils.spToPx(28)); - } - - public boolean isDefaultTextSize() { - return sharedPreUtils.getBoolean(SHARED_READ_IS_TEXT_DEFAULT, false); - } - - public PageMode getPageMode() { - int mode = sharedPreUtils.getInt(SHARED_READ_PAGE_MODE, PageMode.NONE.ordinal()); - return PageMode.values()[mode]; - } - - public PageStyle getPageStyle() { - int style = sharedPreUtils.getInt(SHARED_READ_BG, PageStyle.BG_0.ordinal()); - return PageStyle.values()[style]; - } - - public boolean isNightMode() { - return sharedPreUtils.getBoolean(SHARED_READ_NIGHT_MODE, false); - } - - public void setVolumeTurnPage(boolean isTurn) { - sharedPreUtils.putBoolean(SHARED_READ_VOLUME_TURN_PAGE, isTurn); - } - - public boolean isVolumeTurnPage() { - return sharedPreUtils.getBoolean(SHARED_READ_VOLUME_TURN_PAGE, false); - } - - public void setFullScreen(boolean isFullScreen) { - sharedPreUtils.putBoolean(SHARED_READ_FULL_SCREEN, isFullScreen); - } - - public boolean isFullScreen() { - return sharedPreUtils.getBoolean(SHARED_READ_FULL_SCREEN, false); - } - - public void setConvertType(int convertType) { - sharedPreUtils.putInt(SHARED_READ_CONVERT_TYPE, convertType); - } - - public int getConvertType() { - return sharedPreUtils.getInt(SHARED_READ_CONVERT_TYPE, 0); - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/SaveDbHelper.java b/app/src/main/java/com/yzx/webebook/model/local/SaveDbHelper.java deleted file mode 100644 index 71f039b..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/SaveDbHelper.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.yzx.webebook.model.local; - - - -import com.yzx.webebook.model.bean.AuthorBean; -import com.yzx.webebook.model.bean.BookCount; -import com.yzx.webebook.model.bean.ChapterPageCount; -import com.yzx.webebook.model.bean.DownloadTaskBean; - -import java.util.List; - -/** - * Created by newbiechen on 17-4-28. - */ - -public interface SaveDbHelper { - void saveAuthors(List beans); - /*************DownloadTask*********************/ - void saveDownloadTask(DownloadTaskBean bean); - - void saveBookCount(BookCount bookCount); - - int getBookCount(String id); - - void saveChapterCount(List list); - - List getChapterCount(String book_id); -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/Void.java b/app/src/main/java/com/yzx/webebook/model/local/Void.java deleted file mode 100644 index 7e69b4d..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/Void.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.yzx.webebook.model.local; - -/** - * Created by newbiechen on 17-5-27. - */ - -public final class Void { -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/update/MigrationHelper.java b/app/src/main/java/com/yzx/webebook/model/local/update/MigrationHelper.java deleted file mode 100644 index 2823d3e..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/update/MigrationHelper.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.yzx.webebook.model.local.update; - -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - -import org.greenrobot.greendao.AbstractDao; -import org.greenrobot.greendao.database.Database; -import org.greenrobot.greendao.internal.DaoConfig; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Created by newbiechen on 2017/10/9. - * 数据库更新策略 - */ - -public class MigrationHelper { - - private static final String CONVERSION_CLASS_NOT_FOUND_EXCEPTION = "MIGRATION HELPER - CLASS DOESN'T MATCH WITH THE CURRENT PARAMETERS"; - private static MigrationHelper instance; - - public static MigrationHelper getInstance() { - if (instance == null) { - instance = new MigrationHelper(); - } - return instance; - } - - public void migrate(Database db, Class>... daoClasses) { - - generateTempTables(db, daoClasses); - deleteOriginalTables(db, daoClasses); - createOrignalTables(db, daoClasses); - restoreData(db, daoClasses); - } - - /** - * 生成临时列表 - * - * @param db - * @param daoClasses - */ - private void generateTempTables(Database db, Class>... daoClasses) { - for (int i = 0; i < daoClasses.length; i++) { - DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]); - - String divider = ""; - String tableName = daoConfig.tablename; - String tempTableName = daoConfig.tablename.concat("_TEMP"); - ArrayList properties = new ArrayList<>(); - - StringBuilder createTableStringBuilder = new StringBuilder(); - - createTableStringBuilder.append("CREATE TABLE ").append(tempTableName).append(" ("); - - for (int j = 0; j < daoConfig.properties.length; j++) { - String columnName = daoConfig.properties[j].columnName; - - if (getColumns(db, tableName).contains(columnName)) { - properties.add(columnName); - - String type = null; - - try { - type = getTypeByClass(daoConfig.properties[j].type); - } catch (Exception exception) { - exception.printStackTrace(); - } - - createTableStringBuilder.append(divider).append(columnName).append(" ").append(type); - - if (daoConfig.properties[j].primaryKey) { - createTableStringBuilder.append(" PRIMARY KEY"); - } - - divider = ","; - } - } - createTableStringBuilder.append(");"); - - db.execSQL(createTableStringBuilder.toString()); - - StringBuilder insertTableStringBuilder = new StringBuilder(); - - insertTableStringBuilder.append("INSERT INTO ").append(tempTableName).append(" ("); - insertTableStringBuilder.append(TextUtils.join(",", properties)); - insertTableStringBuilder.append(") SELECT "); - insertTableStringBuilder.append(TextUtils.join(",", properties)); - insertTableStringBuilder.append(" FROM ").append(tableName).append(";"); - - db.execSQL(insertTableStringBuilder.toString()); - - } - } - - - /** - * 通过反射,删除要更新的表 - */ - private void deleteOriginalTables(Database db, Class>... daoClasses) { - for (Class> daoClass : daoClasses) { - try { - Method method = daoClass.getMethod("dropTable", Database.class, boolean.class); - method.invoke(null, db, true); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - } - } - - /** - * 通过反射,重新创建要更新的表 - */ - private void createOrignalTables(Database db, Class>... daoClasses) { - for (Class> daoClass : daoClasses) { - try { - Method method = daoClass.getMethod("createTable", Database.class, boolean.class); - method.invoke(null, db, false); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - } - } - - /** - * 存储新的数据库表 以及数据 - * - * @param db - * @param daoClasses - */ - private void restoreData(Database db, Class>... daoClasses) { - for (int i = 0; i < daoClasses.length; i++) { - DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]); - String tableName = daoConfig.tablename; - String tempTableName = daoConfig.tablename.concat("_TEMP"); - ArrayList properties = new ArrayList(); - - for (int j = 0; j < daoConfig.properties.length; j++) { - String columnName = daoConfig.properties[j].columnName; - - if (getColumns(db, tempTableName).contains(columnName)) { - properties.add(columnName); - } - } - - StringBuilder insertTableStringBuilder = new StringBuilder(); - - insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" ("); - insertTableStringBuilder.append(TextUtils.join(",", properties)); - insertTableStringBuilder.append(") SELECT "); - insertTableStringBuilder.append(TextUtils.join(",", properties)); - insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";"); - - StringBuilder dropTableStringBuilder = new StringBuilder(); - dropTableStringBuilder.append("DROP TABLE ").append(tempTableName); - db.execSQL(insertTableStringBuilder.toString()); - db.execSQL(dropTableStringBuilder.toString()); - } - } - - private String getTypeByClass(Class type) throws Exception { - if (type.equals(String.class)) { - return "TEXT"; - } - if (type.equals(Long.class) || type.equals(Integer.class) || type.equals(long.class)) { - return "INTEGER"; - } - if (type.equals(Boolean.class)) { - return "BOOLEAN"; - } - - Exception exception = new Exception(CONVERSION_CLASS_NOT_FOUND_EXCEPTION.concat(" - Class: ").concat(type.toString())); - exception.printStackTrace(); - throw exception; - } - - private List getColumns(Database db, String tableName) { - List columns = new ArrayList<>(); - Cursor cursor = null; - try { - cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 1", null); - if (cursor != null) { - columns = new ArrayList<>(Arrays.asList(cursor.getColumnNames())); - } - } catch (Exception e) { - Log.v(tableName, e.getMessage(), e); - e.printStackTrace(); - } finally { - if (cursor != null) - cursor.close(); - } - return columns; - } -} diff --git a/app/src/main/java/com/yzx/webebook/model/local/update/Update2Helper.java b/app/src/main/java/com/yzx/webebook/model/local/update/Update2Helper.java deleted file mode 100644 index caf4e1a..0000000 --- a/app/src/main/java/com/yzx/webebook/model/local/update/Update2Helper.java +++ /dev/null @@ -1,284 +0,0 @@ -package com.yzx.webebook.model.local.update; - -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - - -import com.yzx.webebook.model.gen.BookChapterBeanDao; -import com.yzx.webebook.model.gen.CollBookBeanDao; -import com.yzx.webebook.utils.MD5Utils; - -import org.greenrobot.greendao.AbstractDao; -import org.greenrobot.greendao.database.Database; -import org.greenrobot.greendao.internal.DaoConfig; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Created by newbiechen on 2018/1/5. - * 由于 BookChapterBean 做了一次表的大更改,所以需要自定义更新。 - * 作用:将数据库2.0 升级到 3.0 - */ - -public class Update2Helper { - private static final String TAG = "BookChapterHelper"; - private static final String CONVERSION_CLASS_NOT_FOUND_EXCEPTION = "MIGRATION HELPER - CLASS DOESN'T MATCH WITH THE CURRENT PARAMETERS"; - - private static final String DIVIDER = ","; - private static final String QUOTE = "'%s'"; - - private static Update2Helper instance; - - public static Update2Helper getInstance() { - if (instance == null) { - instance = new Update2Helper(); - } - return instance; - } - - public void update(Database db) { - updateCollBook(db); - updateBookChapter(db); - } - - private void updateBookChapter(Database db) { - Class> bookChapterClass = BookChapterBeanDao.class; - - generateTempTables(db, bookChapterClass); - deleteOriginalTables(db, bookChapterClass); - createOrignalTables(db, bookChapterClass); - restoreData(db, bookChapterClass); - } - - private void updateCollBook(Database db) { - Class> collBookClass = CollBookBeanDao.class; - - // 遍历查找本地文件,然后修改本地文件的数据 - DaoConfig daoConfig = new DaoConfig(db, collBookClass); - String tableName = daoConfig.tablename; - - Cursor cursor = db.rawQuery("select _ID,IS_LOCAL from " + tableName, null); - String id = null; - String cover = null; - String isLocal = null; - - StringBuilder updateSb = new StringBuilder(); - while (cursor.moveToNext()) { - cover = cursor.getString(0); - id = MD5Utils.strToMd5By16(cover); - isLocal = cursor.getString(1); - - //如果是本地文件 - if (isLocal.equals("1")) { - // 数据更新 - updateSb.append("UPDATE " + tableName + " SET "); - updateSb.append("_ID=").append(String.format(QUOTE, id)).append(DIVIDER); - updateSb.append("COVER=").append(String.format(QUOTE, cover)).append(" "); - updateSb.append("WHERE _ID=").append(String.format(QUOTE,cover)).append(";"); - - db.execSQL(updateSb.toString()); - updateSb.delete(0, updateSb.length()); - } - } - } - - /** - * 生成临时列表 - * - * @param db - */ - private void generateTempTables(Database db, Class> bookChapterClass) { - // 解析 GreenDao,获取 table 名 - DaoConfig daoConfig = new DaoConfig(db, bookChapterClass); - String tableName = daoConfig.tablename; - - // 创建临时 table 名。 - String tempTableName = daoConfig.tablename.concat("_TEMP"); - ArrayList properties = new ArrayList<>(); - - StringBuilder createTableStringBuilder = new StringBuilder(); - createTableStringBuilder.append("CREATE TABLE ").append(tempTableName).append(" ("); - - // 新增的三个字段 - String ID = "ID"; - String START = "START"; - String END = "end"; - - - // 新建的 id 主键字段 - createTableStringBuilder.append(ID + " ").append("TEXT ").append("PRIMARY KEY"); - properties.add(ID); - - // 获取符合新表的旧字段。 - for (int j = 0; j < daoConfig.properties.length; j++) { - String columnName = daoConfig.properties[j].columnName; - if (getColumns(db, tableName).contains(columnName)) { - properties.add(columnName); - - String type = null; - - try { - type = getTypeByClass(daoConfig.properties[j].type); - } catch (Exception exception) { - exception.printStackTrace(); - } - - createTableStringBuilder.append(DIVIDER).append(columnName).append(" ").append(type); - } - } - - // 新建的 START,和 END 字段。 - createTableStringBuilder.append(DIVIDER).append(START).append(" ").append("INTEGER"); - createTableStringBuilder.append(DIVIDER).append(END).append(" ").append("INTEGER"); - - properties.add(START); - properties.add(END); - - createTableStringBuilder.append(");"); - // 创建临时数据表 - db.execSQL(createTableStringBuilder.toString()); - - StringBuilder insertTableStringBuilder = new StringBuilder(); - - // 将 link 字段的文件的内容转换成 Id - Cursor cursor = db.rawQuery("select * from " + daoConfig.tablename, null); - - String id = null; - String link = null; - String title = null; - String taskName = null; - String unreadble = null; - String bookId = null; - - while (cursor.moveToNext()) { - link = cursor.getString(0); - id = MD5Utils.strToMd5By16(link); - title = cursor.getString(1); - taskName = cursor.getString(2); - unreadble = cursor.getString(4); - bookId = cursor.getString(3); - - insertTableStringBuilder.append("INSERT INTO ").append(tempTableName).append(" ("); - insertTableStringBuilder.append(TextUtils.join(",", properties)); - insertTableStringBuilder.append(") VALUES ("); - insertTableStringBuilder.append(String.format(QUOTE, id)).append(DIVIDER); - insertTableStringBuilder.append(String.format(QUOTE, link)).append(DIVIDER); - insertTableStringBuilder.append(String.format(QUOTE, title)).append(DIVIDER); - insertTableStringBuilder.append(String.format(QUOTE, taskName)).append(DIVIDER); - insertTableStringBuilder.append(unreadble).append(DIVIDER); - insertTableStringBuilder.append(String.format(QUOTE, bookId)).append(DIVIDER); - insertTableStringBuilder.append("0").append(DIVIDER); - insertTableStringBuilder.append("0").append(");"); - - db.execSQL(insertTableStringBuilder.toString()); - - insertTableStringBuilder.delete(0, insertTableStringBuilder.length()); - } - } - - - /** - * 通过反射,删除要更新的表 - */ - private void deleteOriginalTables(Database db,Class> bookChapterClass) { - try { - Method method = bookChapterClass.getMethod("dropTable", Database.class, boolean.class); - method.invoke(null, db, true); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - } - - /** - * 通过反射,重新创建要更新的表 - */ - private void createOrignalTables(Database db,Class> bookChapterClass) { - try { - Method method = bookChapterClass.getMethod("createTable", Database.class, boolean.class); - method.invoke(null, db, false); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - } - - /** - * 存储新的数据库表 以及数据 - * - * @param db - */ - private void restoreData(Database db,Class> bookChapterClass) { - DaoConfig daoConfig = new DaoConfig(db, bookChapterClass); - String tableName = daoConfig.tablename; - String tempTableName = daoConfig.tablename.concat("_TEMP"); - ArrayList properties = new ArrayList(); - - for (int j = 0; j < daoConfig.properties.length; j++) { - String columnName = daoConfig.properties[j].columnName; - if (getColumns(db, tableName).contains(columnName)) { - properties.add(columnName); - } - } - - StringBuilder insertTableStringBuilder = new StringBuilder(); - - insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" ("); - insertTableStringBuilder.append(TextUtils.join(",", properties)); - insertTableStringBuilder.append(") SELECT "); - insertTableStringBuilder.append(TextUtils.join(",", properties)); - insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";"); - - Log.d(TAG, "restoreData: " + insertTableStringBuilder.toString()); - - StringBuilder dropTableStringBuilder = new StringBuilder(); - dropTableStringBuilder.append("DROP TABLE ").append(tempTableName); - db.execSQL(insertTableStringBuilder.toString()); - db.execSQL(dropTableStringBuilder.toString()); - } - - private String getTypeByClass(Class type) throws Exception { - if (type.equals(String.class)) { - return "TEXT"; - } - if (type.equals(Long.class) || type.equals(Integer.class) || type.equals(long.class)) { - return "INTEGER"; - } - if (type.equals(boolean.class)) { - return "BOOLEAN"; - } - - Exception exception = new Exception(CONVERSION_CLASS_NOT_FOUND_EXCEPTION.concat(" - Class: ").concat(type.toString())); - exception.printStackTrace(); - throw exception; - } - - private List getColumns(Database db, String tableName) { - List columns = new ArrayList<>(); - Cursor cursor = null; - try { - cursor = db.rawQuery("SELECT * FROM " + tableName + " limit 1", null); - if (cursor != null) { - columns = new ArrayList<>(Arrays.asList(cursor.getColumnNames())); - } - } catch (Exception e) { - Log.v(tableName, e.getMessage(), e); - e.printStackTrace(); - } finally { - if (cursor != null) - cursor.close(); - } - return columns; - } -} diff --git a/app/src/main/java/com/yzx/webebook/modules/ActivityWXModule.kt b/app/src/main/java/com/yzx/webebook/modules/ActivityWXModule.kt deleted file mode 100644 index 26d9429..0000000 --- a/app/src/main/java/com/yzx/webebook/modules/ActivityWXModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.yzx.webebook.modules - - -import android.widget.Toast -import com.yzx.webebook.activity.WeexTestActivity -import org.apache.weex.annotation.JSMethod -import org.apache.weex.common.WXModule -import org.jetbrains.anko.startActivity - - -class ActivityWXModule : WXModule() { - - @JSMethod(uiThread = true) - public fun navigateTo(url:String,params: String) { -// val intent = Intent(mWXSDKInstance.context, WeexTestActivity::class.java) -// intent.putExtra("url", url) -// intent.putExtra("params", params) - mWXSDKInstance.context.startActivity("url" to url,"params" to params) - } - - @JSMethod(uiThread = true) - public fun toast(msg: String?) { - Toast.makeText(mWXSDKInstance.context, msg, Toast.LENGTH_SHORT).show() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/presenter/ReadPresenter.java b/app/src/main/java/com/yzx/webebook/presenter/ReadPresenter.java deleted file mode 100644 index 883aa81..0000000 --- a/app/src/main/java/com/yzx/webebook/presenter/ReadPresenter.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.yzx.webebook.presenter; - -import android.util.Log; - -import com.blankj.utilcode.util.FileIOUtils; -import com.blankj.utilcode.util.FileUtils; -import com.blankj.utilcode.util.LogUtils; -import com.blankj.utilcode.util.TimeUtils; -import com.blankj.utilcode.util.ToastUtils; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import com.lzy.okgo.OkGo; -import com.lzy.okgo.callback.FileCallback; -import com.lzy.okgo.callback.StringCallback; -import com.lzy.okgo.model.HttpHeaders; -import com.lzy.okgo.model.Response; -import com.yzx.webebook.config.Config; -import com.yzx.webebook.model.BaseBean; -import com.yzx.webebook.model.Book; -import com.yzx.webebook.model.Sections; -import com.yzx.webebook.model.User; -import com.yzx.webebook.model.Volumes; -import com.yzx.webebook.model.bean.CollBookBean; -import com.yzx.webebook.model.local.BookRepository; -import com.yzx.webebook.presenter.base.BasePresenter; -import com.yzx.webebook.widget.page.TxtChapter; - -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class ReadPresenter extends BasePresenter { - static String NOTE_FOLDER_DIR = "/mnt/sdcard/ebook/book/"; - - public ReadPresenter(@NotNull ReadView view) { - super(view); - } - - public void getReadProgress(String bookId,String readTaskId){ - User user = User.Companion.getUser(); - String url = Config.INSTANCE.getBASE_URL() + "/parent/readTask/getBookWarehouseContent"; - HttpHeaders headers = new HttpHeaders(); - headers.put("phone", user.getPhone()); - headers.put("token", user.getToken()); - OkGo.post(url) - .tag(this) - .params("id", bookId) - .params("read_task_id", readTaskId) - .headers(headers) - .execute(new StringCallback() { - - @Override - public void onSuccess(Response response) { - Gson gson = new Gson(); - BaseBean bean = gson.fromJson(response.body(), new TypeToken>() { - }.getType()); - getMView().onProgressSuccess(bean.getData().getRead_progress()); - } - - @Override - public void onError(Response response) { - super.onError(response); - } - }); - } - - - public void loadCategory(String bookTaskId) { - User user = User.Companion.getUser(); - String localId = user.getUser_id() + "_" + bookTaskId; - CollBookBean collBook = BookRepository.getInstance().getCollBook(localId); - if (collBook != null) { - getMView().showCategory(localId); - } else { - String url = Config.INSTANCE.getBASE_URL() + "/parent/readTask/getBookWarehouseContent"; - HttpHeaders headers = new HttpHeaders(); - headers.put("phone", user.getPhone()); - headers.put("token", user.getToken()); - OkGo.post(url) - .tag(this) - .params("id", bookTaskId) - .headers(headers) - .execute(new StringCallback() { - - @Override - public void onSuccess(Response response) { - Log.d("ReadActivity", "onSuccess: " + response.body()); - Gson gson = new Gson(); - BaseBean bean = gson.fromJson(response.body(), new TypeToken>() { - }.getType()); - if ("txt".equals(bean.getData().getFile_type()) || "pdf".equals(bean.getData().getFile_type().toLowerCase())) { - downloadBook(bean.getData(), bookTaskId); - } else { - Book book = bean.getData(); - StringBuffer builder = new StringBuffer() ; - if (book.getVolumes().size() > 0) { - for (Volumes volume : book.getVolumes()) { - builder.append("----------"); - builder.append("\r\n"); - for (Sections section : volume.getSections()) { - builder.append(section.getTitle()); - builder.append("\r\n"); - builder.append(section.getContent()); - builder.append("\r\n"); - } - } - } - LogUtils.d(builder); - LogUtils.d(builder.toString()); - String filePath = NOTE_FOLDER_DIR + user.getUser_id() + "_" + bookTaskId + ".txt"; - boolean success = FileUtils.createOrExistsFile(filePath); - boolean whiteSuccess = FileIOUtils.writeFileFromString(new File(filePath),builder.toString()); - if(success && whiteSuccess){ - CollBookBean bookBean = new CollBookBean(); - String localId = user.getUser_id() + "_" + bookTaskId; - bookBean.set_id(localId); - bookBean.setAuthor(book.getAuthor()); - bookBean.setTitle(book.getBook_name()); - bookBean.setShortIntro(book.getRead_requires()); - bookBean.setLastChapter("开始阅读"); - bookBean.setUpdate(true); - bookBean.setIsLocal(true); - bookBean.setLastRead(TimeUtils.getNowString()); - bookBean.setUpdated(TimeUtils.getNowString()); - bookBean.setCover(filePath); - - List list = new ArrayList(); - list.add(bookBean); - BookRepository.getInstance() - .saveCollBooks(list); - getMView().showCategory(localId); - }else{ - ToastUtils.showLong("书籍信息读取失败!"); - } - } - } - - @Override - public void onError(Response response) { - super.onError(response); - } - }); - } - - - } - - private void downloadBook(Book data, String bookTaskId) { - User user = User.Companion.getUser(); - OkGo.get("https://" + data.getBook_file_identity() + ".oa.qbjjyyun.net/edufile/download?uniqueKey=" + data.getBook_file_id()) - .tag(this) - .execute(new FileCallback(NOTE_FOLDER_DIR, user.getUser_id() + "_" + data.getBook_name() + "." + data.getFile_type()) { - - @Override - public void onSuccess(Response response) { - File file = response.body(); - CollBookBean bookBean = new CollBookBean(); - String localId = user.getUser_id() + "_" + bookTaskId; - bookBean.set_id(localId); - bookBean.setAuthor(data.getAuthor()); - bookBean.setTitle(data.getBook_name()); - bookBean.setShortIntro(data.getRead_requires()); - bookBean.setLastChapter("开始阅读"); - bookBean.setUpdate(true); - bookBean.setIsLocal(true); - bookBean.setLastRead(TimeUtils.getNowString()); - bookBean.setUpdated(TimeUtils.getNowString()); - bookBean.setCover(file.getAbsolutePath()); - - List list = new ArrayList(); - list.add(bookBean); - BookRepository.getInstance() - .saveCollBooks(list); - - getMView().showCategory(localId); - } - }); - } - - public void loadChapter(String bookId, List bookChapterList) { - - } - - public void updateReadProgress(String bookId,String readTaskId,String progress){ - User user = User.Companion.getUser(); - String url = Config.INSTANCE.getBASE_URL() + "/parent/readTask/updateReadProgress"; - HttpHeaders headers = new HttpHeaders(); - headers.put("phone", user.getPhone()); - headers.put("token", user.getToken()); - OkGo.post(url) - .tag(this) - .params("id", bookId) - .params("read_task_id", readTaskId) - .params("read_progress", progress) - .headers(headers) - .execute(new StringCallback() { - - @Override - public void onSuccess(Response response) { - - } - - @Override - public void onError(Response response) { - super.onError(response); - } - }); - } -} diff --git a/app/src/main/java/com/yzx/webebook/presenter/ReadView.java b/app/src/main/java/com/yzx/webebook/presenter/ReadView.java deleted file mode 100644 index 21ba838..0000000 --- a/app/src/main/java/com/yzx/webebook/presenter/ReadView.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.yzx.webebook.presenter; - -import com.yzx.webebook.model.bean.BookChapterBean; -import com.yzx.webebook.presenter.base.IView; - -import java.util.List; - -public interface ReadView extends IView { - - - void showCategory(String localId); - void finishChapter(); - void errorChapter(); - void onProgressSuccess(float progress); -} diff --git a/app/src/main/java/com/yzx/webebook/utils/AppInstance.java b/app/src/main/java/com/yzx/webebook/utils/AppInstance.java deleted file mode 100644 index 2a0bad5..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/AppInstance.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.yzx.webebook.utils; - -import android.app.Application; - -public class AppInstance { - - private static Application sApplication; - - public static void init(Application application) { - sApplication = application; - } - - public static Application get() { - return sApplication; - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/BookManager.java b/app/src/main/java/com/yzx/webebook/utils/BookManager.java deleted file mode 100644 index f5dae5a..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/BookManager.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.yzx.webebook.utils; - - -import java.io.File; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.Map; - -/** - * Created by newbiechen on 17-5-20. - * 处理书籍的工具类,配合PageFactory使用 - * 已弃用, - */ - -public class BookManager{ - private static final String TAG = "BookManager"; - private String chapterName; - private String bookId; - private long chapterLen; - private long position; - private Map cacheMap = new HashMap<>(); - private static volatile BookManager sInstance; - - public static BookManager getInstance(){ - if (sInstance == null){ - synchronized (BookManager.class){ - if (sInstance == null){ - sInstance = new BookManager(); - } - } - } - return sInstance; - } - - public boolean openChapter(String bookId,String chapterName){ - return openChapter(bookId,chapterName,0); - } - - public boolean openChapter(String bookId,String chapterName,long position){ - //如果文件不存在,则打开失败 - File file = new File(Constant.BOOK_CACHE_PATH + bookId - + File.separator + chapterName + FileUtils.SUFFIX_NB); - if (!file.exists()){ - return false; - } - this.bookId = bookId; - this.chapterName = chapterName; - this.position = position; - createCache(); - return true; - } - - private void createCache(){ - //创建Cache - if (!cacheMap.containsKey(chapterName)){ - Cache cache = new Cache(); - File file = getBookFile(bookId, chapterName); - //TODO:数据加载默认utf-8(以后会增加判断),FileUtils采用Reader获取数据的,可能用byte会更好一点 - char[] array = FileUtils.getFileContent(file).toCharArray(); - WeakReference charReference = new WeakReference(array); - cache.size = array.length; - cache.data = charReference; - cacheMap.put(chapterName, cache); - - chapterLen = cache.size; - } - else { - chapterLen = cacheMap.get(chapterName).getSize(); - } - } - - public void setPosition(long position){ - this.position = position; - } - - public long getPosition(){ - return position; - } - - //获取上一段 - public String getPrevPara(){ - //首先判断是否Position已经达到起始位置,已经越界 - if (position < 0){ - return null; - } - - //初始化从后向前获取的起始点,终止点,文本 - int end = (int)position; - int begin = end; - char[] array = getContent(); - - while (begin >= 0) { //判断指针是否达到章节的起始位置 - char character = array[begin]; //获取当前指针下的字符 - - //判断当前字符是否为换行,如果为换行,就代表获取到了一个段落,并退出。 - //有可能发生初始指针指的就是换行符的情况。 - if ((character+"").equals("\n") && begin != end) { - position = begin; - //当当前指针指向换行符的时候向后退一步 - begin++; - break; - } - //向前进一步 - begin--; - } - //最后end获取到段落的起始点,begin是段落的终止点。 - - //当越界的时候,保证begin在章节内 - if (begin < 0){ - begin = 0;//在章节内 - position = -1; //越界 - } - int size = end+1 - begin; - return new String(array,begin,size); - } - - //获取下一段 - public String getNextPara(){ - //首先判断是否Position已经达到终点位置 - if (position >= chapterLen){ - return null; - } - - //初始化起始点,终止点。 - int begin = (int)position; - int end = begin; - char[] array = getContent(); - - while (end < chapterLen) { //判断指针是否在章节的末尾位置 - char character = array[end]; //获取当前指针下的字符 - //判断当前字符是否为换行,如果为换行,就代表获取到了一个段落,并退出。 - //有可能发生初始指针指的就是换行符的情况。 - //这里当遇到\n的时候,不需要回退 - if ((character+"").equals("\n") && begin != end){ - ++end;//指向下一字段 - position = end; - break; - } - //指向下一字段 - end++; - } - //所要获取的字段的长度 - int size = end - begin; - return new String(array,begin,size); - } - - //获取章节的内容 - public char[] getContent() { - if (cacheMap.size() == 0){ - return new char[1]; - } - char[] block = cacheMap.get(chapterName).getData().get(); - if (block == null) { - File file = getBookFile(bookId, chapterName); - block = FileUtils.getFileContent(file).toCharArray(); - Cache cache = cacheMap.get(chapterName); - cache.data = new WeakReference(block); - } - return block; - } - - public long getChapterLen(){ - return chapterLen; - } - - public void clear(){ - cacheMap.clear(); - position = 0; - chapterLen = 0; - } - - /** - * 创建或获取存储文件 - * @param folderName - * @param fileName - * @return - */ - public static File getBookFile(String folderName, String fileName){ - return FileUtils.getFile(Constant.BOOK_CACHE_PATH + folderName - + File.separator + fileName + FileUtils.SUFFIX_NB); - } - - public static long getBookSize(String folderName){ - return FileUtils.getDirSize(FileUtils - .getFolder(Constant.BOOK_CACHE_PATH + folderName)); - } - - /** - * 根据文件名判断是否被缓存过 (因为可能数据库显示被缓存过,但是文件中却没有的情况,所以需要根据文件判断是否被缓存 - * 过) - * @param folderName : bookId - * @param fileName: chapterName - * @return - */ - public static boolean isChapterCached(String folderName, String fileName){ - File file = new File(Constant.BOOK_CACHE_PATH + folderName - + File.separator + fileName + FileUtils.SUFFIX_NB); - return file.exists(); - } - - public class Cache { - private long size; - private WeakReference data; - - public WeakReference getData() { - return data; - } - - public void setData(WeakReference data) { - this.data = data; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/BrightnessUtils.java b/app/src/main/java/com/yzx/webebook/utils/BrightnessUtils.java deleted file mode 100644 index 7a3a415..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/BrightnessUtils.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.yzx.webebook.utils; - -import android.app.Activity; -import android.content.ContentResolver; -import android.provider.Settings; -import android.util.Log; -import android.view.WindowManager; - -/** - * Created by newbiechen on 17-5-19. - * 调节亮度的工具类 - */ - -public class BrightnessUtils { - private static final String TAG = "BrightnessUtils"; - - /** - * 判断是否开启了自动亮度调节 - */ - public static boolean isAutoBrightness(Activity activity) { - boolean isAuto = false; - try { - isAuto = Settings.System.getInt(activity.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS_MODE) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; - } catch (Settings.SettingNotFoundException e){ - e.printStackTrace(); - } - return isAuto; - } - - /** - * 获取屏幕的亮度 - * 系统亮度模式中,自动模式与手动模式获取到的系统亮度的值不同 - */ - public static int getScreenBrightness(Activity activity) { - if(isAutoBrightness(activity)){ - return getAutoScreenBrightness(activity); - }else{ - return getManualScreenBrightness(activity); - } - } - - /** - * 获取手动模式下的屏幕亮度 - * @return value:0~255 - */ - public static int getManualScreenBrightness(Activity activity) { - int nowBrightnessValue = 0; - ContentResolver resolver = activity.getContentResolver(); - try { - nowBrightnessValue = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS); - } catch (Exception e) { - e.printStackTrace(); - } - return nowBrightnessValue; - } - - /** - * 获取自动模式下的屏幕亮度 - * @return value:0~255 - */ - public static int getAutoScreenBrightness(Activity activity) { - float nowBrightnessValue = 0; - - //获取自动调节下的亮度范围在 0~1 之间 - ContentResolver resolver = activity.getContentResolver(); - try { - nowBrightnessValue = Settings.System.getFloat(resolver, Settings.System.SCREEN_BRIGHTNESS); - Log.d(TAG, "getAutoScreenBrightness: " + nowBrightnessValue); - } catch (Exception e) { - e.printStackTrace(); - } - //转换范围为 (0~255) - float fValue = nowBrightnessValue * 225.0f; - Log.d(TAG,"brightness: " + fValue); - return (int)fValue; - } - - /** - * 设置亮度:通过设置 Windows 的 screenBrightness 来修改当前 Windows 的亮度 - * lp.screenBrightness:参数范围为 0~1 - */ - public static void setBrightness(Activity activity, int brightness) { - try{ - WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); - //将 0~255 范围内的数据,转换为 0~1 - lp.screenBrightness = Float.valueOf(brightness) * (1f / 255f); - Log.d(TAG, "lp.screenBrightness == " + lp.screenBrightness); - activity.getWindow().setAttributes(lp); - }catch(Exception ex){ - ex.printStackTrace(); - } - } - - /** - * 获取当前系统的亮度 - * @param activity - */ - public static void setDefaultBrightness(Activity activity) { - try { - WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); - lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; - activity.getWindow().setAttributes(lp); - } catch (Exception ex) { - ex.printStackTrace(); - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/Charset.java b/app/src/main/java/com/yzx/webebook/utils/Charset.java deleted file mode 100644 index 961984e..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/Charset.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.yzx.webebook.utils; - -/** - * 编码类型 - */ -public enum Charset { - UTF8("UTF-8"), - UTF16LE("UTF-16LE"), - UTF16BE("UTF-16BE"), - GBK("GBK"); - - private String mName; - public static final byte BLANK = 0x0a; - - private Charset(String name) { - mName = name; - } - - public String getName() { - return mName; - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/Constant.java b/app/src/main/java/com/yzx/webebook/utils/Constant.java deleted file mode 100644 index 3483ca2..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/Constant.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.yzx.webebook.utils; - - -import androidx.annotation.StringDef; - -import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.HashMap; -import java.util.Map; - -/** - * Created by newbiechen on 17-4-16. - */ - -public class Constant { - /*SharedPreference*/ - public static final String SHARED_SEX = "sex"; - public static final String SHARED_SAVE_BOOK_SORT = "book_sort"; - public static final String SHARED_SAVE_BILLBOARD = "billboard"; - public static final String SHARED_CONVERT_TYPE = "convert_type"; - public static final String SEX_BOY = "boy"; - public static final String SEX_GIRL = "girl"; - - /*URL_BASE*/ - public static final String API_BASE_URL = "http://api.zhuishushenqi.com"; - public static final String IMG_BASE_URL = "http://statics.zhuishushenqi.com"; - //book type - public static final String BOOK_TYPE_COMMENT = "normal"; - public static final String BOOK_TYPE_VOTE = "vote"; - //book state - public static final String BOOK_STATE_NORMAL = "normal"; - public static final String BOOK_STATE_DISTILLATE = "distillate"; - //Book Date Convert Format - public static final String FORMAT_BOOK_DATE = "yyyy-MM-dd'T'HH:mm:ss"; - public static final String FORMAT_TIME = "HH:mm"; - public static final String FORMAT_FILE_DATE = "yyyy-MM-dd"; - //RxBus - public static final int MSG_SELECTOR = 1; - //BookCachePath (因为getCachePath引用了Context,所以必须是静态变量,不能够是静态常量) - public static String BOOK_CACHE_PATH = FileUtils.getCachePath()+File.separator - + "book_cache"+ File.separator ; - //文件阅读记录保存的路径 - public static String BOOK_RECORD_PATH = FileUtils.getCachePath() + File.separator - + "book_record" + File.separator; - - - //BookType - @StringDef({ - BookType.ALL, - BookType.XHQH, - BookType.WXXX, - BookType.DSYN, - BookType.LSJS, - BookType.YXJJ, - BookType.KHLY, - BookType.CYJK, - BookType.HMZC, - BookType.XDYQ, - BookType.GDYQ, - BookType.HXYQ, - BookType.DMTR - }) - @Retention(RetentionPolicy.SOURCE) - public @interface BookType { - String ALL = "all"; - - String XHQH = "xhqh"; - - String WXXX = "wxxx"; - - String DSYN = "dsyn"; - - String LSJS = "lsjs"; - - String YXJJ = "yxjj"; - String KHLY = "khly"; - String CYJK = "cyjk"; - String HMZC = "hmzc"; - String XDYQ = "xdyq"; - String GDYQ = "gdyq"; - String HXYQ = "hxyq"; - String DMTR = "dmtr"; - } - - public static Map bookType = new HashMap() {{ - put("qt", "其他"); - put(BookType.XHQH, "玄幻奇幻"); - put(BookType.WXXX, "武侠仙侠"); - put(BookType.DSYN, "都市异能"); - put(BookType.LSJS, "历史军事"); - put(BookType.YXJJ, "游戏竞技"); - put(BookType.KHLY, "科幻灵异"); - put(BookType.CYJK, "穿越架空"); - put(BookType.HMZC, "豪门总裁"); - put(BookType.XDYQ, "现代言情"); - put(BookType.GDYQ, "古代言情"); - put(BookType.HXYQ, "幻想言情"); - put(BookType.DMTR, "耽美同人"); - }}; -} diff --git a/app/src/main/java/com/yzx/webebook/utils/FileStack.java b/app/src/main/java/com/yzx/webebook/utils/FileStack.java deleted file mode 100644 index f2dbcc4..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/FileStack.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.yzx.webebook.utils; - -import java.io.File; -import java.util.List; - -/** - * Created by newbiechen on 17-5-28. - */ - -public class FileStack { - - private Node node = null; - private int count = 0; - - public void push(FileSnapshot fileSnapshot){ - if (fileSnapshot == null) return; - Node fileNode = new Node(); - fileNode.fileSnapshot = fileSnapshot; - fileNode.next = node; - node = fileNode; - ++count; - } - - public FileSnapshot pop(){ - Node fileNode = node; - if (fileNode == null) return null; - FileSnapshot fileSnapshot = fileNode.fileSnapshot; - node = fileNode.next; - --count; - return fileSnapshot; - } - - public int getSize(){ - return count; - } - - //节点 - public class Node { - FileSnapshot fileSnapshot; - Node next; - } - - //文件快照 - public static class FileSnapshot{ - public String filePath; - public List files; - public int scrollOffset; - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/FileUtils.java b/app/src/main/java/com/yzx/webebook/utils/FileUtils.java deleted file mode 100644 index a0ce216..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/FileUtils.java +++ /dev/null @@ -1,328 +0,0 @@ -package com.yzx.webebook.utils; - -import android.os.Environment; -import android.util.Log; - -import com.yzx.webebook.App; - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.io.Reader; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.Single; -import io.reactivex.SingleEmitter; -import io.reactivex.SingleOnSubscribe; - -/** - * Created by newbiechen on 17-5-11. - */ - -public class FileUtils { - //采用自己的格式去设置文件,防止文件被系统文件查询到 - public static final String SUFFIX_NB = ".nb"; - public static final String SUFFIX_TXT = ".txt"; - public static final String SUFFIX_EPUB = ".epub"; - public static final String SUFFIX_PDF = ".pdf"; - - //获取文件夹 - public static File getFolder(String filePath){ - File file = new File(filePath); - //如果文件夹不存在,就创建它 - if (!file.exists()){ - file.mkdirs(); - } - return file; - } - - //获取文件 - public static synchronized File getFile(String filePath){ - File file = new File(filePath); - try { - if (!file.exists()){ - //创建父类文件夹 - getFolder(file.getParent()); - //创建文件 - file.createNewFile(); - } - } catch (IOException e) { - e.printStackTrace(); - } - return file; - } - - //获取Cache文件夹 - public static String getCachePath(){ - if (isSdCardExist()){ - return App.Companion.getContext() - .getExternalCacheDir() - .getAbsolutePath(); - } - else{ - return App.Companion.getContext() - .getCacheDir() - .getAbsolutePath(); - } - } - - public static long getDirSize(File file){ - //判断文件是否存在 - if (file.exists()) { - //如果是目录则递归计算其内容的总大小 - if (file.isDirectory()) { - File[] children = file.listFiles(); - long size = 0; - for (File f : children) - size += getDirSize(f); - return size; - } else { - return file.length(); - } - } else { - return 0; - } - } - - public static String getFileSize(long size) { - if (size <= 0) return "0"; - final String[] units = new String[]{"b", "kb", "M", "G", "T"}; - //计算单位的,原理是利用lg,公式是 lg(1024^n) = nlg(1024),最后 nlg(1024)/lg(1024) = n。 - int digitGroups = (int) (Math.log10(size) / Math.log10(1024)); - //计算原理是,size/单位值。单位值指的是:比如说b = 1024,KB = 1024^2 - return new DecimalFormat("#,##0.##").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; - } - - /** - * 本来是获取File的内容的。但是为了解决文本缩进、换行的问题 - * 这个方法就是专门用来获取书籍的... - * - * 应该放在BookRepository中。。。 - * @param file - * @return - */ - public static String getFileContent(File file){ - Reader reader = null; - String str = null; - StringBuilder sb = new StringBuilder(); - try { - reader = new FileReader(file); - BufferedReader br = new BufferedReader(reader); - while ((str = br.readLine()) != null){ - //过滤空语句 - if (!str.equals("")){ - //由于sb会自动过滤\n,所以需要加上去 - sb.append(" "+str+"\n"); - } - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - }finally { - IOUtils.close(reader); - } - return sb.toString(); - } - - //判断是否挂载了SD卡 - public static boolean isSdCardExist(){ - if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ - return true; - } - return false; - } - - //递归删除文件夹下的数据 - public static synchronized void deleteFile(String filePath){ - File file = new File(filePath); - if (!file.exists()) return; - - if (file.isDirectory()){ - File[] files = file.listFiles(); - for (File subFile : files){ - String path = subFile.getPath(); - deleteFile(path); - } - } - //删除文件 - file.delete(); - } - - //由于递归的耗时问题,取巧只遍历内部三层 - - //获取txt文件 - public static List getTxtFiles(String filePath,int layer){ - List txtFiles = new ArrayList(); - File file = new File(filePath); - - //如果层级为 3,则直接返回 - if (layer == 3){ - return txtFiles; - } - - //获取文件夹 - File[] dirs = file.listFiles( - pathname -> { - if (pathname.isDirectory() && !pathname.getName().startsWith(".")) { - return true; - } - //获取txt文件 - else if(pathname.getName().endsWith(".txt")){ - txtFiles.add(pathname); - return false; - } - else{ - return false; - } - } - ); - //遍历文件夹 - for (File dir : dirs){ - //递归遍历txt文件 - txtFiles.addAll(getTxtFiles(dir.getPath(),layer + 1)); - } - return txtFiles; - } - - //由于遍历比较耗时 - public static Single> getSDTxtFile(){ - //外部存储卡路径 - String rootPath = Environment.getExternalStorageDirectory().getPath(); - return Single.create(new SingleOnSubscribe>() { - @Override - public void subscribe(SingleEmitter> e) throws Exception { - List files = getTxtFiles(rootPath,0); - e.onSuccess(files); - } - }); - } - - //获取文件的编码格式 - public static Charset getCharset(String fileName) { - BufferedInputStream bis = null; - Charset charset = Charset.GBK; - byte[] first3Bytes = new byte[3]; - try { - boolean checked = false; - bis = new BufferedInputStream(new FileInputStream(fileName)); - bis.mark(0); - int read = bis.read(first3Bytes, 0, 3); - if (read == -1) - return charset; - if (first3Bytes[0] == (byte) 0xEF - && first3Bytes[1] == (byte) 0xBB - && first3Bytes[2] == (byte) 0xBF) { - charset = Charset.UTF8; - checked = true; - } - /* - * 不支持 UTF16LE 和 UTF16BE - else if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) { - charset = Charset.UTF16LE; - checked = true; - } else if (first3Bytes[0] == (byte) 0xFE - && first3Bytes[1] == (byte) 0xFF) { - charset = Charset.UTF16BE; - checked = true; - } else */ - - bis.mark(0); - if (!checked) { - while ((read = bis.read()) != -1) { - if (read >= 0xF0) - break; - if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK - break; - if (0xC0 <= read && read <= 0xDF) { - read = bis.read(); - if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF) - // (0x80 - 0xBF),也可能在GB编码内 - continue; - else - break; - } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小 - read = bis.read(); - if (0x80 <= read && read <= 0xBF) { - read = bis.read(); - if (0x80 <= read && read <= 0xBF) { - charset = Charset.UTF8; - break; - } else - break; - } else - break; - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - IOUtils.close(bis); - } - return charset; - } - - // 将字符串写入到文本文件中 - public static String writeTxtToFile(String strcontent, String filePath, String fileName) { - //生成文件夹之后,再生成文件,不然会出错 - makeFilePath(filePath, fileName); - - String strFilePath = filePath + fileName; - // 每次写入时,都换行写 - String strContent = strcontent + "\r\n"; - try { - File file = new File(strFilePath); - if (!file.exists()) { - Log.d("TestFile", "Create the file:" + strFilePath); - file.getParentFile().mkdirs(); - file.createNewFile(); - } - RandomAccessFile raf = new RandomAccessFile(file, "rwd"); - raf.seek(file.length()); - raf.write(strContent.getBytes()); - raf.close(); - return strFilePath; - } catch (Exception e) { - Log.e("TestFile", "Error on write File:" + e); - return ""; - } - } - - //生成文件 - - public static File makeFilePath(String filePath, String fileName) { - File file = null; - makeRootDirectory(filePath); - try { - file = new File(filePath + fileName); - if (!file.exists()) { - file.createNewFile(); - } - } catch (Exception e) { - e.printStackTrace(); - } - return file; - } - -//生成文件夹 - - public static void makeRootDirectory(String filePath) { - File file = null; - try { - file = new File(filePath); - if (!file.exists()) { - file.mkdir(); - } - } catch (Exception e) { - Log.i("error:", e + ""); - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/GsonHelper.java b/app/src/main/java/com/yzx/webebook/utils/GsonHelper.java deleted file mode 100644 index af7c90d..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/GsonHelper.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.yzx.webebook.utils; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; - -import java.util.ArrayList; -import java.util.List; - - -/** - * Created by andrew on 2016/8/15 0015. - */ -public class GsonHelper { - - public static String toJson(Object src){ - try { - return new Gson().toJson(src); - } catch (Exception e){ - e.printStackTrace(); - } - return null; - } - - public static T fromJson(String json, Class clazz) { - try { - return new Gson().fromJson(json, clazz); - } catch (Exception e){ - e.printStackTrace(); - } - return null; - } - - public static List fromJsonArray(String json, Class clazz) { - try { - List lst = new ArrayList(); - JsonArray array = new JsonParser().parse(json).getAsJsonArray(); - for(final JsonElement elem : array){ - lst.add(new Gson().fromJson(elem, clazz)); - } - return lst; - } catch (Exception e){ - e.printStackTrace(); - } - return null; - } - - public static T fromJsonObject(String json, Class clazz) { - try { - JsonElement elem = new JsonParser().parse(json).getAsJsonObject(); - return new Gson().fromJson(elem, clazz); - } catch (Exception e){ - e.printStackTrace(); - } - return null; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/utils/IOUtils.java b/app/src/main/java/com/yzx/webebook/utils/IOUtils.java deleted file mode 100644 index adbb5dc..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/IOUtils.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.yzx.webebook.utils; - -import java.io.Closeable; -import java.io.IOException; - -/** - * Created by newbiechen on 17-5-11. - */ - -public class IOUtils { - - public static void close(Closeable closeable){ - if (closeable == null) return; - try { - closeable.close(); - } catch (IOException e) { - e.printStackTrace(); - //close error - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/KotlinX.kt b/app/src/main/java/com/yzx/webebook/utils/KotlinX.kt deleted file mode 100644 index 606d4d6..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/KotlinX.kt +++ /dev/null @@ -1,2 +0,0 @@ -package com.yzx.webebook.utils - diff --git a/app/src/main/java/com/yzx/webebook/utils/ListUtils.java b/app/src/main/java/com/yzx/webebook/utils/ListUtils.java deleted file mode 100644 index 7719fb5..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/ListUtils.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.yzx.webebook.utils; - -import android.text.TextUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * List Utils - * - * @author andrew 2015-9-2 - */ -public class ListUtils { - - /** default join separator **/ - public static final String DEFAULT_JOIN_SEPARATOR = ","; - - private ListUtils() { - throw new AssertionError(); - } - - /** - * get size of list - * - *
-     * getSize(null)   =   0;
-     * getSize({})     =   0;
-     * getSize({1})    =   1;
-     * 
- * - * @param - * @param sourceList - * @return if list is null or empty, return 0, else return {@link List#size()}. - */ - public static int getSize(List sourceList) { - return sourceList == null ? 0 : sourceList.size(); - } - - /** - * is null or its size is 0 - * - *
-     * isEmpty(null)   =   true;
-     * isEmpty({})     =   true;
-     * isEmpty({1})    =   false;
-     * 
- * - * @param - * @param sourceList - * @return if list is null or its size is 0, return true, else return false. - */ - public static boolean isEmpty(List sourceList) { - return (sourceList == null || sourceList.size() == 0); - } - - /** - * join list to string, separator is "," - * - *
-     * join(null)      =   "";
-     * join({})        =   "";
-     * join({a,b})     =   "a,b";
-     * 
- * - * @param list - * @return join list to string, separator is ",". if list is empty, return "" - */ - public static String join(List list) { - return join(list, DEFAULT_JOIN_SEPARATOR); - } - - /** - * join list to string - * - *
-     * join(null, '#')     =   "";
-     * join({}, '#')       =   "";
-     * join({a,b,c}, ' ')  =   "abc";
-     * join({a,b,c}, '#')  =   "a#b#c";
-     * 
- * - * @param list - * @param separator - * @return join list to string. if list is empty, return "" - */ - public static String join(List list, char separator) { - return join(list, new String(new char[] {separator})); - } - - /** - * join list to string. if separator is null, use {@link #DEFAULT_JOIN_SEPARATOR} - * - *
-     * join(null, "#")     =   "";
-     * join({}, "#$")      =   "";
-     * join({a,b,c}, null) =   "a,b,c";
-     * join({a,b,c}, "")   =   "abc";
-     * join({a,b,c}, "#")  =   "a#b#c";
-     * join({a,b,c}, "#$") =   "a#$b#$c";
-     * 
- * - * @param list - * @param separator - * @return join list to string with separator. if list is empty, return "" - */ - public static String join(List list, String separator) { - return list == null ? "" : TextUtils.join(separator, list); - } - - /** - * add distinct entry to list - * - * @param - * @param sourceList - * @param entry - * @return if entry already exist in sourceList, return false, else add it and return true. - */ - public static boolean addDistinctEntry(List sourceList, V entry) { - return (sourceList != null && !sourceList.contains(entry)) ? sourceList.add(entry) : false; - } - - /** - * add all distinct entry to list1 from list2 - * - * @param - * @param sourceList - * @param entryList - * @return the count of entries be added - */ - public static int addDistinctList(List sourceList, List entryList) { - if (sourceList == null || isEmpty(entryList)) { - return 0; - } - - int sourceCount = sourceList.size(); - for (V entry : entryList) { - if (!sourceList.contains(entry)) { - sourceList.add(entry); - } - } - return sourceList.size() - sourceCount; - } - - /** - * remove duplicate entries in list - * - * @param - * @param sourceList - * @return the count of entries be removed - */ - public static int distinctList(List sourceList) { - if (isEmpty(sourceList)) { - return 0; - } - - int sourceCount = sourceList.size(); - int sourceListSize = sourceList.size(); - for (int i = 0; i < sourceListSize; i++) { - for (int j = (i + 1); j < sourceListSize; j++) { - if (sourceList.get(i).equals(sourceList.get(j))) { - sourceList.remove(j); - sourceListSize = sourceList.size(); - j--; - } - } - } - return sourceCount - sourceList.size(); - } - - /** - * add not null entry to list - * - * @param sourceList - * @param value - * @return
    - *
  • if sourceList is null, return false
  • - *
  • if value is null, return false
  • - *
  • return {@link List#add(Object)}
  • - *
- */ - public static boolean addListNotNullValue(List sourceList, V value) { - return (sourceList != null && value != null) ? sourceList.add(value) : false; - } - - - /** - * invert list - * - * @param - * @param sourceList - * @return - */ - public static List invertList(List sourceList) { - if (isEmpty(sourceList)) { - return sourceList; - } - - List invertList = new ArrayList(sourceList.size()); - for (int i = sourceList.size() - 1; i >= 0; i--) { - invertList.add(sourceList.get(i)); - } - return invertList; - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/LogUtils.java b/app/src/main/java/com/yzx/webebook/utils/LogUtils.java deleted file mode 100644 index 3209f40..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/LogUtils.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.yzx.webebook.utils; - -import android.content.Context; -import android.os.Environment; -import android.util.Log; - -import com.yzx.webebook.App; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -/** - * Created by newbiechen on 17-4-27. - */ - -public class LogUtils { - private static Boolean LOG_SWITCH = true; // 日志文件总开关 - private static Boolean LOG_TO_FILE = false; // 日志写入文件开关 - private static String LOG_TAG = "IReader"; // 默认的tag - private static char LOG_TYPE = 'v';// 输入日志类型,v代表输出所有信息,w则只输出警告... - private static int LOG_SAVE_DAYS = 7;// sd卡中日志文件的最多保存天数 - - private final static SimpleDateFormat LOG_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 日志的输出格式 - private final static SimpleDateFormat FILE_SUFFIX = new SimpleDateFormat("yyyy-MM-dd");// 日志文件格式 - private static String LOG_FILE_PATH; // 日志文件保存路径 - private static String LOG_FILE_NAME;// 日志文件保存名称 - - public static void init(Context context) { // 在Application中初始化 - LOG_FILE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + App.Companion.getContext().getPackageName(); - LOG_FILE_NAME = "Log"; - } - - /**************************** - * Warn - *********************************/ - public static void w(Object msg) { - w(LOG_TAG, msg); - } - - public static void w(String tag, Object msg) { - w(tag, msg, null); - } - - public static void w(String tag, Object msg, Throwable tr) { - if (msg == null) return; - log(tag, msg.toString(), tr, 'w'); - } - - /*************************** - * Error - ********************************/ - public static void e(Object msg) { - e(LOG_TAG, msg); - } - - public static void e(String tag, Object msg) { - e(tag, msg, null); - } - - public static void e(String tag, Object msg, Throwable tr) { - if (msg == null) return; - log(tag, msg.toString(), tr, 'e'); - } - - /*************************** - * Debug - ********************************/ - public static void d(Object msg) { - d(LOG_TAG, msg); - } - - public static void d(String tag, Object msg) {// 调试信息 - d(tag, msg, null); - } - - public static void d(String tag, Object msg, Throwable tr) { - if (msg == null) return; - log(tag, msg.toString(), tr, 'd'); - } - - /**************************** - * Info - *********************************/ - public static void i(Object msg) { - i(LOG_TAG, msg); - } - - public static void i(String tag, Object msg) { - i(tag, msg, null); - } - - public static void i(String tag, Object msg, Throwable tr) { - if (msg == null) return; - log(tag, msg.toString(), tr, 'i'); - } - - /************************** - * Verbose - ********************************/ - public static void v(Object msg) { - v(LOG_TAG, msg); - } - - public static void v(String tag, Object msg) { - v(tag, msg, null); - } - - public static void v(String tag, Object msg, Throwable tr) { - if (msg == null) return; - log(tag, msg.toString(), tr, 'v'); - } - - /** - * 根据tag, msg和等级,输出日志 - * - * @param tag - * @param msg - * @param level - */ - private static void log(String tag, String msg, Throwable tr, char level) { - if (tag == null || msg == null || tr == null) return; - if (LOG_SWITCH) { - if ('e' == level && ('e' == LOG_TYPE || 'v' == LOG_TYPE)) { // 输出错误信息 - Log.e(tag, createMessage(msg), tr); - } else if ('w' == level && ('w' == LOG_TYPE || 'v' == LOG_TYPE)) { - Log.w(tag, createMessage(msg), tr); - } else if ('d' == level && ('d' == LOG_TYPE || 'v' == LOG_TYPE)) { - Log.d(tag, createMessage(msg), tr); - } else if ('i' == level && ('d' == LOG_TYPE || 'v' == LOG_TYPE)) { - Log.i(tag, createMessage(msg), tr); - } else { - Log.v(tag, createMessage(msg), tr); - } - if (LOG_TO_FILE) - log2File(String.valueOf(level), tag, msg + tr == null ? "" : "\n" + Log.getStackTraceString(tr)); - } - } - - private static String getFunctionName() { - StackTraceElement[] sts = Thread.currentThread().getStackTrace(); - if (sts == null) { - return null; - } - for (StackTraceElement st : sts) { - if (st.isNativeMethod()) { - continue; - } - if (st.getClassName().equals(Thread.class.getName())) { - continue; - } - if (st.getFileName().equals("LogUtils.java")) { - continue; - } - return "[" + Thread.currentThread().getName() + "(" - + Thread.currentThread().getId() + "): " + st.getFileName() - + ":" + st.getLineNumber() + "]"; - } - return null; - } - - private static String createMessage(String msg) { - String functionName = getFunctionName(); - String message = (functionName == null ? msg - : (functionName + " - " + msg)); - return message; - } - - /** - * 打开日志文件并写入日志 - * - * @return - **/ - private synchronized static void log2File(String mylogtype, String tag, String text) { - Date nowtime = new Date(); - String date = FILE_SUFFIX.format(nowtime); - String dateLogContent = LOG_FORMAT.format(nowtime) + ":" + mylogtype + ":" + tag + ":" + text; // 日志输出格式 - File destDir = new File(LOG_FILE_PATH); - if (!destDir.exists()) { - destDir.mkdirs(); - } - File file = new File(LOG_FILE_PATH, LOG_FILE_NAME + date); - try { - FileWriter filerWriter = new FileWriter(file, true); - BufferedWriter bufWriter = new BufferedWriter(filerWriter); - bufWriter.write(dateLogContent); - bufWriter.newLine(); - bufWriter.close(); - filerWriter.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * 删除指定的日志文件 - */ - public static void delFile() {// 删除日志文件 - String needDelFiel = FILE_SUFFIX.format(getDateBefore()); - File file = new File(LOG_FILE_PATH, needDelFiel + LOG_FILE_NAME); - if (file.exists()) { - file.delete(); - } - } - - /** - * 得到LOG_SAVE_DAYS天前的日期 - * - * @return - */ - private static Date getDateBefore() { - Date nowtime = new Date(); - Calendar now = Calendar.getInstance(); - now.setTime(nowtime); - now.set(Calendar.DATE, now.get(Calendar.DATE) - LOG_SAVE_DAYS); - return now.getTime(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/MD5Utils.java b/app/src/main/java/com/yzx/webebook/utils/MD5Utils.java deleted file mode 100644 index e85825d..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/MD5Utils.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.yzx.webebook.utils; - -/** - * Created by newbiechen on 2018/1/1. - */ - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -/** - *@Description: 将字符串转化为MD5 - */ - -public class MD5Utils { - - public static String strToMd5By32(String str){ - String reStr = null; - try { - MessageDigest md5 = MessageDigest.getInstance("MD5"); - byte[] bytes = md5.digest(str.getBytes()); - StringBuffer stringBuffer = new StringBuffer(); - for (byte b : bytes){ - int bt = b&0xff; - if (bt < 16){ - stringBuffer.append(0); - } - stringBuffer.append(Integer.toHexString(bt)); - } - reStr = stringBuffer.toString(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return reStr; - } - - public static String strToMd5By16(String str){ - String reStr = strToMd5By32(str); - if (reStr != null){ - reStr = reStr.substring(8, 24); - } - return reStr; - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/NetworkUtils.java b/app/src/main/java/com/yzx/webebook/utils/NetworkUtils.java deleted file mode 100644 index e755c2b..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/NetworkUtils.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.yzx.webebook.utils; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; - -import com.yzx.webebook.App; - -/** - * Created by newbiechen on 17-5-11. - */ - -public class NetworkUtils { - - - /** - * 获取活动网络信息 - * @return NetworkInfo - */ - public static NetworkInfo getNetworkInfo(){ - ConnectivityManager cm = (ConnectivityManager) App.Companion - .getContext() - .getSystemService(Context.CONNECTIVITY_SERVICE); - - return cm.getActiveNetworkInfo(); - } - - /** - * 网络是否可用 - * @return - */ - public static boolean isAvailable(){ - NetworkInfo info = getNetworkInfo(); - return info != null && info.isAvailable(); - } - - /** - * 网络是否连接 - * @return - */ - public static boolean isConnected(){ - NetworkInfo info = getNetworkInfo(); - return info != null && info.isConnected(); - } - - /** - * 判断wifi是否连接状态 - *

需添加权限 {@code }

- * - * @param context 上下文 - * @return {@code true}: 连接
{@code false}: 未连接 - */ - public static boolean isWifiConnected(Context context) { - ConnectivityManager cm = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - return cm != null && cm.getActiveNetworkInfo() != null - && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI; - } - - - -} diff --git a/app/src/main/java/com/yzx/webebook/utils/PermissionsChecker.java b/app/src/main/java/com/yzx/webebook/utils/PermissionsChecker.java deleted file mode 100644 index 0b276f2..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/PermissionsChecker.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.yzx.webebook.utils; - -import android.content.Context; -import android.content.pm.PackageManager; - -import androidx.core.content.ContextCompat; - -/** - * Created by newbiechen on 2017/10/8. - */ - -public class PermissionsChecker { - private final Context mContext; - - public PermissionsChecker(Context context) { - mContext = context.getApplicationContext(); - } - - // 判断权限集合 - public boolean lacksPermissions(String... permissions) { - for (String permission : permissions) { - if (lacksPermission(permission)) { - return true; - } - } - return false; - } - - // 判断是否缺少权限 - private boolean lacksPermission(String permission) { - return ContextCompat.checkSelfPermission(mContext, permission) == - PackageManager.PERMISSION_DENIED; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/webebook/utils/RxUtils.java b/app/src/main/java/com/yzx/webebook/utils/RxUtils.java deleted file mode 100644 index dc4e16f..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/RxUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.yzx.webebook.utils; - - - -import com.yzx.webebook.model.bean.CommentBean; -import com.yzx.webebook.model.bean.DetailBean; - -import java.util.List; - -import io.reactivex.Observable; -import io.reactivex.ObservableSource; -import io.reactivex.Single; -import io.reactivex.SingleSource; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.functions.Function3; -import io.reactivex.schedulers.Schedulers; - -/** - * Created by newbiechen on 17-4-29. - */ - -public class RxUtils { - - public static SingleSource toSimpleSingle(Single upstream){ - return upstream.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } - - public static ObservableSource toSimpleSingle(Observable upstream){ - return upstream.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); - } - - public static TwoTuple twoTuple(T first,R second){ - return new TwoTuple(first, second); - } - - public static Single> toCommentDetail(Single detailSingle, - Single> bestCommentsSingle, - Single> commentsSingle){ - return Single.zip(detailSingle, bestCommentsSingle, commentsSingle, - new Function3, List, DetailBean>() { - @Override - public DetailBean apply(T t, List commentBeen, - List commentBeen2) throws Exception { - return new DetailBean(t,commentBeen,commentBeen2); - } - }); - } - - public static class TwoTuple { - public final A first; - public final B second; - - public TwoTuple(A a, B b) { - this.first = a; - this.second = b; - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/ScreenUtils.java b/app/src/main/java/com/yzx/webebook/utils/ScreenUtils.java deleted file mode 100644 index 67f1b73..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/ScreenUtils.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.yzx.webebook.utils; - -import android.content.res.Resources; -import android.util.DisplayMetrics; -import android.util.TypedValue; -import android.view.View; - -import androidx.appcompat.app.AppCompatActivity; - -import com.yzx.webebook.App; - -import java.lang.reflect.Method; - -/** - * Created by newbiechen on 17-5-1. - */ - -public class ScreenUtils { - - public static int dpToPx(int dp) { - DisplayMetrics metrics = getDisplayMetrics(); - return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics); - } - - public static int pxToDp(int px) { - DisplayMetrics metrics = getDisplayMetrics(); - return (int) (px / metrics.density); - } - - public static int spToPx(int sp) { - DisplayMetrics metrics = getDisplayMetrics(); - return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, metrics); - } - - public static int pxToSp(int px) { - DisplayMetrics metrics = getDisplayMetrics(); - return (int) (px / metrics.scaledDensity); - } - - /** - * 获取手机显示App区域的大小(头部导航栏+ActionBar+根布局),不包括虚拟按钮 - * - * @return - */ - public static int[] getAppSize() { - int[] size = new int[2]; - DisplayMetrics metrics = getDisplayMetrics(); - size[0] = metrics.widthPixels; - size[1] = metrics.heightPixels; - return size; - } - - /** - * 获取整个手机屏幕的大小(包括虚拟按钮) - * 必须在onWindowFocus方法之后使用 - * - * @param activity - * @return - */ - public static int[] getScreenSize(AppCompatActivity activity) { - int[] size = new int[2]; - View decorView = activity.getWindow().getDecorView(); - size[0] = decorView.getWidth(); - size[1] = decorView.getHeight(); - return size; - } - - /** - * 获取导航栏的高度 - * - * @return - */ - public static int getStatusBarHeight() { - Resources resources = App.Companion.getContext().getResources(); - int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android"); - return resources.getDimensionPixelSize(resourceId); - } - - /** - * 获取虚拟按键的高度 - * - * @return - */ - public static int getNavigationBarHeight() { - int navigationBarHeight = 0; - Resources rs = App.Companion.getContext().getResources(); - int id = rs.getIdentifier("navigation_bar_height", "dimen", "android"); - if (id > 0 && hasNavigationBar()) { - navigationBarHeight = rs.getDimensionPixelSize(id); - } - return navigationBarHeight; - } - - /** - * 是否存在虚拟按键 - * - * @return - */ - private static boolean hasNavigationBar() { - boolean hasNavigationBar = false; - Resources rs = App.Companion.getContext().getResources(); - int id = rs.getIdentifier("config_showNavigationBar", "bool", "android"); - if (id > 0) { - hasNavigationBar = rs.getBoolean(id); - } - try { - Class systemPropertiesClass = Class.forName("android.os.SystemProperties"); - Method m = systemPropertiesClass.getMethod("get", String.class); - String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys"); - if ("1".equals(navBarOverride)) { - hasNavigationBar = false; - } else if ("0".equals(navBarOverride)) { - hasNavigationBar = true; - } - } catch (Exception e) { - } - return hasNavigationBar; - } - - public static DisplayMetrics getDisplayMetrics() { - DisplayMetrics metrics = App.Companion - .getContext() - .getResources() - .getDisplayMetrics(); - return metrics; - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/SharedPreUtils.java b/app/src/main/java/com/yzx/webebook/utils/SharedPreUtils.java deleted file mode 100644 index c46e24d..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/SharedPreUtils.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.yzx.webebook.utils; - -import android.content.Context; -import android.content.SharedPreferences; - -import com.yzx.webebook.App; - -/** - * Created by newbiechen on 17-4-16. - */ - -public class SharedPreUtils { - private static final String SHARED_NAME = "IReader_pref"; - private static SharedPreUtils sInstance; - private SharedPreferences sharedReadable; - private SharedPreferences.Editor sharedWritable; - - private SharedPreUtils(){ - sharedReadable = App.Companion.getContext() - .getSharedPreferences(SHARED_NAME, Context.MODE_MULTI_PROCESS); - sharedWritable = sharedReadable.edit(); - } - - public static SharedPreUtils getInstance(){ - if(sInstance == null){ - synchronized (SharedPreUtils.class){ - if (sInstance == null){ - sInstance = new SharedPreUtils(); - } - } - } - return sInstance; - } - - public String getString(String key){ - return sharedReadable.getString(key,""); - } - - public void putString(String key,String value){ - sharedWritable.putString(key,value); - sharedWritable.commit(); - } - - public void putInt(String key,int value){ - sharedWritable.putInt(key, value); - sharedWritable.commit(); - } - - public void putBoolean(String key,boolean value){ - sharedWritable.putBoolean(key, value); - sharedWritable.commit(); - } - - public int getInt(String key,int def){ - return sharedReadable.getInt(key, def); - } - - public boolean getBoolean(String key,boolean def){ - return sharedReadable.getBoolean(key, def); - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/StringUtils.java b/app/src/main/java/com/yzx/webebook/utils/StringUtils.java deleted file mode 100644 index 691b8f9..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/StringUtils.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.yzx.webebook.utils; - -import android.content.Context; - -import androidx.annotation.StringRes; - -import com.yzx.webebook.App; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -//import com.zqc.opencc.android.lib.ChineseConverter; -//import com.zqc.opencc.android.lib.ConversionType; - -/** - * Created by newbiechen on 17-4-22. - * 对文字操作的工具类 - */ - -public class StringUtils { - private static final String TAG = "StringUtils"; - private static final int HOUR_OF_DAY = 24; - private static final int DAY_OF_YESTERDAY = 2; - private static final int TIME_UNIT = 60; - - //将时间转换成日期 - public static String dateConvert(long time,String pattern){ - Date date = new Date(time); - SimpleDateFormat format = new SimpleDateFormat(pattern); - return format.format(date); - } - - //将日期转换成昨天、今天、明天 - public static String dateConvert(String source,String pattern){ - - DateFormat format = new SimpleDateFormat(pattern); - Calendar calendar = Calendar.getInstance(); - try { - Date date = format.parse(source); - long curTime = calendar.getTimeInMillis(); - calendar.setTime(date); - //将MISC 转换成 sec - long difSec = Math.abs((curTime - date.getTime())/1000); - long difMin = difSec/60; - long difHour = difMin/60; - long difDate = difHour/60; - int oldHour = calendar.get(Calendar.HOUR); - //如果没有时间 - if (oldHour == 0){ - //比日期:昨天今天和明天 - if (difDate == 0){ - return "今天"; - } - else if (difDate < DAY_OF_YESTERDAY){ - return "昨天"; - } - else { - DateFormat convertFormat = new SimpleDateFormat("yyyy-MM-dd"); - String value = convertFormat.format(date); - return value; - } - } - - if (difSec < TIME_UNIT){ - return difSec+"秒前"; - } - else if (difMin < TIME_UNIT){ - return difMin+"分钟前"; - } - else if (difHour < HOUR_OF_DAY){ - return difHour+"小时前"; - } - else if (difDate < DAY_OF_YESTERDAY){ - return "昨天"; - } - else { - DateFormat convertFormat = new SimpleDateFormat("yyyy-MM-dd"); - String value = convertFormat.format(date); - return value; - } - } catch (ParseException e) { - e.printStackTrace(); - } - return ""; - } - - public static String toFirstCapital(String str){ - return str.substring(0,1).toUpperCase()+str.substring(1); - } - - public static String getString(@StringRes int id){ - return App.Companion.getContext().getResources().getString(id); - } - - public static String getString(@StringRes int id, Object... formatArgs){ - return App.Companion.getContext().getResources().getString(id,formatArgs); - } - - /** - * 将文本中的半角字符,转换成全角字符 - * @param input - * @return - */ - public static String halfToFull(String input) - { - char[] c = input.toCharArray(); - for (int i = 0; i< c.length; i++) - { - if (c[i] == 32) //半角空格 - { - c[i] = (char) 12288; - continue; - } - //根据实际情况,过滤不需要转换的符号 - //if (c[i] == 46) //半角点号,不转换 - // continue; - - if (c[i]> 32 && c[i]< 127) //其他符号都转换为全角 - c[i] = (char) (c[i] + 65248); - } - return new String(c); - } - - //功能:字符串全角转换为半角 - public static String fullToHalf(String input) - { - char[] c = input.toCharArray(); - for (int i = 0; i< c.length; i++) - { - if (c[i] == 12288) //全角空格 - { - c[i] = (char) 32; - continue; - } - - if (c[i]> 65280&& c[i]< 65375) - c[i] = (char) (c[i] - 65248); - } - return new String(c); - } - - //繁簡轉換 - public static String convertCC(String input, Context context) - { -// ConversionType currentConversionType = ConversionType.S2TWP; -// int convertType = SharedPreUtils.getInstance().getInt(SHARED_READ_CONVERT_TYPE, 0); -// -// if (input.length() == 0) -// return ""; -// -// switch (convertType) { -// case 1: -// currentConversionType = ConversionType.TW2SP; -// break; -// case 2: -// currentConversionType = ConversionType.S2HK; -// break; -// case 3: -// currentConversionType = ConversionType.S2T; -// break; -// case 4: -// currentConversionType = ConversionType.S2TW; -// break; -// case 5: -// currentConversionType = ConversionType.S2TWP; -// break; -// case 6: -// currentConversionType = ConversionType.T2HK; -// break; -// case 7: -// currentConversionType = ConversionType.T2S; -// break; -// case 8: -// currentConversionType = ConversionType.T2TW; -// break; -// case 9: -// currentConversionType = ConversionType.TW2S; -// break; -// case 10: -// currentConversionType = ConversionType.HK2S; -// break; -// } - -// return (convertType != 0)?ChineseConverter.convert(input, currentConversionType, context):input; - return input; - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/SystemBarUtils.java b/app/src/main/java/com/yzx/webebook/utils/SystemBarUtils.java deleted file mode 100644 index db1baf8..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/SystemBarUtils.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.yzx.webebook.utils; - -import android.app.Activity; -import android.os.Build; -import android.view.View; -import android.view.WindowManager; - -/** - * Created by newbiechen on 17-5-16. - * 基于 Android 4.4 - * - * 主要参数说明: - * - * SYSTEM_UI_FLAG_FULLSCREEN : 隐藏StatusBar - * SYSTEM_UI_FLAG_HIDE_NAVIGATION : 隐藏NavigationBar - * SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: 视图扩展到StatusBar的位置,并且StatusBar不消失。 - * 这里需要一些处理,一般是将StatusBar设置为全透明或者半透明。之后还需要使用fitSystemWindows=防止视图扩展到Status - * Bar上面(会在StatusBar上加一层View,该View可被移动) - * SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION: 视图扩展到NavigationBar的位置 - * SYSTEM_UI_FLAG_LAYOUT_STABLE:稳定效果 - * SYSTEM_UI_FLAG_IMMERSIVE_STICKY:保证点击任意位置不会退出 - * - * 可设置特效说明: - * 1. 全屏特效 - * 2. 全屏点击不退出特效 - * 3. 注意在19 <=sdk <=21 时候,必须通过Window设置透明栏 - */ - -public class SystemBarUtils { - - private static final int UNSTABLE_STATUS = View.SYSTEM_UI_FLAG_FULLSCREEN; - private static final int UNSTABLE_NAV = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; - private static final int STABLE_STATUS = View.SYSTEM_UI_FLAG_FULLSCREEN | - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | - View.SYSTEM_UI_FLAG_LAYOUT_STABLE | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - private static final int STABLE_NAV = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_LAYOUT_STABLE | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - private static final int EXPAND_STATUS = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; - private static final int EXPAND_NAV = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; - - - //设置隐藏StatusBar(点击任意地方会恢复) - public static void hideUnStableStatusBar(Activity activity){ - //App全屏,隐藏StatusBar - setFlag(activity,UNSTABLE_STATUS); - } - - public static void showUnStableStatusBar(Activity activity){ - clearFlag(activity,UNSTABLE_STATUS); - } - - //隐藏NavigationBar(点击任意地方会恢复) - public static void hideUnStableNavBar(Activity activity){ - setFlag(activity,UNSTABLE_NAV); - } - - public static void showUnStableNavBar(Activity activity){ - clearFlag(activity,UNSTABLE_NAV); - } - - public static void hideStableStatusBar(Activity activity){ - //App全屏,隐藏StatusBar - setFlag(activity,STABLE_STATUS); - } - - public static void showStableStatusBar(Activity activity){ - clearFlag(activity,STABLE_STATUS); - } - - public static void hideStableNavBar(Activity activity){ - //App全屏,隐藏StatusBar - setFlag(activity,STABLE_NAV); - } - - public static void showStableNavBar(Activity activity){ - clearFlag(activity,STABLE_NAV); - } - - /** - * 视图扩充到StatusBar - */ - public static void expandStatusBar(Activity activity){ - setFlag(activity, EXPAND_STATUS); - } - - /** - * 视图扩充到NavBar - * @param activity - */ - public static void expandNavBar(Activity activity){ - setFlag(activity, EXPAND_NAV); - } - - public static void transparentStatusBar(Activity activity){ - if (Build.VERSION.SDK_INT >= 21){ - expandStatusBar(activity); - activity.getWindow() - .setStatusBarColor(activity.getResources().getColor(android.R.color.transparent)); - } - else if (Build.VERSION.SDK_INT >= 19){ - WindowManager.LayoutParams attrs = activity.getWindow().getAttributes(); - attrs.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | attrs.flags); - activity.getWindow().setAttributes(attrs); - } - } - - public static void transparentNavBar(Activity activity){ - if (Build.VERSION.SDK_INT >= 21){ - expandNavBar(activity); - //下面这个方法在sdk:21以上才有 - activity.getWindow() - .setNavigationBarColor(activity.getResources().getColor(android.R.color.transparent)); - } - } - - public static void setFlag(Activity activity, int flag){ - if (Build.VERSION.SDK_INT >= 19){ - View decorView = activity.getWindow().getDecorView(); - int option = decorView.getSystemUiVisibility() | flag; - decorView.setSystemUiVisibility(option); - } - } - - //取消flag - public static void clearFlag(Activity activity, int flag){ - if (Build.VERSION.SDK_INT >= 19){ - View decorView = activity.getWindow().getDecorView(); - int option = decorView.getSystemUiVisibility() & (~flag); - decorView.setSystemUiVisibility(option); - } - } - - public static void setToggleFlag(Activity activity, int option){ - if (Build.VERSION.SDK_INT >= 19){ - if (isFlagUsed(activity,option)){ - clearFlag(activity,option); - } - else { - setFlag(activity,option); - } - } - } - - /** - * @param activity - * @return flag是否已被使用 - */ - public static boolean isFlagUsed(Activity activity, int flag) { - int currentFlag = activity.getWindow().getDecorView().getSystemUiVisibility(); - if((currentFlag & flag) - == flag) { - return true; - }else { - return false; - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/ToastUtils.java b/app/src/main/java/com/yzx/webebook/utils/ToastUtils.java deleted file mode 100644 index 34dda93..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/ToastUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.yzx.webebook.utils; - -import android.widget.Toast; - -import com.yzx.webebook.App; - - -/** - * Created by newbiechen on 17-5-11. - */ - -public class ToastUtils { - - public static void show(String msg){ - Toast.makeText(App.Companion.getContext(), msg, Toast.LENGTH_SHORT).show(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/media/LoaderCreator.java b/app/src/main/java/com/yzx/webebook/utils/media/LoaderCreator.java deleted file mode 100644 index 6fd53c2..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/media/LoaderCreator.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.yzx.webebook.utils.media; - -import android.content.Context; -import android.os.Bundle; - -import androidx.loader.content.CursorLoader; - -/** - * Created by newbiechen on 2018/1/14. - */ - -public class LoaderCreator { - public static final int ALL_BOOK_FILE = 1; - - public static CursorLoader create(Context context, int id, Bundle bundle) { - LocalFileLoader loader = null; - switch (id){ - case ALL_BOOK_FILE: - loader = new LocalFileLoader(context); - break; - default: - loader = null; - break; - } - if (loader != null) { - return loader; - } - - throw new IllegalArgumentException("The id of Loader is invalid!"); - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/media/LocalFileLoader.java b/app/src/main/java/com/yzx/webebook/utils/media/LocalFileLoader.java deleted file mode 100644 index f7cde54..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/media/LocalFileLoader.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.yzx.webebook.utils.media; - -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.provider.MediaStore; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.loader.content.CursorLoader; - -import java.io.File; -import java.sql.Blob; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by newbiechen on 2018/1/14. - */ - -public class LocalFileLoader extends CursorLoader { - private static final String TAG = "LocalFileLoader"; - - private static final Uri FILE_URI = Uri.parse("content://media/external/file"); - private static final String SELECTION = MediaStore.Files.FileColumns.DATA + " like ?"; - private static final String SEARCH_TYPE = "%.txt"; - private static final String SORT_ORDER = MediaStore.Files.FileColumns.DISPLAY_NAME + " DESC"; - private static final String[] FILE_PROJECTION = { - MediaStore.Files.FileColumns.DATA, - MediaStore.Files.FileColumns.DISPLAY_NAME - }; - - public LocalFileLoader(Context context) { - super(context); - initLoader(); - } - - /** - * 为 Cursor 设置默认参数 - */ - private void initLoader() { - setUri(FILE_URI); - setProjection(FILE_PROJECTION); - setSelection(SELECTION); - setSelectionArgs(new String[]{SEARCH_TYPE}); - setSortOrder(SORT_ORDER); - } - - public void parseData(Cursor cursor, final MediaStoreHelper.MediaResultCallback resultCallback) { - List files = new ArrayList<>(); - // 判断是否存在数据 - if (cursor == null) { - // TODO:当媒体库没有数据的时候,需要做相应的处理 - // 暂时直接返回空数据 - resultCallback.onResultCallback(files); - return; - } - // 重复使用Loader时,需要重置cursor的position; - cursor.moveToPosition(-1); - while (cursor.moveToNext()) { - String path; - - path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)); - // 路径无效 - if (TextUtils.isEmpty(path)) { - continue; - } else { - File file = new File(path); - if (file.isDirectory() || !file.exists()){ - continue; - } - else { - files.add(file); - } - } - } - if (resultCallback != null) { - resultCallback.onResultCallback(files); - } - } - - /** - * 从Cursor中读取对应columnName的值 - * - * @param cursor - * @param columnName - * @param defaultValue - * @return 当columnName无效时返回默认值; - */ - protected Object getValueFromCursor(@NonNull Cursor cursor, String columnName, Object defaultValue) { - try { - int index = cursor.getColumnIndexOrThrow(columnName); - int type = cursor.getType(index); - switch (type) { - case Cursor.FIELD_TYPE_STRING: - // TO SOLVE:某些手机的数据库将数值类型存为String类型 - String value = cursor.getString(index); - try { - if (defaultValue instanceof String) { - return value; - } else if (defaultValue instanceof Long) { - return Long.valueOf(value); - } else if (defaultValue instanceof Integer) { - return Integer.valueOf(value); - } else if (defaultValue instanceof Double) { - return Double.valueOf(value); - } else if (defaultValue instanceof Float) { - return Float.valueOf(value); - } - } catch (NumberFormatException e) { - return defaultValue; - } - case Cursor.FIELD_TYPE_INTEGER: - if (defaultValue instanceof Long) { - return cursor.getLong(index); - } else if (defaultValue instanceof Integer) { - return cursor.getInt(index); - } - case Cursor.FIELD_TYPE_FLOAT: - if (defaultValue instanceof Float) { - return cursor.getFloat(index); - } else if (defaultValue instanceof Double) { - return cursor.getDouble(index); - } - case Cursor.FIELD_TYPE_BLOB: - if (defaultValue instanceof Blob) { - return cursor.getBlob(index); - } - case Cursor.FIELD_TYPE_NULL: - default: - return defaultValue; - } - } catch (IllegalArgumentException e) { - return defaultValue; - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/utils/media/MediaStoreHelper.java b/app/src/main/java/com/yzx/webebook/utils/media/MediaStoreHelper.java deleted file mode 100644 index 359b963..0000000 --- a/app/src/main/java/com/yzx/webebook/utils/media/MediaStoreHelper.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.yzx.webebook.utils.media; - -import android.content.Context; -import android.database.Cursor; -import android.os.Bundle; - -import androidx.fragment.app.FragmentActivity; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.Loader; - -import java.io.File; -import java.lang.ref.WeakReference; -import java.util.List; - -/** - * Created by newbiechen on 2018/1/14. - * 获取媒体库的数据。 - */ - -public class MediaStoreHelper { - - /** - * 获取媒体库中所有的书籍文件 - *

- * 暂时只支持 TXT - * - * @param activity - * @param resultCallback - */ - public static void getAllBookFile(FragmentActivity activity, MediaResultCallback resultCallback) { - // 将文件的获取处理交给 LoaderManager。 - activity.getSupportLoaderManager() - .initLoader(LoaderCreator.ALL_BOOK_FILE, null, new MediaLoaderCallbacks(activity, resultCallback)); - } - - public interface MediaResultCallback { - void onResultCallback(List files); - } - - /** - * Loader 回调处理 - */ - static class MediaLoaderCallbacks implements LoaderManager.LoaderCallbacks { - protected WeakReference mContext; - protected MediaResultCallback mResultCallback; - - public MediaLoaderCallbacks(Context context, MediaResultCallback resultCallback) { - mContext = new WeakReference<>(context); - mResultCallback = resultCallback; - } - - @Override - public Loader onCreateLoader(int id, Bundle args) { - return LoaderCreator.create(mContext.get(), id, args); - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - LocalFileLoader localFileLoader = (LocalFileLoader) loader; - localFileLoader.parseData(data, mResultCallback); - } - - @Override - public void onLoaderReset(Loader loader) { - } - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/EBookView.java b/app/src/main/java/com/yzx/webebook/widget/EBookView.java deleted file mode 100644 index 2359dfe..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/EBookView.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.yzx.webebook.widget; - -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; - -import com.wetao.note.WeNoteView; - -public class EBookView extends WeNoteView { - - public EBookView(Context context) { - super(context); - } - - public EBookView(Context context, AttributeSet attributeSet) { - super(context, attributeSet); - } - - public void updateBackground(Drawable drawable){ - - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/ReadSettingDialog.java b/app/src/main/java/com/yzx/webebook/widget/ReadSettingDialog.java deleted file mode 100644 index 59115a2..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/ReadSettingDialog.java +++ /dev/null @@ -1,380 +0,0 @@ -package com.yzx.webebook.widget; - -import android.app.Activity; -import android.app.Dialog; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.view.Gravity; -import android.view.View; -import android.view.Window; -import android.view.WindowManager; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.RadioButton; -import android.widget.RadioGroup; -import android.widget.SeekBar; -import android.widget.TextView; - - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.yzx.webebook.R; -import com.yzx.webebook.adapter.PageStyleAdapter; -import com.yzx.webebook.model.local.ReadSettingManager; -import com.yzx.webebook.utils.BrightnessUtils; -import com.yzx.webebook.utils.ScreenUtils; -import com.yzx.webebook.widget.page.PageLoader; -import com.yzx.webebook.widget.page.PageMode; -import com.yzx.webebook.widget.page.PageStyle; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - - -/** - * Created by newbiechen on 17-5-18. - */ - -public class ReadSettingDialog extends Dialog implements View.OnClickListener { - private static final String TAG = "ReadSettingDialog"; - private static final int DEFAULT_TEXT_SIZE = 28; - - ImageView mIvBrightnessMinus; - SeekBar mSbBrightness; - ImageView mIvBrightnessPlus; - CheckBox mCbBrightnessAuto; - TextView mTvFontMinus; - TextView mTvFont; - TextView mTvFontPlus; - CheckBox mCbFontDefault; - RadioGroup mRgPageMode; - - RadioButton mRbSimulation; - RadioButton mRbCover; - RadioButton mRbSlide; - RadioButton mRbScroll; - RadioButton mRbNone; - RecyclerView mRvBg; - TextView mTvMore; - /************************************/ - private PageStyleAdapter mPageStyleAdapter; - private ReadSettingManager mSettingManager; - private PageLoader mPageLoader; - private Activity mActivity; - - private PageMode mPageMode; - private PageStyle mPageStyle; - - private int mBrightness; - private int mTextSize; - - private boolean isBrightnessAuto; - private boolean isTextDefault; - - - private List sizeBtnList = new ArrayList<>(); - - public ReadSettingDialog(@NonNull Activity activity, PageLoader mPageLoader) { - super(activity, R.style.ReadSettingDialog); - mActivity = activity; - this.mPageLoader = mPageLoader; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.dialog_read_setting); - initView(); - setUpWindow(); - initData(); - initWidget(); - initClick(); - } - - private void initView() { - mIvBrightnessMinus = findViewById(R.id.read_setting_iv_brightness_minus); - mSbBrightness = findViewById(R.id.read_setting_sb_brightness); - mIvBrightnessPlus = findViewById(R.id.read_setting_iv_brightness_plus); - mCbBrightnessAuto = findViewById(R.id.read_setting_cb_brightness_auto); - mTvFontMinus = findViewById(R.id.read_setting_tv_font_minus); - mTvFont = findViewById(R.id.read_setting_tv_font); - mTvFontPlus = findViewById(R.id.read_setting_tv_font_plus); - mCbFontDefault = findViewById(R.id.read_setting_cb_font_default); - mRgPageMode = findViewById(R.id.read_setting_rg_page_mode); - mRbSimulation = findViewById(R.id.read_setting_rb_simulation); - mRbCover = findViewById(R.id.read_setting_rb_cover); - mRbSlide = findViewById(R.id.read_setting_rb_slide); - mRbScroll = findViewById(R.id.read_setting_rb_scroll); - mRbNone = findViewById(R.id.read_setting_rb_none); - mRvBg = findViewById(R.id.read_setting_rv_bg); - mTvMore = findViewById(R.id.read_setting_tv_more); - - sizeBtnList.clear(); - sizeBtnList.add(findViewById(R.id.size_btn_1)); - sizeBtnList.add(findViewById(R.id.size_btn_2)); - sizeBtnList.add(findViewById(R.id.size_btn_3)); - sizeBtnList.add(findViewById(R.id.size_btn_4)); - sizeBtnList.add(findViewById(R.id.size_btn_5)); - sizeBtnList.add(findViewById(R.id.size_btn_6)); - sizeBtnList.add(findViewById(R.id.size_btn_7)); - for (View view : sizeBtnList) { - int index = sizeBtnList.indexOf(view); - view.setTag(28 + index * 6); - view.setOnClickListener(this); - } - } - - //设置Dialog显示的位置 - private void setUpWindow() { - Window window = getWindow(); - WindowManager.LayoutParams lp = window.getAttributes(); - lp.width = WindowManager.LayoutParams.MATCH_PARENT; - lp.height = WindowManager.LayoutParams.MATCH_PARENT; - lp.gravity = Gravity.CENTER; - window.setAttributes(lp); - } - - private void initData() { - mSettingManager = ReadSettingManager.getInstance(); - - isBrightnessAuto = mSettingManager.isBrightnessAuto(); - mBrightness = mSettingManager.getBrightness(); - mTextSize = mSettingManager.getTextSize(); - isTextDefault = mSettingManager.isDefaultTextSize(); - mPageMode = mSettingManager.getPageMode(); - mPageStyle = mSettingManager.getPageStyle(); - - for (View view : sizeBtnList) { - int size = (int) view.getTag(); - int fontSize = ScreenUtils.dpToPx(size); - - TextView tv = (TextView) view; - if (mTextSize == fontSize) { - tv.setText("O"); - } else { - tv.setText("|"); - } - } - } - - private void initWidget() { - mSbBrightness.setProgress(mBrightness); - mTvFont.setText(mTextSize + ""); - mCbBrightnessAuto.setChecked(isBrightnessAuto); - mCbFontDefault.setChecked(isTextDefault); - initPageMode(); - //RecyclerView - setUpAdapter(); - - - } - - private void setUpAdapter() { - Drawable[] drawables = { - getDrawable(R.color.nb_read_bg_1) - , getDrawable(R.color.nb_read_bg_2) - , getDrawable(R.color.nb_read_bg_3) - , getDrawable(R.color.nb_read_bg_4) - , getDrawable(R.color.nb_read_bg_5)}; - - mPageStyleAdapter = new PageStyleAdapter(); - mRvBg.setLayoutManager(new GridLayoutManager(getContext(), 5)); - mRvBg.setAdapter(mPageStyleAdapter); - mPageStyleAdapter.refreshItems(Arrays.asList(drawables)); - - mPageStyleAdapter.setPageStyleChecked(mPageStyle); - - } - - private void initPageMode() { - switch (mPageMode) { - case SIMULATION: - mRbSimulation.setChecked(true); - break; - case COVER: - mRbCover.setChecked(true); - break; - case SLIDE: - mRbSlide.setChecked(true); - break; - case NONE: - mRbNone.setChecked(true); - break; - case SCROLL: - mRbScroll.setChecked(true); - break; - } - } - - private Drawable getDrawable(int drawRes) { - return ContextCompat.getDrawable(getContext(), drawRes); - } - - private void initClick() { - //亮度调节 - mIvBrightnessMinus.setOnClickListener( - (v) -> { - if (mCbBrightnessAuto.isChecked()) { - mCbBrightnessAuto.setChecked(false); - } - int progress = mSbBrightness.getProgress() - 1; - if (progress < 0) return; - mSbBrightness.setProgress(progress); - BrightnessUtils.setBrightness(mActivity, progress); - } - ); - mIvBrightnessPlus.setOnClickListener( - (v) -> { - if (mCbBrightnessAuto.isChecked()) { - mCbBrightnessAuto.setChecked(false); - } - int progress = mSbBrightness.getProgress() + 1; - if (progress > mSbBrightness.getMax()) return; - mSbBrightness.setProgress(progress); - BrightnessUtils.setBrightness(mActivity, progress); - //设置进度 - ReadSettingManager.getInstance().setBrightness(progress); - } - ); - - mSbBrightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - int progress = seekBar.getProgress(); - if (mCbBrightnessAuto.isChecked()) { - mCbBrightnessAuto.setChecked(false); - } - //设置当前 Activity 的亮度 - BrightnessUtils.setBrightness(mActivity, progress); - //存储亮度的进度条 - ReadSettingManager.getInstance().setBrightness(progress); - } - }); - - mCbBrightnessAuto.setOnCheckedChangeListener( - (buttonView, isChecked) -> { - if (isChecked) { - //获取屏幕的亮度 - BrightnessUtils.setBrightness(mActivity, BrightnessUtils.getScreenBrightness(mActivity)); - } else { - //获取进度条的亮度 - BrightnessUtils.setBrightness(mActivity, mSbBrightness.getProgress()); - } - ReadSettingManager.getInstance().setAutoBrightness(isChecked); - } - ); - - //字体大小调节 - mTvFontMinus.setOnClickListener( - (v) -> { - if (mCbFontDefault.isChecked()) { - mCbFontDefault.setChecked(false); - } - int fontSize = Integer.valueOf(mTvFont.getText().toString()) - 1; - if (fontSize < 0) return; - mTvFont.setText(fontSize + ""); - mPageLoader.setTextSize(fontSize); - } - ); - - mTvFontPlus.setOnClickListener( - (v) -> { - if (mCbFontDefault.isChecked()) { - mCbFontDefault.setChecked(false); - } - int fontSize = Integer.valueOf(mTvFont.getText().toString()) + 1; - mTvFont.setText(fontSize + ""); - mPageLoader.setTextSize(fontSize); - } - ); - - mCbFontDefault.setOnCheckedChangeListener( - (buttonView, isChecked) -> { - if (isChecked) { - int fontSize = ScreenUtils.dpToPx(DEFAULT_TEXT_SIZE); - mTvFont.setText(fontSize + ""); - mPageLoader.setTextSize(fontSize); - } - } - ); - - //Page Mode 切换 - mRgPageMode.setOnCheckedChangeListener( - (group, checkedId) -> { - PageMode pageMode; - switch (checkedId) { - case R.id.read_setting_rb_simulation: - pageMode = PageMode.SIMULATION; - break; - case R.id.read_setting_rb_cover: - pageMode = PageMode.COVER; - break; - case R.id.read_setting_rb_slide: - pageMode = PageMode.SLIDE; - break; - case R.id.read_setting_rb_scroll: - pageMode = PageMode.SCROLL; - break; - case R.id.read_setting_rb_none: - pageMode = PageMode.NONE; - break; - default: - pageMode = PageMode.SIMULATION; - break; - } - mPageLoader.setPageMode(pageMode); - } - ); - - //背景的点击事件 - mPageStyleAdapter.setOnItemClickListener( - (view, pos) -> mPageLoader.setPageStyle(PageStyle.values()[pos]) - ); - - //更多设置 - mTvMore.setOnClickListener( - (v) -> { -// Intent intent = new Intent(getContext(), MoreSettingActivity.class); -// mActivity.startActivityForResult(intent, ReadActivity.REQUEST_MORE_SETTING); - //关闭当前设置 - dismiss(); - } - ); - } - - public boolean isBrightFollowSystem() { - if (mCbBrightnessAuto == null) { - return false; - } - return mCbBrightnessAuto.isChecked(); - } - - @Override - public void onClick(View v) { - int size = (int) v.getTag(); - - for (View view : sizeBtnList) { - TextView tv = (TextView) view; - tv.setText("|"); - } - ((TextView) v).setText("O"); - int fontSize = ScreenUtils.dpToPx(size); - mPageLoader.setTextSize(fontSize); - dismiss(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/ScrollTextView.kt b/app/src/main/java/com/yzx/webebook/widget/ScrollTextView.kt deleted file mode 100644 index 33eda6e..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/ScrollTextView.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.yzx.webebook.widget - -import android.content.Context -import android.text.TextUtils -import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatTextView - -/** - * 类名:ScrollTextView - * 作者:Yun.Lei - * 功能: - * 创建日期:2020年5月6日14:29:39 - * 修改人: - * 修改时间: - * 修改备注: - */ -class ScrollTextView : AppCompatTextView { - - constructor(context: Context?) : super(context) - constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) - - init { - ellipsize = TextUtils.TruncateAt.MARQUEE - marqueeRepeatLimit = -1 - isSingleLine = true - } - - override fun isFocused(): Boolean { - return true - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/AnimationProvider.java b/app/src/main/java/com/yzx/webebook/widget/animation/AnimationProvider.java deleted file mode 100644 index 1e15d4a..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/AnimationProvider.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.PointF; -import android.widget.Scroller; - -/** - * Created by Administrator on 2016/8/1 0001. - */ -public abstract class AnimationProvider { - - public enum Direction { - NONE(true),NEXT(true), PRE(true), UP(false), DOWN(false); - - public final boolean isHorizontal; - - Direction(boolean isHorizontal) { - this.isHorizontal = isHorizontal; - } - } - - protected Bitmap mCurPageBitmap,mNextPageBitmap; - protected float myStartX; - protected float myStartY; - protected int myEndX; - protected int myEndY; - protected Direction myDirection; - - protected int mScreenWidth; - protected int mScreenHeight; - - protected PointF mTouch = new PointF(); // 拖拽点 - private Direction direction = Direction.NONE; - private boolean isCancel = false; - - public AnimationProvider(int width,int height) { - mCurPageBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); - mNextPageBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); - - this.mScreenWidth = width; - this.mScreenHeight = height; - } - - //绘制滑动页面 - public abstract void drawMove(Canvas canvas); - - //绘制不滑动页面 - public abstract void drawStatic(Canvas canvas); - - //设置开始拖拽点 - public void setStartPoint(float x,float y){ - myStartX = x; - myStartY = y; - } - - //设置拖拽点 - public void setTouchPoint(float x,float y){ - mTouch.x = x; - mTouch.y = y; - } - - //设置方向 - public void setDirection(Direction direction){ - this.direction = direction; - } - - public Direction getDirection(){ - return direction; - } - - public void setCancel(boolean isCancel){ - this.isCancel = isCancel; - } - - public abstract void startAnimation(Scroller scroller); - - /** - * 转换页面,在显示下一章的时候,必须首先调用此方法 - */ - public void changePage(){ - Bitmap bitmap = mCurPageBitmap; - mCurPageBitmap = mNextPageBitmap; - mNextPageBitmap = bitmap; - } - - public Bitmap getNextBitmap(){ - return mNextPageBitmap; - } - - public Bitmap getBgBitmap(){ - return mNextPageBitmap; - } - - public boolean getCancel(){ - return isCancel; - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/CoverPageAnim.java b/app/src/main/java/com/yzx/webebook/widget/animation/CoverPageAnim.java deleted file mode 100644 index eb534dd..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/CoverPageAnim.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.GradientDrawable; -import android.view.View; - -/** - * Created by newbiechen on 17-7-24. - */ - -public class CoverPageAnim extends HorizonPageAnim { - - private Rect mSrcRect, mDestRect; - private GradientDrawable mBackShadowDrawableLR; - - public CoverPageAnim(int w, int h, View view, OnPageChangeListener listener) { - super(w, h, view, listener); - mSrcRect = new Rect(0, 0, mViewWidth, mViewHeight); - mDestRect = new Rect(0, 0, mViewWidth, mViewHeight); - int[] mBackShadowColors = new int[] { 0x66000000,0x00000000}; - mBackShadowDrawableLR = new GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, mBackShadowColors); - mBackShadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT); - } - - @Override - public void drawStatic(Canvas canvas) { - if (isCancel){ - mNextBitmap = mCurBitmap.copy(Bitmap.Config.RGB_565, true); - canvas.drawBitmap(mCurBitmap, 0, 0, null); - }else { - canvas.drawBitmap(mNextBitmap, 0, 0, null); - } - } - - @Override - public void drawMove(Canvas canvas) { - - switch (mDirection){ - case NEXT: - int dis = (int) (mViewWidth - mStartX + mTouchX); - if (dis > mViewWidth){ - dis = mViewWidth; - } - //计算bitmap截取的区域 - mSrcRect.left = mViewWidth - dis; - //计算bitmap在canvas显示的区域 - mDestRect.right = dis; - canvas.drawBitmap(mNextBitmap,0,0,null); - canvas.drawBitmap(mCurBitmap,mSrcRect,mDestRect,null); - addShadow(dis,canvas); - break; - default: - mSrcRect.left = (int) (mViewWidth - mTouchX); - mDestRect.right = (int) mTouchX; - canvas.drawBitmap(mCurBitmap,0,0,null); - canvas.drawBitmap(mNextBitmap,mSrcRect,mDestRect,null); - addShadow((int) mTouchX,canvas); - break; - } - } - - //添加阴影 - public void addShadow(int left,Canvas canvas) { - mBackShadowDrawableLR.setBounds(left, 0, left + 30 , mScreenHeight); - mBackShadowDrawableLR.draw(canvas); - } - - @Override - public void startAnim() { - super.startAnim(); - int dx = 0; - switch (mDirection){ - case NEXT: - if (isCancel){ - int dis = (int) ((mViewWidth - mStartX) + mTouchX); - if (dis > mViewWidth){ - dis = mViewWidth; - } - dx = mViewWidth - dis; - }else{ - dx = (int) -(mTouchX + (mViewWidth - mStartX)); - } - break; - default: - if (isCancel){ - dx = (int) -mTouchX; - }else{ - dx = (int) (mViewWidth - mTouchX); - } - break; - } - - //滑动速度保持一致 - int duration = (400 * Math.abs(dx)) / mViewWidth; - mScroller.startScroll((int) mTouchX, 0, dx, 0, duration); - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/HorizonPageAnim.java b/app/src/main/java/com/yzx/webebook/widget/animation/HorizonPageAnim.java deleted file mode 100644 index a8c7c62..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/HorizonPageAnim.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; - -/** - * Created by newbiechen on 17-7-24. - * 横向动画的模板 - */ - -public abstract class HorizonPageAnim extends PageAnimation{ - private static final String TAG = "HorizonPageAnim"; - - protected Bitmap mCurBitmap; - protected Bitmap mNextBitmap; - //是否取消翻页 - protected boolean isCancel = false; - - //可以使用 mLast代替 - private int mMoveX = 0; - private int mMoveY = 0; - //是否移动了 - private boolean isMove = false; - //是否翻阅下一页。true表示翻到下一页,false表示上一页。 - private boolean isNext = false; - - //是否没下一页或者上一页 - private boolean noNext = false; - - public HorizonPageAnim(int w, int h, View view, OnPageChangeListener listener) { - this(w, h, 0, 0, view, listener); - } - - public HorizonPageAnim(int w, int h, int marginWidth, int marginHeight, - View view, OnPageChangeListener listener) { - super(w, h, marginWidth, marginHeight, view,listener); - //创建图片 - mCurBitmap = Bitmap.createBitmap(mViewWidth, mViewHeight, Bitmap.Config.RGB_565); - mNextBitmap = Bitmap.createBitmap(mViewWidth, mViewHeight, Bitmap.Config.RGB_565); - } - - /** - * 转换页面,在显示下一章的时候,必须首先调用此方法 - */ - public void changePage(){ - Bitmap bitmap = mCurBitmap; - mCurBitmap = mNextBitmap; - mNextBitmap = bitmap; - } - - public abstract void drawStatic(Canvas canvas); - - public abstract void drawMove(Canvas canvas); - - @Override - public boolean onTouchEvent(MotionEvent event) { - //获取点击位置 - int x = (int)event.getX(); - int y = (int)event.getY(); - //设置触摸点 - setTouchPoint(x,y); - - switch (event.getAction()){ - case MotionEvent.ACTION_DOWN: - //移动的点击位置 - mMoveX = 0; - mMoveY = 0; - //是否移动 - isMove = false; - //是否存在下一章 - noNext = false; - //是下一章还是前一章 - isNext = false; - //是否正在执行动画 - isRunning = false; - //取消 - isCancel = false; - //设置起始位置的触摸点 - setStartPoint(x,y); - //如果存在动画则取消动画 - abortAnim(); - break; - case MotionEvent.ACTION_MOVE: - final int slop = ViewConfiguration.get(mView.getContext()).getScaledTouchSlop(); - //判断是否移动了 - if (!isMove) { - isMove = Math.abs(mStartX - x) > slop || Math.abs(mStartY - y) > slop; - } - - if (isMove){ - //判断是否是准备移动的状态(将要移动但是还没有移动) - if (mMoveX == 0 && mMoveY ==0) { - //判断翻得是上一页还是下一页 - if (x - mStartX > 0){ - //上一页的参数配置 - isNext = false; - boolean hasPrev = mListener.hasPrev(); - setDirection(Direction.PRE); - //如果上一页不存在 - if (!hasPrev) { - noNext = true; - return true; - } - }else{ - //进行下一页的配置 - isNext = true; - //判断是否下一页存在 - boolean hasNext = mListener.hasNext(); - //如果存在设置动画方向 - setDirection(Direction.NEXT); - - //如果不存在表示没有下一页了 - if (!hasNext) { - noNext = true; - return true; - } - } - }else{ - //判断是否取消翻页 - if (isNext){ - if (x - mMoveX > 0){ - isCancel = true; - }else { - isCancel = false; - } - }else{ - if (x - mMoveX < 0){ - isCancel = true; - }else { - isCancel = false; - } - } - } - - mMoveX = x; - mMoveY = y; - isRunning = true; - mView.invalidate(); - } - break; - case MotionEvent.ACTION_UP: - if (!isMove){ - if (x < mScreenWidth / 2){ - isNext = false; - }else{ - isNext = true; - } - - if (isNext) { - //判断是否下一页存在 - boolean hasNext = mListener.hasNext(); - //设置动画方向 - setDirection(Direction.NEXT); - if (!hasNext) { - return true; - } - } else { - boolean hasPrev = mListener.hasPrev(); - setDirection(Direction.PRE); - if (!hasPrev) { - return true; - } - } - } - - // 是否取消翻页 - if (isCancel){ - mListener.pageCancel(); - } - - // 开启翻页效果 - if (!noNext) { - startAnim(); - mView.invalidate(); - } - break; - } - return true; - } - - @Override - public void draw(Canvas canvas) { - if (isRunning) { - drawMove(canvas); - } else { - if (isCancel){ - mNextBitmap = mCurBitmap.copy(Bitmap.Config.RGB_565, true); - } - drawStatic(canvas); - } - } - - @Override - public void scrollAnim() { - if (mScroller.computeScrollOffset()) { - int x = mScroller.getCurrX(); - int y = mScroller.getCurrY(); - - setTouchPoint(x, y); - - if (mScroller.getFinalX() == x && mScroller.getFinalY() == y){ - isRunning = false; - } - mView.postInvalidate(); - } - } - - @Override - public void abortAnim() { - if (!mScroller.isFinished()){ - mScroller.abortAnimation(); - isRunning = false; - setTouchPoint(mScroller.getFinalX(),mScroller.getFinalY()); - mView.postInvalidate(); - } - } - - @Override - public Bitmap getBgBitmap() { - return mNextBitmap; - } - - @Override - public Bitmap getNextBitmap() { - return mNextBitmap; - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/NonePageAnim.java b/app/src/main/java/com/yzx/webebook/widget/animation/NonePageAnim.java deleted file mode 100644 index b0fbb5f..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/NonePageAnim.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Canvas; -import android.view.View; - -/** - * Created by newbiechen on 17-7-24. - */ - -public class NonePageAnim extends HorizonPageAnim{ - - public NonePageAnim(int w, int h, View view, OnPageChangeListener listener) { - super(w, h, view, listener); - } - - @Override - public void drawStatic(Canvas canvas) { - if (isCancel){ - canvas.drawBitmap(mCurBitmap, 0, 0, null); - }else { - canvas.drawBitmap(mNextBitmap, 0, 0, null); - } - } - - @Override - public void drawMove(Canvas canvas) { - if (isCancel){ - canvas.drawBitmap(mCurBitmap, 0, 0, null); - }else { - canvas.drawBitmap(mNextBitmap, 0, 0, null); - } - } - - @Override - public void startAnim() { - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/PageAnimation.java b/app/src/main/java/com/yzx/webebook/widget/animation/PageAnimation.java deleted file mode 100644 index f1c7910..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/PageAnimation.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.view.MotionEvent; -import android.view.View; -import android.view.animation.LinearInterpolator; -import android.widget.Scroller; - -/** - * Created by newbiechen on 17-7-24. - * 翻页动画抽象类 - */ - -public abstract class PageAnimation { - //正在使用的View - protected View mView; - //滑动装置 - protected Scroller mScroller; - //监听器 - protected OnPageChangeListener mListener; - //移动方向 - protected Direction mDirection = Direction.NONE; - - protected boolean isRunning = false; - - //屏幕的尺寸 - protected int mScreenWidth; - protected int mScreenHeight; - //屏幕的间距 - protected int mMarginWidth; - protected int mMarginHeight; - //视图的尺寸 - protected int mViewWidth; - protected int mViewHeight; - //起始点 - protected float mStartX; - protected float mStartY; - //触碰点 - protected float mTouchX; - protected float mTouchY; - //上一个触碰点 - protected float mLastX; - protected float mLastY; - - public PageAnimation(int w, int h,View view,OnPageChangeListener listener){ - this(w, h, 0, 0, view,listener); - } - - public PageAnimation(int w, int h, int marginWidth, int marginHeight, View view,OnPageChangeListener listener){ - mScreenWidth = w; - mScreenHeight = h; - - mMarginWidth = marginWidth; - mMarginHeight = marginHeight; - - mViewWidth = mScreenWidth - mMarginWidth * 2; - mViewHeight = mScreenHeight - mMarginHeight * 2; - - mView = view; - mListener = listener; - - mScroller = new Scroller(mView.getContext(), new LinearInterpolator()); - } - - public void setStartPoint(float x,float y){ - mStartX = x; - mStartY = y; - - mLastX = mStartX; - mLastY = mStartY; - } - - public void setTouchPoint(float x,float y){ - mLastX = mTouchX; - mLastY = mTouchY; - - mTouchX = x; - mTouchY = y; - } - - public boolean isRunning(){ - return isRunning; - } - - /** - * 开启翻页动画 - */ - public void startAnim(){ - if (isRunning){ - return; - } - isRunning = true; - } - - public void setDirection(Direction direction){ - mDirection = direction; - } - - public Direction getDirection(){ - return mDirection; - } - - public void clear(){ - mView = null; - } - /** - * 点击事件的处理 - * @param event - */ - public abstract boolean onTouchEvent(MotionEvent event); - - /** - * 绘制图形 - * @param canvas - */ - public abstract void draw(Canvas canvas); - - /** - * 滚动动画 - * 必须放在computeScroll()方法中执行 - */ - public abstract void scrollAnim(); - - /** - * 取消动画 - */ - public abstract void abortAnim(); - - /** - * 获取背景板 - * @return - */ - public abstract Bitmap getBgBitmap(); - - /** - * 获取内容显示版面 - */ - public abstract Bitmap getNextBitmap(); - - public enum Direction { - NONE(true),NEXT(true), PRE(true), UP(false), DOWN(false); - - public final boolean isHorizontal; - - Direction(boolean isHorizontal) { - this.isHorizontal = isHorizontal; - } - } - - public interface OnPageChangeListener { - boolean hasPrev(); - boolean hasNext(); - void pageCancel(); - } - -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/ScrollPageAnim.java b/app/src/main/java/com/yzx/webebook/widget/animation/ScrollPageAnim.java deleted file mode 100644 index d441091..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/ScrollPageAnim.java +++ /dev/null @@ -1,408 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.view.MotionEvent; -import android.view.VelocityTracker; -import android.view.View; - -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Iterator; - -/** - * Created by newbiechen on 17-7-23. - * 原理:仿照ListView源码实现的上下滑动效果 - * Alter by: zeroAngus - *

- * 问题: - * 1. 向上翻页,重复的问题 (完成) - * 2. 滑动卡顿的问题。原因:由于绘制的数据过多造成的卡顿问题。 (主要是文字绘制需要的时长比较多) 解决办法:做文字缓冲 - * 3. 弱网环境下,显示的问题 - */ -public class ScrollPageAnim extends PageAnimation { - private static final String TAG = "ScrollAnimation"; - // 滑动追踪的时间 - private static final int VELOCITY_DURATION = 1000; - private VelocityTracker mVelocity; - - // 整个Bitmap的背景显示 - private Bitmap mBgBitmap; - - // 下一个展示的图片 - private Bitmap mNextBitmap; - - // 被废弃的图片列表 - private ArrayDeque mScrapViews; - // 正在被利用的图片列表 - private ArrayList mActiveViews = new ArrayList<>(2); - - // 是否处于刷新阶段 - private boolean isRefresh = true; - - public ScrollPageAnim(int w, int h, int marginWidth, int marginHeight, - View view, OnPageChangeListener listener) { - super(w, h, marginWidth, marginHeight, view, listener); - // 创建两个BitmapView - initWidget(); - } - - private void initWidget() { - mBgBitmap = Bitmap.createBitmap(mScreenWidth, mScreenHeight, Bitmap.Config.RGB_565); - - mScrapViews = new ArrayDeque<>(2); - for (int i = 0; i < 2; ++i) { - BitmapView view = new BitmapView(); - view.bitmap = Bitmap.createBitmap(mViewWidth, mViewHeight, Bitmap.Config.RGB_565); - view.srcRect = new Rect(0, 0, mViewWidth, mViewHeight); - view.destRect = new Rect(0, 0, mViewWidth, mViewHeight); - view.top = 0; - view.bottom = view.bitmap.getHeight(); - - mScrapViews.push(view); - } - onLayout(); - isRefresh = false; - } - - // 修改布局,填充内容 - private void onLayout() { - // 如果还没有开始加载,则从上到下进行绘制 - if (mActiveViews.size() == 0) { - fillDown(0, 0); - mDirection = Direction.NONE; - } else { - int offset = (int) (mTouchY - mLastY); - // 判断是下滑还是上拉 (下滑) - if (offset > 0) { - int topEdge = mActiveViews.get(0).top; - fillUp(topEdge, offset); - } - // 上拉 - else { - // 底部的距离 = 当前底部的距离 + 滑动的距离 (因为上滑,得到的值肯定是负的) - int bottomEdge = mActiveViews.get(mActiveViews.size() - 1).bottom; - fillDown(bottomEdge, offset); - } - } - } - - // 底部填充 - private Iterator downIt; - - /** - * 创建View填充底部空白部分 - * - * @param bottomEdge :当前最后一个View的底部,在整个屏幕上的位置,即相对于屏幕顶部的距离 - * @param offset :滑动的偏移量 - */ - private void fillDown(int bottomEdge, int offset) { - - downIt = mActiveViews.iterator(); - BitmapView view; - - // 进行删除 - while (downIt.hasNext()) { - view = downIt.next(); - view.top = view.top + offset; - view.bottom = view.bottom + offset; - // 设置允许显示的范围 - view.destRect.top = view.top; - view.destRect.bottom = view.bottom; - - // 判断是否越界了 - if (view.bottom <= 0) { - // 添加到废弃的View中 - mScrapViews.add(view); - // 从Active中移除 - downIt.remove(); - // 如果原先是从上加载,现在变成从下加载,则表示取消 - if (mDirection == Direction.UP) { - mListener.pageCancel(); - mDirection = Direction.NONE; - } - } - } - - // 滑动之后的最后一个 View 的距离屏幕顶部上的实际位置 - int realEdge = bottomEdge + offset; - - // 进行填充 - while (realEdge < mViewHeight && mActiveViews.size() < 2) { - // 从废弃的Views中获取一个 - view = mScrapViews.getFirst(); -/* //擦除其Bitmap(重新创建会不会更好一点) - eraseBitmap(view.bitmap,view.bitmap.getWidth(),view.bitmap.getHeight(),0,0);*/ - if (view == null) return; - - Bitmap cancelBitmap = mNextBitmap; - mNextBitmap = view.bitmap; - - if (!isRefresh) { - boolean hasNext = mListener.hasNext(); //如果不成功则无法滑动 - - // 如果不存在next,则进行还原 - if (!hasNext) { - mNextBitmap = cancelBitmap; - for (BitmapView activeView : mActiveViews) { - activeView.top = 0; - activeView.bottom = mViewHeight; - // 设置允许显示的范围 - activeView.destRect.top = activeView.top; - activeView.destRect.bottom = activeView.bottom; - } - abortAnim(); - return; - } - } - - // 如果加载成功,那么就将View从ScrapViews中移除 - mScrapViews.removeFirst(); - // 添加到存活的Bitmap中 - mActiveViews.add(view); - mDirection = Direction.DOWN; - - // 设置Bitmap的范围 - view.top = realEdge; - view.bottom = realEdge + view.bitmap.getHeight(); - // 设置允许显示的范围 - view.destRect.top = view.top; - view.destRect.bottom = view.bottom; - - realEdge += view.bitmap.getHeight(); - } - } - - private Iterator upIt; - - /** - * 创建View填充顶部空白部分 - * - * @param topEdge : 当前第一个View的顶部,到屏幕顶部的距离 - * @param offset : 滑动的偏移量 - */ - private void fillUp(int topEdge, int offset) { - // 首先进行布局的调整 - upIt = mActiveViews.iterator(); - BitmapView view; - while (upIt.hasNext()) { - view = upIt.next(); - view.top = view.top + offset; - view.bottom = view.bottom + offset; - //设置允许显示的范围 - view.destRect.top = view.top; - view.destRect.bottom = view.bottom; - - // 判断是否越界了 - if (view.top >= mViewHeight) { - // 添加到废弃的View中 - mScrapViews.add(view); - // 从Active中移除 - upIt.remove(); - - // 如果原先是下,现在变成从上加载了,则表示取消加载 - - if (mDirection == Direction.DOWN) { - mListener.pageCancel(); - mDirection = Direction.NONE; - } - } - } - - // 滑动之后,第一个 View 的顶部距离屏幕顶部的实际位置。 - int realEdge = topEdge + offset; - - // 对布局进行View填充 - while (realEdge > 0 && mActiveViews.size() < 2) { - // 从废弃的Views中获取一个 - view = mScrapViews.getFirst(); - if (view == null) return; - - // 判断是否存在上一章节 - Bitmap cancelBitmap = mNextBitmap; - mNextBitmap = view.bitmap; - if (!isRefresh) { - boolean hasPrev = mListener.hasPrev(); // 如果不成功则无法滑动 - // 如果不存在next,则进行还原 - if (!hasPrev) { - mNextBitmap = cancelBitmap; - for (BitmapView activeView : mActiveViews) { - activeView.top = 0; - activeView.bottom = mViewHeight; - // 设置允许显示的范围 - activeView.destRect.top = activeView.top; - activeView.destRect.bottom = activeView.bottom; - } - abortAnim(); - return; - } - } - // 如果加载成功,那么就将View从ScrapViews中移除 - mScrapViews.removeFirst(); - // 加入到存活的对象中 - mActiveViews.add(0, view); - mDirection = Direction.UP; - // 设置Bitmap的范围 - view.top = realEdge - view.bitmap.getHeight(); - view.bottom = realEdge; - - // 设置允许显示的范围 - view.destRect.top = view.top; - view.destRect.bottom = view.bottom; - realEdge -= view.bitmap.getHeight(); - } - } - - /** - * 对Bitmap进行擦除 - * - * @param b - * @param width - * @param height - * @param paddingLeft - * @param paddingTop - */ - private void eraseBitmap(Bitmap b, int width, int height, - int paddingLeft, int paddingTop) { - /* if (mInitBitmapPix == null) return; - b.setPixels(mInitBitmapPix, 0, width, paddingLeft, paddingTop, width, height);*/ - } - - /** - * 重置位移 - */ - public void resetBitmap() { - isRefresh = true; - // 将所有的Active加入到Scrap中 - for (BitmapView view : mActiveViews) { - mScrapViews.add(view); - } - // 清除所有的Active - mActiveViews.clear(); - // 重新进行布局 - onLayout(); - isRefresh = false; - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - int x = (int) event.getX(); - int y = (int) event.getY(); - - // 初始化速度追踪器 - if (mVelocity == null) { - mVelocity = VelocityTracker.obtain(); - } - - mVelocity.addMovement(event); - // 设置触碰点 - setTouchPoint(x, y); - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - isRunning = false; - // 设置起始点 - setStartPoint(x, y); - // 停止动画 - abortAnim(); - break; - case MotionEvent.ACTION_MOVE: - mVelocity.computeCurrentVelocity(VELOCITY_DURATION); - isRunning = true; - // 进行刷新 - mView.postInvalidate(); - break; - case MotionEvent.ACTION_UP: - isRunning = false; - // 开启动画 - startAnim(); - // 删除检测器 - mVelocity.recycle(); - mVelocity = null; - break; - - case MotionEvent.ACTION_CANCEL: - try { - mVelocity.recycle(); // if velocityTracker won't be used should be recycled - mVelocity = null; - } catch (Exception e) { - e.printStackTrace(); - } - break; - } - return true; - } - - - BitmapView tmpView; - - @Override - public void draw(Canvas canvas) { - //进行布局 - onLayout(); - - //绘制背景 - canvas.drawBitmap(mBgBitmap, 0, 0, null); - //绘制内容 - canvas.save(); - //移动位置 - canvas.translate(0, mMarginHeight); - //裁剪显示区域 - canvas.clipRect(0, 0, mViewWidth, mViewHeight); -/* //设置背景透明 - canvas.drawColor(0x40);*/ - //绘制Bitmap - for (int i = 0; i < mActiveViews.size(); ++i) { - tmpView = mActiveViews.get(i); - canvas.drawBitmap(tmpView.bitmap, tmpView.srcRect, tmpView.destRect, null); - } - canvas.restore(); - } - - @Override - public synchronized void startAnim() { - isRunning = true; - mScroller.fling(0, (int) mTouchY, 0, (int) mVelocity.getYVelocity() - , 0, 0, Integer.MAX_VALUE * -1, Integer.MAX_VALUE); - } - - @Override - public void scrollAnim() { - if (mScroller.computeScrollOffset()) { - int x = mScroller.getCurrX(); - int y = mScroller.getCurrY(); - setTouchPoint(x, y); - if (mScroller.getFinalX() == x && mScroller.getFinalY() == y) { - isRunning = false; - } - mView.postInvalidate(); - } - } - - @Override - public void abortAnim() { - if (!mScroller.isFinished()) { - mScroller.abortAnimation(); - isRunning = false; - } - } - - @Override - public Bitmap getBgBitmap() { - return mBgBitmap; - } - - @Override - public Bitmap getNextBitmap() { - return mNextBitmap; - } - - private static class BitmapView { - Bitmap bitmap; - Rect srcRect; - Rect destRect; - int top; - int bottom; - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/SimulationPageAnim.java b/app/src/main/java/com/yzx/webebook/widget/animation/SimulationPageAnim.java deleted file mode 100644 index b6f929c..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/SimulationPageAnim.java +++ /dev/null @@ -1,668 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.ColorMatrix; -import android.graphics.ColorMatrixColorFilter; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.PointF; -import android.graphics.Region; -import android.graphics.drawable.GradientDrawable; -import android.os.Build; -import android.view.View; - -/** - * Created by newbiechen on 17-7-24. - */ - -public class SimulationPageAnim extends HorizonPageAnim { - private static final String TAG = "SimulationPageAnim"; - - private int mCornerX = 1; // 拖拽点对应的页脚 - private int mCornerY = 1; - private Path mPath0; - private Path mPath1; - - private PointF mBezierStart1 = new PointF(); // 贝塞尔曲线起始点 - private PointF mBezierControl1 = new PointF(); // 贝塞尔曲线控制点 - private PointF mBeziervertex1 = new PointF(); // 贝塞尔曲线顶点 - private PointF mBezierEnd1 = new PointF(); // 贝塞尔曲线结束点 - - private PointF mBezierStart2 = new PointF(); // 另一条贝塞尔曲线 - private PointF mBezierControl2 = new PointF(); - private PointF mBeziervertex2 = new PointF(); - private PointF mBezierEnd2 = new PointF(); - - private float mMiddleX; - private float mMiddleY; - private float mDegrees; - private float mTouchToCornerDis; - private ColorMatrixColorFilter mColorMatrixFilter; - private Matrix mMatrix; - private float[] mMatrixArray = {0, 0, 0, 0, 0, 0, 0, 0, 1.0f}; - - private boolean mIsRTandLB; // 是否属于右上左下 - private float mMaxLength; - private GradientDrawable mBackShadowDrawableLR; // 有阴影的GradientDrawable - private GradientDrawable mBackShadowDrawableRL; - private GradientDrawable mFolderShadowDrawableLR; - private GradientDrawable mFolderShadowDrawableRL; - - private GradientDrawable mFrontShadowDrawableHBT; - private GradientDrawable mFrontShadowDrawableHTB; - private GradientDrawable mFrontShadowDrawableVLR; - private GradientDrawable mFrontShadowDrawableVRL; - - private Paint mPaint; - - // 适配 android 高版本无法使用 XOR 的问题 - private Path mXORPath; - - public SimulationPageAnim(int w, int h, View view, OnPageChangeListener listener) { - super(w, h, view, listener); - mPath0 = new Path(); - mPath1 = new Path(); - mXORPath = new Path(); - mMaxLength = (float) Math.hypot(mScreenWidth, mScreenHeight); - mPaint = new Paint(); - - mPaint.setStyle(Paint.Style.FILL); - - createDrawable(); - - ColorMatrix cm = new ColorMatrix();//设置颜色数组 - float array[] = {1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0}; - cm.set(array); - mColorMatrixFilter = new ColorMatrixColorFilter(cm); - mMatrix = new Matrix(); - - mTouchX = 0.01f; // 不让x,y为0,否则在点计算时会有问题 - mTouchY = 0.01f; - } - - @Override - public void drawMove(Canvas canvas) { - switch (mDirection) { - case NEXT: - calcPoints(); - drawCurrentPageArea(canvas, mCurBitmap, mPath0); - drawNextPageAreaAndShadow(canvas, mNextBitmap); - drawCurrentPageShadow(canvas); - drawCurrentBackArea(canvas, mCurBitmap); - break; - default: - calcPoints(); - drawCurrentPageArea(canvas, mNextBitmap, mPath0); - drawNextPageAreaAndShadow(canvas, mCurBitmap); - drawCurrentPageShadow(canvas); - drawCurrentBackArea(canvas, mNextBitmap); - break; - } - } - - @Override - public void drawStatic(Canvas canvas) { - if (isCancel) { - mNextBitmap = mCurBitmap.copy(Bitmap.Config.RGB_565, true); - canvas.drawBitmap(mCurBitmap, 0, 0, null); - } else { - canvas.drawBitmap(mNextBitmap, 0, 0, null); - } - } - - @Override - public void startAnim() { - super.startAnim(); - int dx, dy; - // dx 水平方向滑动的距离,负值会使滚动向左滚动 - // dy 垂直方向滑动的距离,负值会使滚动向上滚动 - if (isCancel) { - - if (mCornerX > 0 && mDirection.equals(Direction.NEXT)) { - dx = (int) (mScreenWidth - mTouchX); - } else { - dx = -(int) mTouchX; - } - - if (!mDirection.equals(Direction.NEXT)) { - dx = (int) -(mScreenWidth + mTouchX); - } - - if (mCornerY > 0) { - dy = (int) (mScreenHeight - mTouchY); - } else { - dy = -(int) mTouchY; // 防止mTouchY最终变为0 - } - } else { - if (mCornerX > 0 && mDirection.equals(Direction.NEXT)) { - dx = -(int) (mScreenWidth + mTouchX); - } else { - dx = (int) (mScreenWidth - mTouchX + mScreenWidth); - } - if (mCornerY > 0) { - dy = (int) (mScreenHeight - mTouchY); - } else { - dy = (int) (1 - mTouchY); // 防止mTouchY最终变为0 - } - } - mScroller.startScroll((int) mTouchX, (int) mTouchY, dx, dy, 400); - } - - @Override - public void setDirection(Direction direction) { - super.setDirection(direction); - - switch (direction) { - case PRE: - //上一页滑动不出现对角 - if (mStartX > mScreenWidth / 2) { - calcCornerXY(mStartX, mScreenHeight); - } else { - calcCornerXY(mScreenWidth - mStartX, mScreenHeight); - } - break; - case NEXT: - if (mScreenWidth / 2 > mStartX) { - calcCornerXY(mScreenWidth - mStartX, mStartY); - } - break; - } - } - - @Override - public void setStartPoint(float x, float y) { - super.setStartPoint(x, y); - calcCornerXY(x, y); - } - - @Override - public void setTouchPoint(float x, float y) { - super.setTouchPoint(x, y); - //触摸y中间位置吧y变成屏幕高度 - if ((mStartY > mScreenHeight / 3 && mStartY < mScreenHeight * 2 / 3) || mDirection.equals(Direction.PRE)) { - mTouchY = mScreenHeight; - } - - if (mStartY > mScreenHeight / 3 && mStartY < mScreenHeight / 2 && mDirection.equals(Direction.NEXT)) { - mTouchY = 1; - } - } - - /** - * 创建阴影的GradientDrawable - */ - private void createDrawable() { - int[] color = {0x333333, 0xb0333333}; - mFolderShadowDrawableRL = new GradientDrawable( - GradientDrawable.Orientation.RIGHT_LEFT, color); - mFolderShadowDrawableRL - .setGradientType(GradientDrawable.LINEAR_GRADIENT); - - mFolderShadowDrawableLR = new GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, color); - mFolderShadowDrawableLR - .setGradientType(GradientDrawable.LINEAR_GRADIENT); - - // 背面颜色组 - int[] mBackShadowColors = new int[]{0xff111111, 0x111111}; - mBackShadowDrawableRL = new GradientDrawable( - GradientDrawable.Orientation.RIGHT_LEFT, mBackShadowColors); - mBackShadowDrawableRL.setGradientType(GradientDrawable.LINEAR_GRADIENT); - - mBackShadowDrawableLR = new GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, mBackShadowColors); - mBackShadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT); - - // 前面颜色组 - int[] mFrontShadowColors = new int[]{0x80111111, 0x111111}; - mFrontShadowDrawableVLR = new GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, mFrontShadowColors); - mFrontShadowDrawableVLR - .setGradientType(GradientDrawable.LINEAR_GRADIENT); - mFrontShadowDrawableVRL = new GradientDrawable( - GradientDrawable.Orientation.RIGHT_LEFT, mFrontShadowColors); - mFrontShadowDrawableVRL - .setGradientType(GradientDrawable.LINEAR_GRADIENT); - - mFrontShadowDrawableHTB = new GradientDrawable( - GradientDrawable.Orientation.TOP_BOTTOM, mFrontShadowColors); - mFrontShadowDrawableHTB - .setGradientType(GradientDrawable.LINEAR_GRADIENT); - - mFrontShadowDrawableHBT = new GradientDrawable( - GradientDrawable.Orientation.BOTTOM_TOP, mFrontShadowColors); - mFrontShadowDrawableHBT - .setGradientType(GradientDrawable.LINEAR_GRADIENT); - } - - /** - * 是否能够拖动过去 - * - * @return - */ - public boolean canDragOver() { - return mTouchToCornerDis > mScreenWidth / 10; - } - - public boolean right() { - return mCornerX <= -4; - } - - /** - * 绘制翻起页背面 - * - * @param canvas - * @param bitmap - */ - private void drawCurrentBackArea(Canvas canvas, Bitmap bitmap) { - int i = (int) (mBezierStart1.x + mBezierControl1.x) / 2; - float f1 = Math.abs(i - mBezierControl1.x); - int i1 = (int) (mBezierStart2.y + mBezierControl2.y) / 2; - float f2 = Math.abs(i1 - mBezierControl2.y); - float f3 = Math.min(f1, f2); - mPath1.reset(); - mPath1.moveTo(mBeziervertex2.x, mBeziervertex2.y); - mPath1.lineTo(mBeziervertex1.x, mBeziervertex1.y); - mPath1.lineTo(mBezierEnd1.x, mBezierEnd1.y); - mPath1.lineTo(mTouchX, mTouchY); - mPath1.lineTo(mBezierEnd2.x, mBezierEnd2.y); - mPath1.close(); - GradientDrawable mFolderShadowDrawable; - int left; - int right; - if (mIsRTandLB) { - left = (int) (mBezierStart1.x - 1); - right = (int) (mBezierStart1.x + f3 + 1); - mFolderShadowDrawable = mFolderShadowDrawableLR; - } else { - left = (int) (mBezierStart1.x - f3 - 1); - right = (int) (mBezierStart1.x + 1); - mFolderShadowDrawable = mFolderShadowDrawableRL; - } - canvas.save(); - try { - canvas.clipPath(mPath0); - canvas.clipPath(mPath1, Region.Op.INTERSECT); - } catch (Exception e) { - } - - mPaint.setColorFilter(mColorMatrixFilter); - //对Bitmap进行取色 - int color = bitmap.getPixel(1, 1); - //获取对应的三色 - int red = (color & 0xff0000) >> 16; - int green = (color & 0x00ff00) >> 8; - int blue = (color & 0x0000ff); - //转换成含有透明度的颜色 - int tempColor = Color.argb(200, red, green, blue); - - - float dis = (float) Math.hypot(mCornerX - mBezierControl1.x, - mBezierControl2.y - mCornerY); - float f8 = (mCornerX - mBezierControl1.x) / dis; - float f9 = (mBezierControl2.y - mCornerY) / dis; - mMatrixArray[0] = 1 - 2 * f9 * f9; - mMatrixArray[1] = 2 * f8 * f9; - mMatrixArray[3] = mMatrixArray[1]; - mMatrixArray[4] = 1 - 2 * f8 * f8; - mMatrix.reset(); - mMatrix.setValues(mMatrixArray); - mMatrix.preTranslate(-mBezierControl1.x, -mBezierControl1.y); - mMatrix.postTranslate(mBezierControl1.x, mBezierControl1.y); - canvas.drawBitmap(bitmap, mMatrix, mPaint); - //背景叠加 - canvas.drawColor(tempColor); - - mPaint.setColorFilter(null); - - canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y); - mFolderShadowDrawable.setBounds(left, (int) mBezierStart1.y, right, - (int) (mBezierStart1.y + mMaxLength)); - mFolderShadowDrawable.draw(canvas); - canvas.restore(); - } - - /** - * 绘制翻起页的阴影 - * - * @param canvas - */ - private void drawCurrentPageShadow(Canvas canvas) { - double degree; - if (mIsRTandLB) { - degree = Math.PI - / 4 - - Math.atan2(mBezierControl1.y - mTouchY, mTouchX - - mBezierControl1.x); - } else { - degree = Math.PI - / 4 - - Math.atan2(mTouchY - mBezierControl1.y, mTouchX - - mBezierControl1.x); - } - // 翻起页阴影顶点与touch点的距离 - double d1 = (float) 25 * 1.414 * Math.cos(degree); - double d2 = (float) 25 * 1.414 * Math.sin(degree); - float x = (float) (mTouchX + d1); - float y; - if (mIsRTandLB) { - y = (float) (mTouchY + d2); - } else { - y = (float) (mTouchY - d2); - } - mPath1.reset(); - mPath1.moveTo(x, y); - mPath1.lineTo(mTouchX, mTouchY); - mPath1.lineTo(mBezierControl1.x, mBezierControl1.y); - mPath1.lineTo(mBezierStart1.x, mBezierStart1.y); - mPath1.close(); - float rotateDegrees; - canvas.save(); - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - mXORPath.reset(); - mXORPath.moveTo(0f, 0f); - mXORPath.lineTo(canvas.getWidth(), 0f); - mXORPath.lineTo(canvas.getWidth(), canvas.getHeight()); - mXORPath.lineTo(0f, canvas.getHeight()); - mXORPath.close(); - - // 取 path 的补集,作为 canvas 的交集 - mXORPath.op(mPath0, Path.Op.XOR); - canvas.clipPath(mXORPath); - } else { - canvas.clipPath(mPath0, Region.Op.XOR); - } - canvas.clipPath(mPath1, Region.Op.INTERSECT); - } catch (Exception e) { - // TODO: handle exception - } - - int leftx; - int rightx; - GradientDrawable mCurrentPageShadow; - if (mIsRTandLB) { - leftx = (int) (mBezierControl1.x); - rightx = (int) mBezierControl1.x + 25; - mCurrentPageShadow = mFrontShadowDrawableVLR; - } else { - leftx = (int) (mBezierControl1.x - 25); - rightx = (int) mBezierControl1.x + 1; - mCurrentPageShadow = mFrontShadowDrawableVRL; - } - - rotateDegrees = (float) Math.toDegrees(Math.atan2(mTouchX - - mBezierControl1.x, mBezierControl1.y - mTouchY)); - canvas.rotate(rotateDegrees, mBezierControl1.x, mBezierControl1.y); - mCurrentPageShadow.setBounds(leftx, - (int) (mBezierControl1.y - mMaxLength), rightx, - (int) (mBezierControl1.y)); - mCurrentPageShadow.draw(canvas); - canvas.restore(); - - mPath1.reset(); - mPath1.moveTo(x, y); - mPath1.lineTo(mTouchX, mTouchY); - mPath1.lineTo(mBezierControl2.x, mBezierControl2.y); - mPath1.lineTo(mBezierStart2.x, mBezierStart2.y); - mPath1.close(); - canvas.save(); - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - mXORPath.reset(); - mXORPath.moveTo(0f, 0f); - mXORPath.lineTo(canvas.getWidth(), 0f); - mXORPath.lineTo(canvas.getWidth(), canvas.getHeight()); - mXORPath.lineTo(0f, canvas.getHeight()); - mXORPath.close(); - - // 取 path 的补给,作为 canvas 的交集 - mXORPath.op(mPath0, Path.Op.XOR); - canvas.clipPath(mXORPath); - } else { - canvas.clipPath(mPath0, Region.Op.XOR); - } - canvas.clipPath(mPath1, Region.Op.INTERSECT); - } catch (Exception e) { - } - - if (mIsRTandLB) { - leftx = (int) (mBezierControl2.y); - rightx = (int) (mBezierControl2.y + 25); - mCurrentPageShadow = mFrontShadowDrawableHTB; - } else { - leftx = (int) (mBezierControl2.y - 25); - rightx = (int) (mBezierControl2.y + 1); - mCurrentPageShadow = mFrontShadowDrawableHBT; - } - rotateDegrees = (float) Math.toDegrees(Math.atan2(mBezierControl2.y - - mTouchY, mBezierControl2.x - mTouchX)); - canvas.rotate(rotateDegrees, mBezierControl2.x, mBezierControl2.y); - float temp; - if (mBezierControl2.y < 0) - temp = mBezierControl2.y - mScreenHeight; - else - temp = mBezierControl2.y; - - int hmg = (int) Math.hypot(mBezierControl2.x, temp); - if (hmg > mMaxLength) - mCurrentPageShadow - .setBounds((int) (mBezierControl2.x - 25) - hmg, leftx, - (int) (mBezierControl2.x + mMaxLength) - hmg, - rightx); - else - mCurrentPageShadow.setBounds( - (int) (mBezierControl2.x - mMaxLength), leftx, - (int) (mBezierControl2.x), rightx); - - mCurrentPageShadow.draw(canvas); - canvas.restore(); - } - - private void drawNextPageAreaAndShadow(Canvas canvas, Bitmap bitmap) { - mPath1.reset(); - mPath1.moveTo(mBezierStart1.x, mBezierStart1.y); - mPath1.lineTo(mBeziervertex1.x, mBeziervertex1.y); - mPath1.lineTo(mBeziervertex2.x, mBeziervertex2.y); - mPath1.lineTo(mBezierStart2.x, mBezierStart2.y); - mPath1.lineTo(mCornerX, mCornerY); - mPath1.close(); - - mDegrees = (float) Math.toDegrees(Math.atan2(mBezierControl1.x - - mCornerX, mBezierControl2.y - mCornerY)); - int leftx; - int rightx; - GradientDrawable mBackShadowDrawable; - if (mIsRTandLB) { //左下及右上 - leftx = (int) (mBezierStart1.x); - rightx = (int) (mBezierStart1.x + mTouchToCornerDis / 4); - mBackShadowDrawable = mBackShadowDrawableLR; - } else { - leftx = (int) (mBezierStart1.x - mTouchToCornerDis / 4); - rightx = (int) mBezierStart1.x; - mBackShadowDrawable = mBackShadowDrawableRL; - } - canvas.save(); - try { - canvas.clipPath(mPath0); - canvas.clipPath(mPath1, Region.Op.INTERSECT); - } catch (Exception e) { - } - - - canvas.drawBitmap(bitmap, 0, 0, null); - canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y); - mBackShadowDrawable.setBounds(leftx, (int) mBezierStart1.y, rightx, - (int) (mMaxLength + mBezierStart1.y));//左上及右下角的xy坐标值,构成一个矩形 - mBackShadowDrawable.draw(canvas); - canvas.restore(); - } - - private void drawCurrentPageArea(Canvas canvas, Bitmap bitmap, Path path) { - mPath0.reset(); - mPath0.moveTo(mBezierStart1.x, mBezierStart1.y); - mPath0.quadTo(mBezierControl1.x, mBezierControl1.y, mBezierEnd1.x, - mBezierEnd1.y); - mPath0.lineTo(mTouchX, mTouchY); - mPath0.lineTo(mBezierEnd2.x, mBezierEnd2.y); - mPath0.quadTo(mBezierControl2.x, mBezierControl2.y, mBezierStart2.x, - mBezierStart2.y); - mPath0.lineTo(mCornerX, mCornerY); - mPath0.close(); - - canvas.save(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - mXORPath.reset(); - mXORPath.moveTo(0f, 0f); - mXORPath.lineTo(canvas.getWidth(), 0f); - mXORPath.lineTo(canvas.getWidth(), canvas.getHeight()); - mXORPath.lineTo(0f, canvas.getHeight()); - mXORPath.close(); - - // 取 path 的补给,作为 canvas 的交集 - mXORPath.op(path, Path.Op.XOR); - canvas.clipPath(mXORPath); - } else { - canvas.clipPath(path, Region.Op.XOR); - } - canvas.drawBitmap(bitmap, 0, 0, null); - try { - canvas.restore(); - } catch (Exception e) { - - } - - } - - /** - * 计算拖拽点对应的拖拽脚 - * - * @param x - * @param y - */ - public void calcCornerXY(float x, float y) { - if (x <= mScreenWidth / 2) { - mCornerX = 0; - } else { - mCornerX = mScreenWidth; - } - if (y <= mScreenHeight / 2) { - mCornerY = 0; - } else { - mCornerY = mScreenHeight; - } - - if ((mCornerX == 0 && mCornerY == mScreenHeight) - || (mCornerX == mScreenWidth && mCornerY == 0)) { - mIsRTandLB = true; - } else { - mIsRTandLB = false; - } - - } - - private void calcPoints() { - mMiddleX = (mTouchX + mCornerX) / 2; - mMiddleY = (mTouchY + mCornerY) / 2; - mBezierControl1.x = mMiddleX - (mCornerY - mMiddleY) - * (mCornerY - mMiddleY) / (mCornerX - mMiddleX); - mBezierControl1.y = mCornerY; - mBezierControl2.x = mCornerX; - - float f4 = mCornerY - mMiddleY; - if (f4 == 0) { - mBezierControl2.y = mMiddleY - (mCornerX - mMiddleX) - * (mCornerX - mMiddleX) / 0.1f; - - } else { - mBezierControl2.y = mMiddleY - (mCornerX - mMiddleX) - * (mCornerX - mMiddleX) / (mCornerY - mMiddleY); - } - mBezierStart1.x = mBezierControl1.x - (mCornerX - mBezierControl1.x) - / 2; - mBezierStart1.y = mCornerY; - - // 当mBezierStart1.x < 0或者mBezierStart1.x > 480时 - // 如果继续翻页,会出现BUG故在此限制 - if (mTouchX > 0 && mTouchX < mScreenWidth) { - if (mBezierStart1.x < 0 || mBezierStart1.x > mScreenWidth) { - if (mBezierStart1.x < 0) - mBezierStart1.x = mScreenWidth - mBezierStart1.x; - - float f1 = Math.abs(mCornerX - mTouchX); - float f2 = mScreenWidth * f1 / mBezierStart1.x; - mTouchX = Math.abs(mCornerX - f2); - - float f3 = Math.abs(mCornerX - mTouchX) - * Math.abs(mCornerY - mTouchY) / f1; - mTouchY = Math.abs(mCornerY - f3); - - mMiddleX = (mTouchX + mCornerX) / 2; - mMiddleY = (mTouchY + mCornerY) / 2; - - mBezierControl1.x = mMiddleX - (mCornerY - mMiddleY) - * (mCornerY - mMiddleY) / (mCornerX - mMiddleX); - mBezierControl1.y = mCornerY; - - mBezierControl2.x = mCornerX; - - float f5 = mCornerY - mMiddleY; - if (f5 == 0) { - mBezierControl2.y = mMiddleY - (mCornerX - mMiddleX) - * (mCornerX - mMiddleX) / 0.1f; - } else { - mBezierControl2.y = mMiddleY - (mCornerX - mMiddleX) - * (mCornerX - mMiddleX) / (mCornerY - mMiddleY); - } - - mBezierStart1.x = mBezierControl1.x - - (mCornerX - mBezierControl1.x) / 2; - } - } - mBezierStart2.x = mCornerX; - mBezierStart2.y = mBezierControl2.y - (mCornerY - mBezierControl2.y) - / 2; - - mTouchToCornerDis = (float) Math.hypot((mTouchX - mCornerX), - (mTouchY - mCornerY)); - - mBezierEnd1 = getCross(new PointF(mTouchX, mTouchY), mBezierControl1, mBezierStart1, - mBezierStart2); - mBezierEnd2 = getCross(new PointF(mTouchX, mTouchY), mBezierControl2, mBezierStart1, - mBezierStart2); - - mBeziervertex1.x = (mBezierStart1.x + 2 * mBezierControl1.x + mBezierEnd1.x) / 4; - mBeziervertex1.y = (2 * mBezierControl1.y + mBezierStart1.y + mBezierEnd1.y) / 4; - mBeziervertex2.x = (mBezierStart2.x + 2 * mBezierControl2.x + mBezierEnd2.x) / 4; - mBeziervertex2.y = (2 * mBezierControl2.y + mBezierStart2.y + mBezierEnd2.y) / 4; - } - - /** - * 求解直线P1P2和直线P3P4的交点坐标 - * - * @param P1 - * @param P2 - * @param P3 - * @param P4 - * @return - */ - private PointF getCross(PointF P1, PointF P2, PointF P3, PointF P4) { - PointF CrossP = new PointF(); - // 二元函数通式: y=ax+b - float a1 = (P2.y - P1.y) / (P2.x - P1.x); - float b1 = ((P1.x * P2.y) - (P2.x * P1.y)) / (P1.x - P2.x); - - float a2 = (P4.y - P3.y) / (P4.x - P3.x); - float b2 = ((P3.x * P4.y) - (P4.x * P3.y)) / (P3.x - P4.x); - CrossP.x = (b2 - b1) / (a1 - a2); - CrossP.y = a1 * CrossP.x + b1; - return CrossP; - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/animation/SlidePageAnim.java b/app/src/main/java/com/yzx/webebook/widget/animation/SlidePageAnim.java deleted file mode 100644 index c52cdb6..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/animation/SlidePageAnim.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.yzx.webebook.widget.animation; - -import android.graphics.Canvas; -import android.graphics.Rect; -import android.view.View; - -/** - * Created by newbiechen on 17-7-24. - */ - -public class SlidePageAnim extends HorizonPageAnim { - private Rect mSrcRect, mDestRect,mNextSrcRect,mNextDestRect; - - public SlidePageAnim(int w, int h, View view, OnPageChangeListener listener) { - super(w, h, view, listener); - mSrcRect = new Rect(0, 0, mViewWidth, mViewHeight); - mDestRect = new Rect(0, 0, mViewWidth, mViewHeight); - mNextSrcRect = new Rect(0, 0, mViewWidth, mViewHeight); - mNextDestRect = new Rect(0, 0, mViewWidth, mViewHeight); - } - - @Override - public void drawStatic(Canvas canvas) { - if (isCancel){ - canvas.drawBitmap(mCurBitmap, 0, 0, null); - }else { - canvas.drawBitmap(mNextBitmap, 0, 0, null); - } - } - - @Override - public void drawMove(Canvas canvas) { - int dis = 0; - switch (mDirection){ - case NEXT: - //左半边的剩余区域 - dis = (int) (mScreenWidth - mStartX + mTouchX); - if (dis > mScreenWidth){ - dis = mScreenWidth; - } - //计算bitmap截取的区域 - mSrcRect.left = mScreenWidth - dis; - //计算bitmap在canvas显示的区域 - mDestRect.right = dis; - //计算下一页截取的区域 - mNextSrcRect.right = mScreenWidth - dis; - //计算下一页在canvas显示的区域 - mNextDestRect.left = dis; - - canvas.drawBitmap(mNextBitmap,mNextSrcRect,mNextDestRect,null); - canvas.drawBitmap(mCurBitmap,mSrcRect,mDestRect,null); - break; - default: - dis = (int) (mTouchX - mStartX); - if (dis < 0){ - dis = 0; - mStartX = mTouchX; - } - mSrcRect.left = mScreenWidth - dis; - mDestRect.right = dis; - - //计算下一页截取的区域 - mNextSrcRect.right = mScreenWidth - dis; - //计算下一页在canvas显示的区域 - mNextDestRect.left = dis; - - canvas.drawBitmap(mCurBitmap,mNextSrcRect,mNextDestRect,null); - canvas.drawBitmap(mNextBitmap,mSrcRect,mDestRect,null); - break; - } - } - - @Override - public void startAnim() { - super.startAnim(); - int dx = 0; - switch (mDirection){ - case NEXT: - if (isCancel){ - int dis = (int)((mScreenWidth - mStartX) + mTouchX); - if (dis > mScreenWidth){ - dis = mScreenWidth; - } - dx = mScreenWidth - dis; - }else{ - dx = (int) -(mTouchX + (mScreenWidth - mStartX)); - } - break; - default: - if (isCancel){ - dx = (int)-Math.abs(mTouchX - mStartX); - }else{ - dx = (int) (mScreenWidth - (mTouchX - mStartX)); - } - break; - } - //滑动速度保持一致 - int duration = (400 * Math.abs(dx)) / mScreenWidth; - mScroller.startScroll((int) mTouchX, 0, dx, 0, duration); - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/page/LocalPageLoader.java b/app/src/main/java/com/yzx/webebook/widget/page/LocalPageLoader.java deleted file mode 100644 index 541038e..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/LocalPageLoader.java +++ /dev/null @@ -1,440 +0,0 @@ -package com.yzx.webebook.widget.page; - - -import com.yzx.webebook.model.bean.BookChapterBean; -import com.yzx.webebook.model.bean.CollBookBean; -import com.yzx.webebook.model.local.BookRepository; -import com.yzx.webebook.model.local.Void; -import com.yzx.webebook.utils.Charset; -import com.yzx.webebook.utils.Constant; -import com.yzx.webebook.utils.FileUtils; -import com.yzx.webebook.utils.IOUtils; -import com.yzx.webebook.utils.LogUtils; -import com.yzx.webebook.utils.MD5Utils; -import com.yzx.webebook.utils.RxUtils; -import com.yzx.webebook.utils.StringUtils; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.RandomAccessFile; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import io.reactivex.Single; -import io.reactivex.SingleEmitter; -import io.reactivex.SingleObserver; -import io.reactivex.SingleOnSubscribe; -import io.reactivex.disposables.Disposable; - -/** - * Created by newbiechen on 17-7-1. - * 问题: - * 1. 异常处理没有做好 - */ - -public class LocalPageLoader extends PageLoader { - private static final String TAG = "LocalPageLoader"; - //默认从文件中获取数据的长度 - private final static int BUFFER_SIZE = 50 * 1024; - //没有标题的时候,每个章节的最大长度 - private final static int MAX_LENGTH_WITH_NO_CHAPTER = 10 * 1024; - - // "序(章)|前言" - private final static Pattern mPreChapterPattern = Pattern.compile("^(\\s{0,10})((\u5e8f[\u7ae0\u8a00]?)|(\u524d\u8a00)|(\u6954\u5b50))(\\s{0,10})$", Pattern.MULTILINE); - - //正则表达式章节匹配模式 - // "(第)([0-9零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,10})([章节回集卷])(.*)" - private static final String[] CHAPTER_PATTERNS = new String[]{"^(.{0,8})(\u7b2c)([0-9\u96f6\u4e00\u4e8c\u4e24\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u58f9\u8d30\u53c1\u8086\u4f0d\u9646\u67d2\u634c\u7396\u62fe\u4f70\u4edf]{1,10})([\u7ae0\u8282\u56de\u96c6\u5377])(.{0,30})$", - "^(\\s{0,4})([\\(\u3010\u300a]?(\u5377)?)([0-9\u96f6\u4e00\u4e8c\u4e24\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u58f9\u8d30\u53c1\u8086\u4f0d\u9646\u67d2\u634c\u7396\u62fe\u4f70\u4edf]{1,10})([\\.:\uff1a\u0020\f\t])(.{0,30})$", - "^(\\s{0,4})([\\(\uff08\u3010\u300a])(.{0,30})([\\)\uff09\u3011\u300b])(\\s{0,2})$", - "^(\\s{0,4})(\u6b63\u6587)(.{0,20})$", - "^(.{0,4})(Chapter|chapter)(\\s{0,4})([0-9]{1,4})(.{0,30})$"}; - - //章节解析模式 - private Pattern mChapterPattern = null; - //获取书本的文件 - private File mBookFile; - //编码类型 - private Charset mCharset; - - private Disposable mChapterDisp = null; - - public LocalPageLoader(PageView pageView, CollBookBean collBook) { - super(pageView, collBook); - mStatus = STATUS_PARING; - } - - private List convertTxtChapter(List bookChapters) { - List txtChapters = new ArrayList<>(bookChapters.size()); - for (BookChapterBean bean : bookChapters) { - TxtChapter chapter = new TxtChapter(); - chapter.title = bean.getTitle(); - chapter.start = bean.getStart(); - chapter.end = bean.getEnd(); - txtChapters.add(chapter); - } - return txtChapters; - } - - /** - * 未完成的部分: - * 1. 序章的添加 - * 2. 章节存在的书本的虚拟分章效果 - * - * @throws IOException - */ - private void loadChapters() throws IOException { - List chapters = new ArrayList<>(); - //获取文件流 - RandomAccessFile bookStream = new RandomAccessFile(mBookFile, "r"); - //寻找匹配文章标题的正则表达式,判断是否存在章节名 - boolean hasChapter = checkChapterType(bookStream); - //加载章节 - byte[] buffer = new byte[BUFFER_SIZE]; - //获取到的块起始点,在文件中的位置 - long curOffset = 0; - //block的个数 - int blockPos = 0; - //读取的长度 - int length; - - //获取文件中的数据到buffer,直到没有数据为止 - while ((length = bookStream.read(buffer, 0, buffer.length)) > 0) { - ++blockPos; - //如果存在Chapter - if (hasChapter) { - //将数据转换成String - String blockContent = new String(buffer, 0, length, mCharset.getName()); - //当前Block下使过的String的指针 - int seekPos = 0; - //进行正则匹配 - Matcher matcher = mChapterPattern.matcher(blockContent); - //如果存在相应章节 - while (matcher.find()) { - //获取匹配到的字符在字符串中的起始位置 - int chapterStart = matcher.start(); - - //如果 seekPos == 0 && nextChapterPos != 0 表示当前block处前面有一段内容 - //第一种情况一定是序章 第二种情况可能是上一个章节的内容 - if (seekPos == 0 && chapterStart != 0) { - //获取当前章节的内容 - String chapterContent = blockContent.substring(seekPos, chapterStart); - //设置指针偏移 - seekPos += chapterContent.length(); - - //如果当前对整个文件的偏移位置为0的话,那么就是序章 - if (curOffset == 0) { - //创建序章 - TxtChapter preChapter = new TxtChapter(); - preChapter.title = "序章"; - preChapter.start = 0; - preChapter.end = chapterContent.getBytes(mCharset.getName()).length; //获取String的byte值,作为最终值 - - //如果序章大小大于30才添加进去 - if (preChapter.end - preChapter.start > 30) { - chapters.add(preChapter); - } - - //创建当前章节 - TxtChapter curChapter = new TxtChapter(); - curChapter.title = matcher.group(); - curChapter.start = preChapter.end; - chapters.add(curChapter); - } - //否则就block分割之后,上一个章节的剩余内容 - else { - //获取上一章节 - TxtChapter lastChapter = chapters.get(chapters.size() - 1); - //将当前段落添加上一章去 - lastChapter.end += chapterContent.getBytes(mCharset.getName()).length; - - //如果章节内容太小,则移除 - if (lastChapter.end - lastChapter.start < 30) { - chapters.remove(lastChapter); - } - - //创建当前章节 - TxtChapter curChapter = new TxtChapter(); - curChapter.title = matcher.group(); - curChapter.start = lastChapter.end; - chapters.add(curChapter); - } - } else { - //是否存在章节 - if (chapters.size() != 0) { - //获取章节内容 - String chapterContent = blockContent.substring(seekPos, matcher.start()); - seekPos += chapterContent.length(); - - //获取上一章节 - TxtChapter lastChapter = chapters.get(chapters.size() - 1); - lastChapter.end = lastChapter.start + chapterContent.getBytes(mCharset.getName()).length; - - //如果章节内容太小,则移除 - if (lastChapter.end - lastChapter.start < 30) { - chapters.remove(lastChapter); - } - - //创建当前章节 - TxtChapter curChapter = new TxtChapter(); - curChapter.title = matcher.group(); - curChapter.start = lastChapter.end; - chapters.add(curChapter); - } - //如果章节不存在则创建章节 - else { - TxtChapter curChapter = new TxtChapter(); - curChapter.title = matcher.group(); - curChapter.start = 0; - chapters.add(curChapter); - } - } - } - } - //进行本地虚拟分章 - else { - //章节在buffer的偏移量 - int chapterOffset = 0; - //当前剩余可分配的长度 - int strLength = length; - //分章的位置 - int chapterPos = 0; - - while (strLength > 0) { - ++chapterPos; - //是否长度超过一章 - if (strLength > MAX_LENGTH_WITH_NO_CHAPTER) { - //在buffer中一章的终止点 - int end = length; - //寻找换行符作为终止点 - for (int i = chapterOffset + MAX_LENGTH_WITH_NO_CHAPTER; i < length; ++i) { - if (buffer[i] == Charset.BLANK) { - end = i; - break; - } - } - TxtChapter chapter = new TxtChapter(); - chapter.title = "第" + blockPos + "章" + "(" + chapterPos + ")"; - chapter.start = curOffset + chapterOffset + 1; - chapter.end = curOffset + end; - chapters.add(chapter); - //减去已经被分配的长度 - strLength = strLength - (end - chapterOffset); - //设置偏移的位置 - chapterOffset = end; - } else { - TxtChapter chapter = new TxtChapter(); - chapter.title = "第" + blockPos + "章" + "(" + chapterPos + ")"; - chapter.start = curOffset + chapterOffset + 1; - chapter.end = curOffset + length; - chapters.add(chapter); - strLength = 0; - } - } - } - - //block的偏移点 - curOffset += length; - - if (hasChapter) { - //设置上一章的结尾 - TxtChapter lastChapter = chapters.get(chapters.size() - 1); - lastChapter.end = curOffset; - } - - //当添加的block太多的时候,执行GC - if (blockPos % 15 == 0) { - System.gc(); - System.runFinalization(); - } - } - - mChapterList = chapters; - IOUtils.close(bookStream); - - System.gc(); - System.runFinalization(); - } - - /** - * 从文件中提取一章的内容 - * - * @param chapter - * @return - */ - private byte[] getChapterContent(TxtChapter chapter) { - RandomAccessFile bookStream = null; - try { - bookStream = new RandomAccessFile(mBookFile, "r"); - bookStream.seek(chapter.start); - int extent = (int) (chapter.end - chapter.start); - byte[] content = new byte[extent]; - bookStream.read(content, 0, extent); - return content; - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - IOUtils.close(bookStream); - } - - return new byte[0]; - } - - /** - * 1. 检查文件中是否存在章节名 - * 2. 判断文件中使用的章节名类型的正则表达式 - * - * @return 是否存在章节名 - */ - private boolean checkChapterType(RandomAccessFile bookStream) throws IOException { - //首先获取128k的数据 - byte[] buffer = new byte[BUFFER_SIZE / 4]; - int length = bookStream.read(buffer, 0, buffer.length); - //进行章节匹配 - for (String str : CHAPTER_PATTERNS) { - Pattern pattern = Pattern.compile(str, Pattern.MULTILINE); - Matcher matcher = pattern.matcher(new String(buffer, 0, length, mCharset.getName())); - //如果匹配存在,那么就表示当前章节使用这种匹配方式 - if (matcher.find()) { - mChapterPattern = pattern; - //重置指针位置 - bookStream.seek(0); - return true; - } - } - - //重置指针位置 - bookStream.seek(0); - return false; - } - - @Override - public void saveRecord() { - super.saveRecord(); - //修改当前COllBook记录 - if (mCollBook != null && isChapterListPrepare) { - //表示当前CollBook已经阅读 - mCollBook.setIsUpdate(false); - mCollBook.setLastChapter(mChapterList.get(mCurChapterPos).getTitle()); - mCollBook.setLastRead(StringUtils. - dateConvert(System.currentTimeMillis(), Constant.FORMAT_BOOK_DATE)); - //直接更新 - BookRepository.getInstance() - .saveCollBook(mCollBook); - } - } - - @Override - public void closeBook() { - super.closeBook(); - if (mChapterDisp != null) { - mChapterDisp.dispose(); - mChapterDisp = null; - } - } - - @Override - public void refreshChapterList() { - // 对于文件是否存在,或者为空的判断,不作处理。 ==> 在文件打开前处理过了。 - mBookFile = new File(mCollBook.getCover()); - //获取文件编码 - mCharset = FileUtils.getCharset(mBookFile.getAbsolutePath()); - - String lastModified = StringUtils.dateConvert(mBookFile.lastModified(), Constant.FORMAT_BOOK_DATE); - - // 判断文件是否已经加载过,并具有缓存 - if (!mCollBook.isUpdate() && mCollBook.getUpdated() != null - && mCollBook.getUpdated().equals(lastModified) - && mCollBook.getBookChapters() != null) { - - mChapterList = convertTxtChapter(mCollBook.getBookChapters()); - isChapterListPrepare = true; - - //提示目录加载完成 - if (mPageChangeListener != null) { - mPageChangeListener.onCategoryFinish(mChapterList); - } - - // 加载并显示当前章节 - openChapter(); - - return; - } - - // 通过RxJava异步处理分章事件 - Single.create(new SingleOnSubscribe() { - @Override - public void subscribe(SingleEmitter e) throws Exception { - loadChapters(); - e.onSuccess(new Void()); - } - }).compose(RxUtils::toSimpleSingle) - .subscribe(new SingleObserver() { - @Override - public void onSubscribe(Disposable d) { - mChapterDisp = d; - } - - @Override - public void onSuccess(Void value) { - mChapterDisp = null; - isChapterListPrepare = true; - - // 提示目录加载完成 - if (mPageChangeListener != null) { - mPageChangeListener.onCategoryFinish(mChapterList); - } - - // 存储章节到数据库 - List bookChapterBeanList = new ArrayList<>(); - for (int i = 0; i < mChapterList.size(); ++i) { - TxtChapter chapter = mChapterList.get(i); - BookChapterBean bean = new BookChapterBean(); - bean.setId(MD5Utils.strToMd5By16(mBookFile.getAbsolutePath() - + File.separator + chapter.title)); // 将路径+i 作为唯一值 - bean.setTitle(chapter.getTitle()); - bean.setStart(chapter.getStart()); - bean.setUnreadble(false); - bean.setEnd(chapter.getEnd()); - bookChapterBeanList.add(bean); - } - mCollBook.setBookChapters(bookChapterBeanList); - mCollBook.setUpdated(lastModified); - - BookRepository.getInstance().saveBookChaptersWithAsync(bookChapterBeanList); - BookRepository.getInstance().saveCollBook(mCollBook); - - // 加载并显示当前章节 - openChapter(); - } - - @Override - public void onError(Throwable e) { - chapterError(); - LogUtils.d(TAG, "file load error:" + e.toString()); - } - }); - } - - @Override - protected BufferedReader getChapterReader(TxtChapter chapter) throws Exception { - //从文件中获取数据 - byte[] content = getChapterContent(chapter); - ByteArrayInputStream bais = new ByteArrayInputStream(content); - BufferedReader br = new BufferedReader(new InputStreamReader(bais, mCharset.getName())); - return br; - } - - @Override - protected boolean hasChapterData(TxtChapter chapter) { - return true; - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/page/NetPageLoader.java b/app/src/main/java/com/yzx/webebook/widget/page/NetPageLoader.java deleted file mode 100644 index 8f4652b..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/NetPageLoader.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.yzx.webebook.widget.page; - - - - -import com.yzx.webebook.model.bean.BookChapterBean; -import com.yzx.webebook.model.bean.CollBookBean; -import com.yzx.webebook.model.local.BookRepository; -import com.yzx.webebook.utils.BookManager; -import com.yzx.webebook.utils.Constant; -import com.yzx.webebook.utils.FileUtils; -import com.yzx.webebook.utils.StringUtils; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by newbiechen on 17-5-29. - * 网络页面加载器 - */ - -public class NetPageLoader extends PageLoader { - private static final String TAG = "PageFactory"; - - public NetPageLoader(PageView pageView, CollBookBean collBook) { - super(pageView, collBook); - } - - private List convertTxtChapter(List bookChapters) { - List txtChapters = new ArrayList<>(bookChapters.size()); - for (BookChapterBean bean : bookChapters) { - TxtChapter chapter = new TxtChapter(); - chapter.bookId = bean.getBookId(); - chapter.title = bean.getTitle(); - chapter.link = bean.getLink(); - txtChapters.add(chapter); - } - return txtChapters; - } - - @Override - public void refreshChapterList() { - if (mCollBook.getBookChapters() == null) return; - - // 将 BookChapter 转换成当前可用的 Chapter - mChapterList = convertTxtChapter(mCollBook.getBookChapters()); - isChapterListPrepare = true; - - // 目录加载完成,执行回调操作。 - if (mPageChangeListener != null) { - mPageChangeListener.onCategoryFinish(mChapterList); - } - - // 如果章节未打开 - if (!isChapterOpen()) { - // 打开章节 - openChapter(); - } - } - - @Override - protected BufferedReader getChapterReader(TxtChapter chapter) throws Exception { - File file = new File(Constant.BOOK_CACHE_PATH + mCollBook.get_id() - + File.separator + chapter.title + FileUtils.SUFFIX_NB); - if (!file.exists()) return null; - - Reader reader = new FileReader(file); - BufferedReader br = new BufferedReader(reader); - return br; - } - - @Override - protected boolean hasChapterData(TxtChapter chapter) { - return BookManager.isChapterCached(mCollBook.get_id(), chapter.title); - } - - // 装载上一章节的内容 - @Override - boolean parsePrevChapter() { - boolean isRight = super.parsePrevChapter(); - - if (mStatus == STATUS_FINISH) { - loadPrevChapter(); - } else if (mStatus == STATUS_LOADING) { - loadCurrentChapter(); - } - return isRight; - } - - // 装载当前章内容。 - @Override - boolean parseCurChapter() { - boolean isRight = super.parseCurChapter(); - - if (mStatus == STATUS_LOADING) { - loadCurrentChapter(); - } - return isRight; - } - - // 装载下一章节的内容 - @Override - boolean parseNextChapter() { - boolean isRight = super.parseNextChapter(); - - if (mStatus == STATUS_FINISH) { - loadNextChapter(); - } else if (mStatus == STATUS_LOADING) { - loadCurrentChapter(); - } - - return isRight; - } - - /** - * 加载当前页的前面两个章节 - */ - private void loadPrevChapter() { - if (mPageChangeListener != null) { - int end = mCurChapterPos; - int begin = end - 2; - if (begin < 0) { - begin = 0; - } - - requestChapters(begin, end); - } - } - - /** - * 加载前一页,当前页,后一页。 - */ - private void loadCurrentChapter() { - if (mPageChangeListener != null) { - int begin = mCurChapterPos; - int end = mCurChapterPos; - - // 是否当前不是最后一章 - if (end < mChapterList.size()) { - end = end + 1; - if (end >= mChapterList.size()) { - end = mChapterList.size() - 1; - } - } - - // 如果当前不是第一章 - if (begin != 0) { - begin = begin - 1; - if (begin < 0) { - begin = 0; - } - } - - requestChapters(begin, end); - } - } - - /** - * 加载当前页的后两个章节 - */ - private void loadNextChapter() { - if (mPageChangeListener != null) { - - // 提示加载后两章 - int begin = mCurChapterPos + 1; - int end = begin + 1; - - // 判断是否大于最后一章 - if (begin >= mChapterList.size()) { - // 如果下一章超出目录了,就没有必要加载了 - return; - } - - if (end > mChapterList.size()) { - end = mChapterList.size() - 1; - } - - requestChapters(begin, end); - } - } - - private void requestChapters(int start, int end) { - // 检验输入值 - if (start < 0) { - start = 0; - } - - if (end >= mChapterList.size()) { - end = mChapterList.size() - 1; - } - - - List chapters = new ArrayList<>(); - - // 过滤,哪些数据已经加载了 - for (int i = start; i <= end; ++i) { - TxtChapter txtChapter = mChapterList.get(i); - if (!hasChapterData(txtChapter)) { - chapters.add(txtChapter); - } - } - - if (!chapters.isEmpty()) { - mPageChangeListener.requestChapters(chapters); - } - } - - @Override - public void saveRecord() { - super.saveRecord(); - if (mCollBook != null && isChapterListPrepare) { - //表示当前CollBook已经阅读 - mCollBook.setIsUpdate(false); - mCollBook.setLastRead(StringUtils. - dateConvert(System.currentTimeMillis(), Constant.FORMAT_BOOK_DATE)); - //直接更新 - BookRepository.getInstance() - .saveCollBook(mCollBook); - } - } -} - diff --git a/app/src/main/java/com/yzx/webebook/widget/page/PageLoader.java b/app/src/main/java/com/yzx/webebook/widget/page/PageLoader.java deleted file mode 100644 index d65a3aa..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/PageLoader.java +++ /dev/null @@ -1,1495 +0,0 @@ -package com.yzx.webebook.widget.page; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Typeface; -import android.text.TextPaint; -import android.util.Log; - - -import androidx.core.content.ContextCompat; - -import com.blankj.utilcode.util.NumberUtils; -import com.yzx.webebook.model.bean.BookCount; -import com.yzx.webebook.model.bean.BookRecordBean; -import com.yzx.webebook.model.bean.ChapterPageCount; -import com.yzx.webebook.model.bean.CollBookBean; -import com.yzx.webebook.model.local.BookRepository; -import com.yzx.webebook.model.local.LocalRepository; -import com.yzx.webebook.model.local.ReadSettingManager; -import com.yzx.webebook.utils.Constant; -import com.yzx.webebook.utils.IOUtils; -import com.yzx.webebook.utils.MD5Utils; -import com.yzx.webebook.utils.RxUtils; -import com.yzx.webebook.utils.ScreenUtils; -import com.yzx.webebook.utils.StringUtils; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.Single; -import io.reactivex.SingleEmitter; -import io.reactivex.SingleObserver; -import io.reactivex.SingleOnSubscribe; -import io.reactivex.disposables.Disposable; - -/** - * Created by newbiechen on 17-7-1. - */ - -public abstract class PageLoader { - private static final String TAG = "PageLoader"; - - // 当前页面的状态 - public static final int STATUS_LOADING = 1; // 正在加载 - public static final int STATUS_FINISH = 2; // 加载完成 - public static final int STATUS_ERROR = 3; // 加载错误 (一般是网络加载情况) - public static final int STATUS_EMPTY = 4; // 空数据 - public static final int STATUS_PARING = 5; // 正在解析 (装载本地数据) - public static final int STATUS_PARSE_ERROR = 6; // 本地文件解析错误(暂未被使用) - public static final int STATUS_CATEGORY_EMPTY = 7; // 获取到的目录为空 - // 默认的显示参数配置 - private static final int DEFAULT_MARGIN_HEIGHT = 28; - private static final int DEFAULT_MARGIN_WIDTH = 15; - private static final int DEFAULT_TIP_SIZE = 12; - private static final int EXTRA_TITLE_SIZE = 4; - - // 当前章节列表 - protected List mChapterList; - // 书本对象 - protected CollBookBean mCollBook; - // 监听器 - protected OnPageChangeListener mPageChangeListener; - - private Context mContext; - // 页面显示类 - private PageView mPageView; - // 当前显示的页 - private TxtPage mCurPage; - // 上一章的页面列表缓存 - private List mPrePageList; - // 当前章节的页面列表 - private List mCurPageList; - // 下一章的页面列表缓存 - private List mNextPageList; - - // 绘制电池的画笔 - private Paint mBatteryPaint; - // 绘制提示的画笔 - private Paint mTipPaint; - // 绘制标题的画笔 - private Paint mTitlePaint; - // 绘制背景颜色的画笔(用来擦除需要重绘的部分) - private Paint mBgPaint; - // 绘制小说内容的画笔 - private TextPaint mTextPaint; - // 阅读器的配置选项 - private ReadSettingManager mSettingManager; - // 被遮盖的页,或者认为被取消显示的页 - private TxtPage mCancelPage; - // 存储阅读记录类 - private BookRecordBean mBookRecord; - - private Disposable mPreLoadDisp; - - /*****************params**************************/ - // 当前的状态 - protected int mStatus = STATUS_LOADING; - // 判断章节列表是否加载完成 - protected boolean isChapterListPrepare; - - // 是否打开过章节 - private boolean isChapterOpen; - private boolean isFirstOpen = true; - private boolean isClose; - // 页面的翻页效果模式 - private PageMode mPageMode; - // 加载器的颜色主题 - private PageStyle mPageStyle; - //当前是否是夜间模式 - private boolean isNightMode; - //书籍绘制区域的宽高 - private int mVisibleWidth; - private int mVisibleHeight; - //应用的宽高 - private int mDisplayWidth; - private int mDisplayHeight; - //间距 - private int mMarginWidth; - private int mMarginHeight; - //字体的颜色 - private int mTextColor; - //标题的大小 - private int mTitleSize; - //字体的大小 - private int mTextSize; - //行间距 - private int mTextInterval; - //标题的行间距 - private int mTitleInterval; - //段落距离(基于行间距的额外距离) - private int mTextPara; - private int mTitlePara; - //电池的百分比 - private int mBatteryLevel; - //当前页面的背景 - private int mBgColor; - - // 当前章 - protected int mCurChapterPos = 0; - //上一章的记录 - private int mLastChapterPos = 0; - - /*****************************init params*******************************/ - public PageLoader(PageView pageView, CollBookBean collBook) { - mPageView = pageView; - mContext = pageView.getContext(); - mCollBook = collBook; - mChapterList = new ArrayList<>(1); - - // 初始化数据 - initData(); - // 初始化画笔 - initPaint(); - // 初始化PageView - initPageView(); - // 初始化书籍 - prepareBook(); - } - - private void initData() { - // 获取配置管理器 - mSettingManager = ReadSettingManager.getInstance(); - // 获取配置参数 - mPageMode = mSettingManager.getPageMode(); - mPageStyle = mSettingManager.getPageStyle(); - // 初始化参数 - mMarginWidth = ScreenUtils.dpToPx(DEFAULT_MARGIN_WIDTH); - mMarginHeight = ScreenUtils.dpToPx(DEFAULT_MARGIN_HEIGHT); - // 配置文字有关的参数 - setUpTextParams(mSettingManager.getTextSize()); - } - - /** - * 作用:设置与文字相关的参数 - * - * @param textSize - */ - private void setUpTextParams(int textSize) { - // 文字大小 - mTextSize = textSize; - mTitleSize = mTextSize + ScreenUtils.spToPx(EXTRA_TITLE_SIZE); - // 行间距(大小为字体的一半) - mTextInterval = mTextSize / 2; - mTitleInterval = mTitleSize / 2; - // 段落间距(大小为字体的高度) - mTextPara = mTextSize; - mTitlePara = mTitleSize; - } - - private void initPaint() { - // 绘制提示的画笔 - mTipPaint = new Paint(); - mTipPaint.setColor(mTextColor); - mTipPaint.setTextAlign(Paint.Align.LEFT); // 绘制的起始点 - mTipPaint.setTextSize(ScreenUtils.spToPx(DEFAULT_TIP_SIZE)); // Tip默认的字体大小 - mTipPaint.setAntiAlias(true); - mTipPaint.setSubpixelText(true); - - // 绘制页面内容的画笔 - mTextPaint = new TextPaint(); - mTextPaint.setColor(mTextColor); - mTextPaint.setTextSize(mTextSize); - mTextPaint.setAntiAlias(true); - - // 绘制标题的画笔 - mTitlePaint = new TextPaint(); - mTitlePaint.setColor(mTextColor); - mTitlePaint.setTextSize(mTitleSize); - mTitlePaint.setStyle(Paint.Style.FILL_AND_STROKE); - mTitlePaint.setTypeface(Typeface.DEFAULT_BOLD); - mTitlePaint.setAntiAlias(true); - - // 绘制背景的画笔 - mBgPaint = new Paint(); - mBgPaint.setColor(mBgColor); - - // 绘制电池的画笔 - mBatteryPaint = new Paint(); - mBatteryPaint.setAntiAlias(true); - mBatteryPaint.setDither(true); - - // 初始化页面样式 - setNightMode(mSettingManager.isNightMode()); - } - - private void initPageView() { - //配置参数 - mPageView.setPageMode(mPageMode); - mPageView.setBgColor(mBgColor); - } - - /****************************** public method***************************/ - /** - * 跳转到上一章 - * - * @return - */ - public boolean skipPreChapter() { - if (!hasPrevChapter()) { - return false; - } - - // 载入上一章。 - if (parsePrevChapter()) { - mCurPage = getCurPage(0); - } else { - mCurPage = new TxtPage(); - } - mPageView.drawCurPage(false); - return true; - } - - /** - * 跳转到下一章 - * - * @return - */ - public boolean skipNextChapter() { - if (!hasNextChapter()) { - return false; - } - - //判断是否达到章节的终止点 - if (parseNextChapter()) { - mCurPage = getCurPage(0); - } else { - mCurPage = new TxtPage(); - } - mPageView.drawCurPage(false); - return true; - } - - /** - * 跳转到指定章节 - * - * @param pos:从 0 开始。 - */ - public void skipToChapter(int pos) { - // 设置参数 - mCurChapterPos = pos; - - // 将上一章的缓存设置为null - mPrePageList = null; - // 如果当前下一章缓存正在执行,则取消 - if (mPreLoadDisp != null) { - mPreLoadDisp.dispose(); - } - // 将下一章缓存设置为null - mNextPageList = null; - - // 打开指定章节 - openChapter(); - } - - /** - * 跳转到指定的页 - * - * @param pos - */ - public boolean skipToPage(int pos) { - if (!isChapterListPrepare) { - return false; - } - mCurPage = getCurPage(pos); - mPageView.drawCurPage(false); - return true; - } - - /** - * 翻到上一页 - * - * @return - */ - public boolean skipToPrePage() { - return mPageView.autoPrevPage(); - } - - /** - * 翻到下一页 - * - * @return - */ - public boolean skipToNextPage() { - return mPageView.autoNextPage(); - } - - /** - * 更新时间 - */ - public void updateTime() { - if (!mPageView.isRunning()) { - mPageView.drawCurPage(true); - } - } - - /** - * 更新电量 - * - * @param level - */ - public void updateBattery(int level) { - mBatteryLevel = level; - - if (!mPageView.isRunning()) { - mPageView.drawCurPage(true); - } - } - - /** - * 设置提示的文字大小 - * - * @param textSize:单位为 px。 - */ - public void setTipTextSize(int textSize) { - mTipPaint.setTextSize(textSize); - - // 如果屏幕大小加载完成 - mPageView.drawCurPage(false); - } - - /** - * 设置文字相关参数 - * - * @param textSize - */ - public void setTextSize(int textSize) { - // 设置文字相关参数 - setUpTextParams(textSize); - - // 设置画笔的字体大小 - mTextPaint.setTextSize(mTextSize); - // 设置标题的字体大小 - mTitlePaint.setTextSize(mTitleSize); - // 存储文字大小 - mSettingManager.setTextSize(mTextSize); - // 取消缓存 - mPrePageList = null; - mNextPageList = null; - - // 如果当前已经显示数据 - if (isChapterListPrepare && mStatus == STATUS_FINISH) { - // 重新计算当前页面 - dealLoadPageList(mCurChapterPos); - - // 防止在最后一页,通过修改字体,以至于页面数减少导致崩溃的问题 - if (mCurPage.position >= mCurPageList.size()) { - mCurPage.position = mCurPageList.size() - 1; - } - - // 重新获取指定页面 - mCurPage = mCurPageList.get(mCurPage.position); - -// getTotalPage(true); - } - - mPageView.drawCurPage(false); - } - - /** - * 设置夜间模式 - * - * @param nightMode - */ - public void setNightMode(boolean nightMode) { - mSettingManager.setNightMode(nightMode); - isNightMode = nightMode; - - if (isNightMode) { - mBatteryPaint.setColor(Color.WHITE); - setPageStyle(PageStyle.NIGHT); - } else { - mBatteryPaint.setColor(Color.BLACK); - setPageStyle(mPageStyle); - } - } - - /** - * 设置页面样式 - * - * @param pageStyle:页面样式 - */ - public void setPageStyle(PageStyle pageStyle) { - if (pageStyle != PageStyle.NIGHT) { - mPageStyle = pageStyle; - mSettingManager.setPageStyle(pageStyle); - } - - if (isNightMode && pageStyle != PageStyle.NIGHT) { - return; - } - - // 设置当前颜色样式 - mTextColor = ContextCompat.getColor(mContext, pageStyle.getFontColor()); - mBgColor = ContextCompat.getColor(mContext, pageStyle.getBgColor()); - - mTipPaint.setColor(mTextColor); - mTitlePaint.setColor(mTextColor); - mTextPaint.setColor(mTextColor); - - mBgPaint.setColor(mBgColor); - - mPageView.drawCurPage(false); - } - - /** - * 翻页动画 - * - * @param pageMode:翻页模式 - * @see PageMode - */ - public void setPageMode(PageMode pageMode) { - mPageMode = pageMode; - - mPageView.setPageMode(mPageMode); - mSettingManager.setPageMode(mPageMode); - - // 重新绘制当前页 - mPageView.drawCurPage(false); - } - - /** - * 设置内容与屏幕的间距 - * - * @param marginWidth :单位为 px - * @param marginHeight :单位为 px - */ - public void setMargin(int marginWidth, int marginHeight) { - mMarginWidth = marginWidth; - mMarginHeight = marginHeight; - - // 如果是滑动动画,则需要重新创建了 - if (mPageMode == PageMode.SCROLL) { - mPageView.setPageMode(PageMode.SCROLL); - } - - mPageView.drawCurPage(false); - } - - /** - * 设置页面切换监听 - * - * @param listener - */ - public void setOnPageChangeListener(OnPageChangeListener listener) { - mPageChangeListener = listener; - - // 如果目录加载完之后才设置监听器,那么会默认回调 - if (isChapterListPrepare) { - mPageChangeListener.onCategoryFinish(mChapterList); - } - } - - /** - * 获取当前页的状态 - * - * @return - */ - public int getPageStatus() { - return mStatus; - } - - /** - * 获取书籍信息 - * - * @return - */ - public CollBookBean getCollBook() { - return mCollBook; - } - - /** - * 获取章节目录。 - * - * @return - */ - public List getChapterCategory() { - return mChapterList; - } - - /** - * 获取当前页的页码 - * - * @return - */ - public int getPagePos() { - return mCurPage.position; - } - - /** - * 获取当前章节的章节位置 - * - * @return - */ - public int getChapterPos() { - return mCurChapterPos; - } - - /** - * 获取距离屏幕的高度 - * - * @return - */ - public int getMarginHeight() { - return mMarginHeight; - } - - /** - * 保存阅读记录 - */ - public void saveRecord() { - - if (mChapterList.isEmpty()) { - return; - } - - mBookRecord.setBookId(mCollBook.get_id()); - mBookRecord.setChapter(mCurChapterPos); - - if (mCurPage != null) { - mBookRecord.setPagePos(mCurPage.position); - } else { - mBookRecord.setPagePos(0); - } - - //存储到数据库 - BookRepository.getInstance() - .saveBookRecord(mBookRecord); - } - - /** - * 初始化书籍 - */ - private void prepareBook() { - mBookRecord = BookRepository.getInstance() - .getBookRecord(mCollBook.get_id()); - - if (mBookRecord == null) { - mBookRecord = new BookRecordBean(); - } - - mCurChapterPos = mBookRecord.getChapter(); - mLastChapterPos = mCurChapterPos; - } - - /** - * 打开指定章节 - */ - public void openChapter() { - isFirstOpen = false; - - if (!mPageView.isPrepare()) { - return; - } - - // 如果章节目录没有准备好 - if (!isChapterListPrepare) { - mStatus = STATUS_LOADING; - mPageView.drawCurPage(false); - return; - } - - // 如果获取到的章节目录为空 - if (mChapterList.isEmpty()) { - mStatus = STATUS_CATEGORY_EMPTY; - mPageView.drawCurPage(false); - return; - } - - if (parseCurChapter()) { - // 如果章节从未打开 - if (!isChapterOpen) { - int position = mBookRecord.getPagePos(); - - // 防止记录页的页号,大于当前最大页号 - if (position >= mCurPageList.size()) { - position = mCurPageList.size() - 1; - } - mCurPage = getCurPage(position); - mCancelPage = mCurPage; - // 切换状态 - isChapterOpen = true; - } else { - mCurPage = getCurPage(0); - } - } else { - mCurPage = new TxtPage(); - } - - mPageView.drawCurPage(false); - } - - public void chapterError() { - //加载错误 - mStatus = STATUS_ERROR; - mPageView.drawCurPage(false); - } - - /** - * 关闭书本 - */ - public void closeBook() { - isChapterListPrepare = false; - isClose = true; - - if (mPreLoadDisp != null) { - mPreLoadDisp.dispose(); - } - - clearList(mChapterList); - clearList(mCurPageList); - clearList(mNextPageList); - - mChapterList = null; - mCurPageList = null; - mNextPageList = null; - mPageView = null; - mCurPage = null; - } - - private void clearList(List list) { - if (list != null) { - list.clear(); - } - } - - public boolean isClose() { - return isClose; - } - - public boolean isChapterOpen() { - return isChapterOpen; - } - - /** - * 加载页面列表 - * - * @param chapterPos:章节序号 - * @return - */ - private List loadPageList(int chapterPos) throws Exception { - // 获取章节 - TxtChapter chapter = mChapterList.get(chapterPos); - // 判断章节是否存在 - if (!hasChapterData(chapter)) { - return null; - } - // 获取章节的文本流 - BufferedReader reader = getChapterReader(chapter); - List chapters = loadPages(chapter, reader); - - return chapters; - } - - /*******************************abstract method***************************************/ - - /** - * 刷新章节列表 - */ - public abstract void refreshChapterList(); - - /** - * 获取章节的文本流 - * - * @param chapter - * @return - */ - protected abstract BufferedReader getChapterReader(TxtChapter chapter) throws Exception; - - /** - * 章节数据是否存在 - * - * @return - */ - protected abstract boolean hasChapterData(TxtChapter chapter); - - /***********************************default method***********************************************/ - - void drawPage(Bitmap bitmap, boolean isUpdate) { - drawBackground(mPageView.getBgBitmap(), isUpdate); - if (!isUpdate) { - drawContent(bitmap); - } - //更新绘制 - mPageView.invalidate(); - } - - private int getTotalPage() { - return getTotalPage(false); - } - - private int getTotalPage(boolean update) { -// int total = LocalRepository.getInstance().getBookCount(mCollBook.get_id()); -// if (total > 0 && !update) { -// return total; -// } - - int size = 0; - List chapterPageCountsList = new ArrayList<>(); - for (TxtChapter txtChapter : mChapterList) { - int index = mChapterList.indexOf(txtChapter); - - try { - List list = loadPageList(index); - size += list.size(); - chapterPageCountsList.add(new ChapterPageCount(MD5Utils.strToMd5By16(txtChapter.title), list.size(), mCollBook.get_id())); - } catch (Exception e) { - e.printStackTrace(); - } - } -// LocalRepository.getInstance().saveChapterCount(chapterPageCountsList); -// LocalRepository.getInstance().saveBookCount(new BookCount(mCollBook.get_id(), size)); - return size; - } - - public String getPercent(){ - float currPercent = (mCurPage.position + 1.0f) / mCurPageList.size(); - float step = 1.0f / mChapterList.size(); - float currChapPercent = 1.0f * mCurChapterPos * step; -// String percent = (mCurPage.position + 1) + "/" + mCurPageList.size(); - String percent = NumberUtils.format((currChapPercent + (currPercent * step))*100f, 2); - - return percent; - } - - private void drawBackground(Bitmap bitmap, boolean isUpdate) { - Canvas canvas = new Canvas(bitmap); - int tipMarginHeight = ScreenUtils.dpToPx(3); - if (!isUpdate) { - /****绘制背景****/ - canvas.drawColor(mBgColor); - - if (!mChapterList.isEmpty()) { - /*****初始化标题的参数********/ - //需要注意的是:绘制text的y的起始点是text的基准线的位置,而不是从text的头部的位置 - float tipTop = tipMarginHeight - mTipPaint.getFontMetrics().top; - //根据状态不一样,数据不一样 - if (mStatus != STATUS_FINISH) { - if (isChapterListPrepare) { - canvas.drawText(mChapterList.get(mCurChapterPos).getTitle() - , mMarginWidth, tipTop, mTipPaint); - } - } else { - canvas.drawText(mCurPage.title, mMarginWidth, tipTop, mTipPaint); - } - - /******绘制页码********/ - // 底部的字显示的位置Y - float y = mDisplayHeight - mTipPaint.getFontMetrics().bottom - tipMarginHeight; - // 只有finish的时候采用页码 - if (mStatus == STATUS_FINISH) { - canvas.drawText(getPercent() + "%", mMarginWidth, y, mTipPaint); - } - } - } else { - //擦除区域 - mBgPaint.setColor(mBgColor); - canvas.drawRect(mDisplayWidth / 2, mDisplayHeight - mMarginHeight + ScreenUtils.dpToPx(2), mDisplayWidth, mDisplayHeight, mBgPaint); - } - - /******绘制电池********/ - - int visibleRight = mDisplayWidth - mMarginWidth; - int visibleBottom = mDisplayHeight - tipMarginHeight; - - int outFrameWidth = (int) mTipPaint.measureText("xxx"); - int outFrameHeight = (int) mTipPaint.getTextSize(); - - int polarHeight = ScreenUtils.dpToPx(6); - int polarWidth = ScreenUtils.dpToPx(2); - int border = 1; - int innerMargin = 1; - - //电极的制作 - int polarLeft = visibleRight - polarWidth; - int polarTop = visibleBottom - (outFrameHeight + polarHeight) / 2; - Rect polar = new Rect(polarLeft, polarTop, visibleRight, - polarTop + polarHeight - ScreenUtils.dpToPx(2)); - - mBatteryPaint.setStyle(Paint.Style.FILL); - canvas.drawRect(polar, mBatteryPaint); - - //外框的制作 - int outFrameLeft = polarLeft - outFrameWidth; - int outFrameTop = visibleBottom - outFrameHeight; - int outFrameBottom = visibleBottom - ScreenUtils.dpToPx(2); - Rect outFrame = new Rect(outFrameLeft, outFrameTop, polarLeft, outFrameBottom); - - mBatteryPaint.setStyle(Paint.Style.STROKE); - mBatteryPaint.setStrokeWidth(border); - canvas.drawRect(outFrame, mBatteryPaint); - - //内框的制作 - float innerWidth = (outFrame.width() - innerMargin * 2 - border) * (mBatteryLevel / 100.0f); - RectF innerFrame = new RectF(outFrameLeft + border + innerMargin, outFrameTop + border + innerMargin, - outFrameLeft + border + innerMargin + innerWidth, outFrameBottom - border - innerMargin); - - mBatteryPaint.setStyle(Paint.Style.FILL); - canvas.drawRect(innerFrame, mBatteryPaint); - - /******绘制当前时间********/ - //底部的字显示的位置Y - float y = mDisplayHeight - mTipPaint.getFontMetrics().bottom - tipMarginHeight; - String time = StringUtils.dateConvert(System.currentTimeMillis(), Constant.FORMAT_TIME); - float x = outFrameLeft - mTipPaint.measureText(time) - ScreenUtils.dpToPx(4); - canvas.drawText(time, x, y, mTipPaint); - } - - private void drawContent(Bitmap bitmap) { - Canvas canvas = new Canvas(bitmap); - - if (mPageMode == PageMode.SCROLL) { - canvas.drawColor(mBgColor); - } - /******绘制内容****/ - - if (mStatus != STATUS_FINISH) { - //绘制字体 - String tip = ""; - switch (mStatus) { - case STATUS_LOADING: - tip = "正在拼命加载中..."; - break; - case STATUS_ERROR: - tip = "加载失败(点击边缘重试)"; - break; - case STATUS_EMPTY: - tip = "文章内容为空"; - break; - case STATUS_PARING: - tip = "正在排版请等待..."; - break; - case STATUS_PARSE_ERROR: - tip = "文件解析错误"; - break; - case STATUS_CATEGORY_EMPTY: - tip = "目录列表为空"; - break; - } - - //将提示语句放到正中间 - Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics(); - float textHeight = fontMetrics.top - fontMetrics.bottom; - float textWidth = mTextPaint.measureText(tip); - float pivotX = (mDisplayWidth - textWidth) / 2; - float pivotY = (mDisplayHeight - textHeight) / 2; - canvas.drawText(tip, pivotX, pivotY, mTextPaint); - } else { - float top; - - if (mPageMode == PageMode.SCROLL) { - top = -mTextPaint.getFontMetrics().top; - } else { - top = mMarginHeight - mTextPaint.getFontMetrics().top; - } - - //设置总距离 - int interval = mTextInterval + (int) mTextPaint.getTextSize(); - int para = mTextPara + (int) mTextPaint.getTextSize(); - int titleInterval = mTitleInterval + (int) mTitlePaint.getTextSize(); - int titlePara = mTitlePara + (int) mTextPaint.getTextSize(); - String str = null; - - //对标题进行绘制 - for (int i = 0; i < mCurPage.titleLines; ++i) { - str = mCurPage.lines.get(i); - - //设置顶部间距 - if (i == 0) { - top += mTitlePara; - } - - //计算文字显示的起始点 - int start = (int) (mDisplayWidth - mTitlePaint.measureText(str)) / 2; - //进行绘制 - canvas.drawText(str, start, top, mTitlePaint); - - //设置尾部间距 - if (i == mCurPage.titleLines - 1) { - top += titlePara; - } else { - //行间距 - top += titleInterval; - } - } - - //对内容进行绘制 - for (int i = mCurPage.titleLines; i < mCurPage.lines.size(); ++i) { - str = mCurPage.lines.get(i); - - canvas.drawText(str, mMarginWidth, top, mTextPaint); - if (str.endsWith("\n")) { - top += para; - } else { - top += interval; - } - } - } - } - - void prepareDisplay(int w, int h) { - // 获取PageView的宽高 - mDisplayWidth = w; - mDisplayHeight = h; - - // 获取内容显示位置的大小 - mVisibleWidth = mDisplayWidth - mMarginWidth * 2; - mVisibleHeight = mDisplayHeight - mMarginHeight * 2; - - // 重置 PageMode - mPageView.setPageMode(mPageMode); - - if (!isChapterOpen) { - // 展示加载界面 - mPageView.drawCurPage(false); - // 如果在 display 之前调用过 openChapter 肯定是无法打开的。 - // 所以需要通过 display 再重新调用一次。 - if (!isFirstOpen) { - // 打开书籍 - openChapter(); - } - } else { - // 如果章节已显示,那么就重新计算页面 - if (mStatus == STATUS_FINISH) { - dealLoadPageList(mCurChapterPos); - // 重新设置文章指针的位置 - mCurPage = getCurPage(mCurPage.position); - } - mPageView.drawCurPage(false); - } - } - - /** - * 翻阅上一页 - * - * @return - */ - boolean prev() { - // 以下情况禁止翻页 - if (!canTurnPage()) { - return false; - } - - if (mStatus == STATUS_FINISH) { - // 先查看是否存在上一页 - TxtPage prevPage = getPrevPage(); - if (prevPage != null) { - mCancelPage = mCurPage; - mCurPage = prevPage; - mPageView.drawNextPage(); - return true; - } - } - - if (!hasPrevChapter()) { - return false; - } - - mCancelPage = mCurPage; - if (parsePrevChapter()) { - mCurPage = getPrevLastPage(); - } else { - mCurPage = new TxtPage(); - } - mPageView.drawNextPage(); - return true; - } - - /** - * 解析上一章数据 - * - * @return:数据是否解析成功 - */ - boolean parsePrevChapter() { - // 加载上一章数据 - int prevChapter = mCurChapterPos - 1; - - mLastChapterPos = mCurChapterPos; - mCurChapterPos = prevChapter; - - // 当前章缓存为下一章 - mNextPageList = mCurPageList; - - // 判断是否具有上一章缓存 - if (mPrePageList != null) { - mCurPageList = mPrePageList; - mPrePageList = null; - - // 回调 - chapterChangeCallback(); - } else { - dealLoadPageList(prevChapter); - } - return mCurPageList != null ? true : false; - } - - private boolean hasPrevChapter() { - //判断是否上一章节为空 - if (mCurChapterPos - 1 < 0) { - return false; - } - return true; - } - - /** - * 翻到下一页 - * - * @return:是否允许翻页 - */ - boolean next() { - // 以下情况禁止翻页 - if (!canTurnPage()) { - return false; - } - - if (mStatus == STATUS_FINISH) { - // 先查看是否存在下一页 - TxtPage nextPage = getNextPage(); - if (nextPage != null) { - mCancelPage = mCurPage; - mCurPage = nextPage; - mPageView.drawNextPage(); - return true; - } - } - - if (!hasNextChapter()) { - return false; - } - - mCancelPage = mCurPage; - // 解析下一章数据 - if (parseNextChapter()) { - mCurPage = mCurPageList.get(0); - } else { - mCurPage = new TxtPage(); - } - mPageView.drawNextPage(); - return true; - } - - private boolean hasNextChapter() { - // 判断是否到达目录最后一章 - if (mCurChapterPos + 1 >= mChapterList.size()) { - return false; - } - return true; - } - - boolean parseCurChapter() { - // 解析数据 - dealLoadPageList(mCurChapterPos); - // 预加载下一页面 - preLoadNextChapter(); - return mCurPageList != null ? true : false; - } - - /** - * 解析下一章数据 - * - * @return:返回解析成功还是失败 - */ - boolean parseNextChapter() { - int nextChapter = mCurChapterPos + 1; - - mLastChapterPos = mCurChapterPos; - mCurChapterPos = nextChapter; - - // 将当前章的页面列表,作为上一章缓存 - mPrePageList = mCurPageList; - - // 是否下一章数据已经预加载了 - if (mNextPageList != null) { - mCurPageList = mNextPageList; - mNextPageList = null; - // 回调 - chapterChangeCallback(); - } else { - // 处理页面解析 - dealLoadPageList(nextChapter); - } - // 预加载下一页面 - preLoadNextChapter(); - return mCurPageList != null ? true : false; - } - - private void dealLoadPageList(int chapterPos) { - try { - mCurPageList = loadPageList(chapterPos); - if (mCurPageList != null) { - if (mCurPageList.isEmpty()) { - mStatus = STATUS_EMPTY; - - // 添加一个空数据 - TxtPage page = new TxtPage(); - page.lines = new ArrayList<>(1); - mCurPageList.add(page); - } else { - mStatus = STATUS_FINISH; - } - } else { - mStatus = STATUS_LOADING; - } - } catch (Exception e) { - e.printStackTrace(); - - mCurPageList = null; - mStatus = STATUS_ERROR; - } - - // 回调 - chapterChangeCallback(); - } - - private void chapterChangeCallback() { - if (mPageChangeListener != null) { - mPageChangeListener.onChapterChange(mCurChapterPos); - mPageChangeListener.onPageCountChange(mCurPageList != null ? mCurPageList.size() : 0); - } - } - - // 预加载下一章 - private void preLoadNextChapter() { - int nextChapter = mCurChapterPos + 1; - - // 如果不存在下一章,且下一章没有数据,则不进行加载。 - if (!hasNextChapter() - || !hasChapterData(mChapterList.get(nextChapter))) { - return; - } - - //如果之前正在加载则取消 - if (mPreLoadDisp != null) { - mPreLoadDisp.dispose(); - } - - //调用异步进行预加载加载 - Single.create(new SingleOnSubscribe>() { - @Override - public void subscribe(SingleEmitter> e) throws Exception { - e.onSuccess(loadPageList(nextChapter)); - } - }).compose(RxUtils::toSimpleSingle) - .subscribe(new SingleObserver>() { - @Override - public void onSubscribe(Disposable d) { - mPreLoadDisp = d; - } - - @Override - public void onSuccess(List pages) { - mNextPageList = pages; - } - - @Override - public void onError(Throwable e) { - //无视错误 - } - }); - } - - // 取消翻页 - void pageCancel() { - if (mCurPage.position == 0 && mCurChapterPos > mLastChapterPos) { // 加载到下一章取消了 - if (mPrePageList != null) { - cancelNextChapter(); - } else { - if (parsePrevChapter()) { - mCurPage = getPrevLastPage(); - } else { - mCurPage = new TxtPage(); - } - } - } else if (mCurPageList == null - || (mCurPage.position == mCurPageList.size() - 1 - && mCurChapterPos < mLastChapterPos)) { // 加载上一章取消了 - - if (mNextPageList != null) { - cancelPreChapter(); - } else { - if (parseNextChapter()) { - mCurPage = mCurPageList.get(0); - } else { - mCurPage = new TxtPage(); - } - } - } else { - // 假设加载到下一页,又取消了。那么需要重新装载。 - mCurPage = mCancelPage; - } - } - - private void cancelNextChapter() { - int temp = mLastChapterPos; - mLastChapterPos = mCurChapterPos; - mCurChapterPos = temp; - - mNextPageList = mCurPageList; - mCurPageList = mPrePageList; - mPrePageList = null; - - chapterChangeCallback(); - - mCurPage = getPrevLastPage(); - mCancelPage = null; - } - - private void cancelPreChapter() { - // 重置位置点 - int temp = mLastChapterPos; - mLastChapterPos = mCurChapterPos; - mCurChapterPos = temp; - // 重置页面列表 - mPrePageList = mCurPageList; - mCurPageList = mNextPageList; - mNextPageList = null; - - chapterChangeCallback(); - - mCurPage = getCurPage(0); - mCancelPage = null; - } - - /**************************************private method********************************************/ - /** - * 将章节数据,解析成页面列表 - * - * @param chapter:章节信息 - * @param br:章节的文本流 - * @return - */ - private List loadPages(TxtChapter chapter, BufferedReader br) { - //生成的页面 - List pages = new ArrayList<>(); - //使用流的方式加载 - List lines = new ArrayList<>(); - int rHeight = mVisibleHeight; - int titleLinesCount = 0; - boolean showTitle = true; // 是否展示标题 - String paragraph = chapter.getTitle();//默认展示标题 - try { - while (showTitle || (paragraph = br.readLine()) != null) { - paragraph = StringUtils.convertCC(paragraph, mContext); - // 重置段落 - if (!showTitle) { - paragraph = paragraph.replaceAll("\\s", ""); - // 如果只有换行符,那么就不执行 - if (paragraph.equals("")) continue; - paragraph = StringUtils.halfToFull(" " + paragraph + "\n"); - } else { - //设置 title 的顶部间距 - rHeight -= mTitlePara; - } - int wordCount = 0; - String subStr = null; - while (paragraph.length() > 0) { - //当前空间,是否容得下一行文字 - if (showTitle) { - rHeight -= mTitlePaint.getTextSize(); - } else { - rHeight -= mTextPaint.getTextSize(); - } - // 一页已经填充满了,创建 TextPage - if (rHeight <= 0) { - // 创建Page - TxtPage page = new TxtPage(); - page.position = pages.size(); - page.title = StringUtils.convertCC(chapter.getTitle(), mContext); - page.lines = new ArrayList<>(lines); - page.titleLines = titleLinesCount; - pages.add(page); - // 重置Lines - lines.clear(); - rHeight = mVisibleHeight; - titleLinesCount = 0; - - continue; - } - - //测量一行占用的字节数 - if (showTitle) { - wordCount = mTitlePaint.breakText(paragraph, - true, mVisibleWidth, null); - } else { - wordCount = mTextPaint.breakText(paragraph, - true, mVisibleWidth, null); - } - - subStr = paragraph.substring(0, wordCount); - if (!subStr.equals("\n")) { - //将一行字节,存储到lines中 - lines.add(subStr); - - //设置段落间距 - if (showTitle) { - titleLinesCount += 1; - rHeight -= mTitleInterval; - } else { - rHeight -= mTextInterval; - } - } - //裁剪 - paragraph = paragraph.substring(wordCount); - } - - //增加段落的间距 - if (!showTitle && lines.size() != 0) { - rHeight = rHeight - mTextPara + mTextInterval; - } - - if (showTitle) { - rHeight = rHeight - mTitlePara + mTitleInterval; - showTitle = false; - } - } - - if (lines.size() != 0) { - //创建Page - TxtPage page = new TxtPage(); - page.position = pages.size(); - page.title = StringUtils.convertCC(chapter.getTitle(), mContext); - page.lines = new ArrayList<>(lines); - page.titleLines = titleLinesCount; - pages.add(page); - //重置Lines - lines.clear(); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - IOUtils.close(br); - } - return pages; - } - - - /** - * @return:获取初始显示的页面 - */ - private TxtPage getCurPage(int pos) { - if (mPageChangeListener != null) { - mPageChangeListener.onPageChange(pos); - } - return mCurPageList.get(pos); - } - - /** - * @return:获取上一个页面 - */ - private TxtPage getPrevPage() { - int pos = mCurPage.position - 1; - if (pos < 0) { - return null; - } - if (mPageChangeListener != null) { - mPageChangeListener.onPageChange(pos); - } - return mCurPageList.get(pos); - } - - /** - * @return:获取下一的页面 - */ - private TxtPage getNextPage() { - int pos = mCurPage.position + 1; - if (pos >= mCurPageList.size()) { - return null; - } - if (mPageChangeListener != null) { - mPageChangeListener.onPageChange(pos); - } - return mCurPageList.get(pos); - } - - /** - * @return:获取上一个章节的最后一页 - */ - private TxtPage getPrevLastPage() { - int pos = mCurPageList.size() - 1; - - if (mPageChangeListener != null) { - mPageChangeListener.onPageChange(pos); - } - - return mCurPageList.get(pos); - } - - /** - * 根据当前状态,决定是否能够翻页 - * - * @return - */ - private boolean canTurnPage() { - - if (!isChapterListPrepare) { - return false; - } - - if (mStatus == STATUS_PARSE_ERROR - || mStatus == STATUS_PARING) { - return false; - } else if (mStatus == STATUS_ERROR) { - mStatus = STATUS_LOADING; - } - return true; - } - - /*****************************************interface*****************************************/ - - public interface OnPageChangeListener { - /** - * 作用:章节切换的时候进行回调 - * - * @param pos:切换章节的序号 - */ - void onChapterChange(int pos); - - /** - * 作用:请求加载章节内容 - * - * @param requestChapters:需要下载的章节列表 - */ - void requestChapters(List requestChapters); - - /** - * 作用:章节目录加载完成时候回调 - * - * @param chapters:返回章节目录 - */ - void onCategoryFinish(List chapters); - - /** - * 作用:章节页码数量改变之后的回调。==> 字体大小的调整,或者是否关闭虚拟按钮功能都会改变页面的数量。 - * - * @param count:页面的数量 - */ - void onPageCountChange(int count); - - /** - * 作用:当页面改变的时候回调 - * - * @param pos:当前的页面的序号 - */ - void onPageChange(int pos); - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/page/PageMode.java b/app/src/main/java/com/yzx/webebook/widget/page/PageMode.java deleted file mode 100644 index 7099dda..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/PageMode.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.yzx.webebook.widget.page; - -/** - * Created by newbiechen on 2018/2/5. - * 作用:翻页动画的模式 - */ - -public enum PageMode { - SIMULATION, COVER, SLIDE, NONE, SCROLL -} diff --git a/app/src/main/java/com/yzx/webebook/widget/page/PageStyle.java b/app/src/main/java/com/yzx/webebook/widget/page/PageStyle.java deleted file mode 100644 index 1319fe9..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/PageStyle.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.yzx.webebook.widget.page; - - - -import androidx.annotation.ColorRes; - -import com.yzx.webebook.R; - - -/** - * Created by newbiechen on 2018/2/5. - * 作用:页面的展示风格。 - */ - -public enum PageStyle { - BG_0(R.color.nb_read_font_1, R.color.nb_read_bg_1), - BG_1(R.color.nb_read_font_2, R.color.nb_read_bg_2), - BG_2(R.color.nb_read_font_3, R.color.nb_read_bg_3), - BG_3(R.color.nb_read_font_4, R.color.nb_read_bg_4), - BG_4(R.color.nb_read_font_5, R.color.nb_read_bg_5), - NIGHT(R.color.nb_read_font_night, R.color.nb_read_bg_night),; - - private int fontColor; - private int bgColor; - - PageStyle(@ColorRes int fontColor, @ColorRes int bgColor) { - this.fontColor = fontColor; - this.bgColor = bgColor; - } - - public int getFontColor() { - return fontColor; - } - - public int getBgColor() { - return bgColor; - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/page/PageView.java b/app/src/main/java/com/yzx/webebook/widget/page/PageView.java deleted file mode 100644 index 405356f..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/PageView.java +++ /dev/null @@ -1,378 +0,0 @@ -package com.yzx.webebook.widget.page; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.RectF; -import android.util.AttributeSet; -import android.util.Log; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; - -import com.yzx.webebook.model.bean.CollBookBean; -import com.yzx.webebook.widget.animation.CoverPageAnim; -import com.yzx.webebook.widget.animation.HorizonPageAnim; -import com.yzx.webebook.widget.animation.NonePageAnim; -import com.yzx.webebook.widget.animation.PageAnimation; -import com.yzx.webebook.widget.animation.ScrollPageAnim; -import com.yzx.webebook.widget.animation.SimulationPageAnim; -import com.yzx.webebook.widget.animation.SlidePageAnim; - - -/** - * Created by Administrator on 2016/8/29 0029. - * 原作者的GitHub Project Path:(https://github.com/PeachBlossom/treader) - * 绘制页面显示内容的类 - */ -public class PageView extends View { - - private final static String TAG = "BookPageWidget"; - - private int mViewWidth = 0; // 当前View的宽 - private int mViewHeight = 0; // 当前View的高 - - private int mStartX = 0; - private int mStartY = 0; - private boolean isMove = false; - // 初始化参数 - private int mBgColor = 0xFFFFFFFF; - private PageMode mPageMode = PageMode.NONE; - // 是否允许点击 - private boolean canTouch = true; - // 唤醒菜单的区域 - private RectF mCenterRect = null; - private boolean isPrepare; - // 动画类 - private PageAnimation mPageAnim; - // 动画监听类 - private PageAnimation.OnPageChangeListener mPageAnimListener = new PageAnimation.OnPageChangeListener() { - @Override - public boolean hasPrev() { - return PageView.this.hasPrevPage(); - } - - @Override - public boolean hasNext() { - return PageView.this.hasNextPage(); - } - - @Override - public void pageCancel() { - PageView.this.pageCancel(); - } - }; - - //点击监听 - private TouchListener mTouchListener; - //内容加载器 - private PageLoader mPageLoader; - - public PageView(Context context) { - this(context, null); - } - - public PageView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public PageView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - mViewWidth = w; - mViewHeight = h; - - isPrepare = true; - - if (mPageLoader != null) { - mPageLoader.prepareDisplay(w, h); - } - } - - //设置翻页的模式 - void setPageMode(PageMode pageMode) { - mPageMode = pageMode; - //视图未初始化的时候,禁止调用 - if (mViewWidth == 0 || mViewHeight == 0) return; - -// switch (mPageMode) { -// case SIMULATION: -// mPageAnim = new SimulationPageAnim(mViewWidth, mViewHeight, this, mPageAnimListener); -// break; -// case COVER: -// mPageAnim = new CoverPageAnim(mViewWidth, mViewHeight, this, mPageAnimListener); -// break; -// case SLIDE: -// mPageAnim = new SlidePageAnim(mViewWidth, mViewHeight, this, mPageAnimListener); -// break; -// case NONE: -// mPageAnim = new NonePageAnim(mViewWidth, mViewHeight, this, mPageAnimListener); -// break; -// case SCROLL: -// mPageAnim = new ScrollPageAnim(mViewWidth, mViewHeight, 0, -// mPageLoader.getMarginHeight(), this, mPageAnimListener); -// break; -// default: -// } - mPageAnim = new NonePageAnim(mViewWidth, mViewHeight, this, mPageAnimListener); - } - - public Bitmap getNextBitmap() { - if (mPageAnim == null) return null; - return mPageAnim.getNextBitmap(); - } - - public Bitmap getBgBitmap() { - if (mPageAnim == null) return null; - return mPageAnim.getBgBitmap(); - } - - public boolean autoPrevPage() { - //滚动暂时不支持自动翻页 - if (mPageAnim instanceof ScrollPageAnim) { - return false; - } else { - startPageAnim(PageAnimation.Direction.PRE); - return true; - } - } - - public boolean autoNextPage() { - if (mPageAnim instanceof ScrollPageAnim) { - return false; - } else { - startPageAnim(PageAnimation.Direction.NEXT); - return true; - } - } - - private void startPageAnim(PageAnimation.Direction direction) { - if (mTouchListener == null) return; - //是否正在执行动画 - abortAnimation(); - if (direction == PageAnimation.Direction.NEXT) { - int x = mViewWidth; - int y = mViewHeight; - //初始化动画 - mPageAnim.setStartPoint(x, y); - //设置点击点 - mPageAnim.setTouchPoint(x, y); - //设置方向 - Boolean hasNext = hasNextPage(); - - mPageAnim.setDirection(direction); - if (!hasNext) { - return; - } - } else { - int x = 0; - int y = mViewHeight; - //初始化动画 - mPageAnim.setStartPoint(x, y); - //设置点击点 - mPageAnim.setTouchPoint(x, y); - mPageAnim.setDirection(direction); - //设置方向方向 - Boolean hashPrev = hasPrevPage(); - if (!hashPrev) { - return; - } - } - mPageAnim.startAnim(); - this.postInvalidate(); - } - - public void setBgColor(int color) { - mBgColor = color; - } - - @Override - protected void onDraw(Canvas canvas) { - - //绘制背景 - canvas.drawColor(mBgColor); - - //绘制动画 - mPageAnim.draw(canvas); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - super.onTouchEvent(event); - - if (!canTouch && event.getAction() != MotionEvent.ACTION_DOWN) return true; - - int x = (int) event.getX(); - int y = (int) event.getY(); - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - mStartX = x; - mStartY = y; - isMove = false; - canTouch = mTouchListener.onTouch(); - mPageAnim.onTouchEvent(event); - break; - case MotionEvent.ACTION_MOVE: - // 判断是否大于最小滑动值。 - int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); - if (!isMove) { - isMove = Math.abs(mStartX - event.getX()) > slop || Math.abs(mStartY - event.getY()) > slop; - } - - // 如果滑动了,则进行翻页。 - if (isMove) { - mPageAnim.onTouchEvent(event); - } - break; - case MotionEvent.ACTION_UP: - if (!isMove) { - //设置中间区域范围 - if (mCenterRect == null) { - mCenterRect = new RectF(mViewWidth / 5, mViewHeight / 3, - mViewWidth * 4 / 5, mViewHeight * 2 / 3); - } - - //是否点击了中间 - if (mCenterRect.contains(x, y)) { - if (mTouchListener != null) { - mTouchListener.center(); - } - return true; - } - } - mPageAnim.onTouchEvent(event); - break; - } - return true; - } - - /** - * 判断是否存在上一页 - * - * @return - */ - private boolean hasPrevPage() { - mTouchListener.prePage(); - return mPageLoader.prev(); - } - - /** - * 判断是否下一页存在 - * - * @return - */ - private boolean hasNextPage() { - mTouchListener.nextPage(); - return mPageLoader.next(); - } - - private void pageCancel() { - mTouchListener.cancel(); - mPageLoader.pageCancel(); - } - - @Override - public void computeScroll() { - //进行滑动 - mPageAnim.scrollAnim(); - super.computeScroll(); - } - - //如果滑动状态没有停止就取消状态,重新设置Anim的触碰点 - public void abortAnimation() { - mPageAnim.abortAnim(); - } - - public boolean isRunning() { - if (mPageAnim == null) { - return false; - } - return mPageAnim.isRunning(); - } - - public boolean isPrepare() { - return isPrepare; - } - - public void setTouchListener(TouchListener mTouchListener) { - this.mTouchListener = mTouchListener; - } - - public void drawNextPage() { - if (!isPrepare) return; - - if (mPageAnim instanceof HorizonPageAnim) { - ((HorizonPageAnim) mPageAnim).changePage(); - } - mPageLoader.drawPage(getNextBitmap(), false); - } - - /** - * 绘制当前页。 - * - * @param isUpdate - */ - public void drawCurPage(boolean isUpdate) { - if (!isPrepare) return; - - if (!isUpdate){ - if (mPageAnim instanceof ScrollPageAnim) { - ((ScrollPageAnim) mPageAnim).resetBitmap(); - } - } - - mPageLoader.drawPage(getNextBitmap(), isUpdate); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mPageAnim.abortAnim(); - mPageAnim.clear(); - - mPageLoader = null; - mPageAnim = null; - } - - /** - * 获取 PageLoader - * - * @param collBook - * @return - */ - public PageLoader getPageLoader(CollBookBean collBook) { - // 判是否已经存在 - if (mPageLoader != null) { - return mPageLoader; - } - // 根据书籍类型,获取具体的加载器 - if (collBook.isLocal()) { - mPageLoader = new LocalPageLoader(this, collBook); - } else { - mPageLoader = new NetPageLoader(this, collBook); - } - // 判断是否 PageView 已经初始化完成 - if (mViewWidth != 0 || mViewHeight != 0) { - // 初始化 PageLoader 的屏幕大小 - mPageLoader.prepareDisplay(mViewWidth, mViewHeight); - } - Log.e(TAG, "getPageLoader: "+mPageLoader.toString() ); - return mPageLoader; - } - - public interface TouchListener { - boolean onTouch(); - - void center(); - - void prePage(); - - void nextPage(); - - void cancel(); - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/page/TxtChapter.java b/app/src/main/java/com/yzx/webebook/widget/page/TxtChapter.java deleted file mode 100644 index 8f0feab..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/TxtChapter.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.yzx.webebook.widget.page; - -/** - * Created by newbiechen on 17-7-1. - */ - -public class TxtChapter{ - - //章节所属的小说(网络) - String bookId; - //章节的链接(网络) - String link; - - //章节名(共用) - String title; - - //章节内容在文章中的起始位置(本地) - long start; - //章节内容在文章中的终止位置(本地) - long end; - - public String getBookId() { - return bookId; - } - - public void setBookId(String id) { - this.bookId = id; - } - - public String getLink() { - return link; - } - - public void setLink(String link) { - this.link = link; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public long getStart() { - return start; - } - - public void setStart(long start) { - this.start = start; - } - - public long getEnd() { - return end; - } - - public void setEnd(long end) { - this.end = end; - } - - @Override - public String toString() { - return "TxtChapter{" + - "title='" + title + '\'' + - ", start=" + start + - ", end=" + end + - '}'; - } -} diff --git a/app/src/main/java/com/yzx/webebook/widget/page/TxtPage.java b/app/src/main/java/com/yzx/webebook/widget/page/TxtPage.java deleted file mode 100644 index dbcc9a3..0000000 --- a/app/src/main/java/com/yzx/webebook/widget/page/TxtPage.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.yzx.webebook.widget.page; - -import java.util.List; - -/** - * Created by newbiechen on 17-7-1. - */ - -public class TxtPage { - int position; - String title; - int titleLines; //当前 lines 中为 title 的行数。 - List lines; -} diff --git a/app/src/main/res/drawable/Thumbs.db b/app/src/main/res/drawable/Thumbs.db deleted file mode 100644 index 4d6ca08bc48f532267b9a60b9a115fc12d73c529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31744 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�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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -