From 9c632d4a05994d1d2c7ce82882af8d97bfc82237 Mon Sep 17 00:00:00 2001 From: Z <390057892@qq.com> Date: Mon, 5 Apr 2021 23:50:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=A1=B9=E7=9B=AE=E4=B8=BAmv?= =?UTF-8?q?vm,=E9=98=85=E8=AF=BB=E5=99=A8=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .idea/.gitignore | 3 + .idea/codeStyles/Project.xml | 20 +- .idea/compiler.xml | 6 + .idea/dictionaries/Administrator.xml | 7 + .idea/encodings.xml | 4 - .idea/gradle.xml | 4 +- .idea/jarRepositories.xml | 18 +- .idea/markdown-navigator.xml | 86 - .../markdown-navigator/profiles_settings.xml | 3 - .idea/misc.xml | 9 +- .idea/runConfigurations.xml | 12 - .idea/vcs.xml | 3 +- README.md | 30 +- app/.gitignore | 2 + app/build.gradle | 160 +- app/proguard-rules.pro | 232 +++ app/reader.jks | Bin 0 -> 2073 bytes .../com/novel/read/ExampleInstrumentedTest.kt | 4 +- app/src/main/AndroidManifest.xml | 111 +- app/src/main/assets/bg/羊皮纸1.jpg | Bin 0 -> 251439 bytes app/src/main/assets/defaultData/httpTTS.json | 62 + .../main/assets/defaultData/readConfig.json | 52 + .../main/assets/defaultData/themeConfig.json | 26 + .../main/assets/defaultData/txtTocRule.json | 128 ++ app/src/main/assets/font/number.ttf | Bin 0 -> 6000 bytes app/src/main/assets/litepal.xml | 28 +- app/src/main/java/com/novel/read/App.kt | 123 ++ app/src/main/java/com/novel/read/Ext.kt | 22 - .../read/activity/NovelBookDetailActivity.kt | 205 --- .../activity/NovelBookTypeListActivity.kt | 89 - .../novel/read/activity/NovelMainActivity.kt | 148 -- .../read/activity/NovelRankListActivity.kt | 91 - .../novel/read/activity/NovelReadActivity.kt | 655 ------- .../NovelRecommendBookListActivity.kt | 62 - .../read/activity/NovelSearchActivity.kt | 255 --- .../read/activity/NovelSettingActivity.kt | 152 -- .../read/activity/NovelSplashActivity.kt | 69 - .../com/novel/read/adapter/BookAdapter.kt | 163 -- .../com/novel/read/adapter/BookListAdapter.kt | 126 -- .../novel/read/adapter/CategoryAdapter.java | 34 - .../com/novel/read/adapter/EasyAdapter.java | 87 - .../read/adapter/EditRecommendAdapter.kt | 62 - .../com/novel/read/adapter/HistoryAdapter.kt | 54 - .../java/com/novel/read/adapter/HotAdapter.kt | 54 - .../com/novel/read/adapter/HumanAdapter.kt | 58 - .../com/novel/read/adapter/IViewHolder.kt | 15 - .../com/novel/read/adapter/LoveLyAdapter.kt | 59 - .../com/novel/read/adapter/MarkAdapter.kt | 71 - .../novel/read/adapter/PageStyleAdapter.kt | 54 - .../com/novel/read/adapter/RankAdapter.kt | 59 - .../com/novel/read/adapter/RankListAdapter.kt | 125 -- .../com/novel/read/adapter/SearchAdapter.kt | 173 -- .../com/novel/read/adapter/StackAdapter.kt | 61 - .../novel/read/adapter/ViewHolderImpl.java | 40 - .../com/novel/read/adapter/ViewPageAdapter.kt | 22 - .../read/adapter/holder/CategoryHolder.java | 50 - .../novel/read/adapter/holder/EmptyHolder.kt | 6 - .../novel/read/adapter/holder/MoreHolder.kt | 34 - .../java/com/novel/read/base/BaseActivity.kt | 174 ++ .../com/novel/read/base/BaseDialogFragment.kt | 58 + .../java/com/novel/read/base/BaseFragment.kt | 96 + .../novel/read/base/BasePreferenceFragment.kt | 60 + .../java/com/novel/read/base/BaseService.kt | 31 +- .../java/com/novel/read/base/BaseViewModel.kt | 154 ++ .../main/java/com/novel/read/base/MyApp.kt | 63 - .../com/novel/read/base/NovelBaseActivity.kt | 78 - .../com/novel/read/base/NovelBaseFragment.kt | 59 - .../com/novel/read/base/VMBaseActivity.kt | 15 + .../com/novel/read/base/VMBaseFragment.kt | 9 + .../java/com/novel/read/constant/AppConst.kt | 77 + .../com/novel/read/constant/AppPattern.kt | 16 + .../java/com/novel/read/constant/BookType.kt | 13 + .../java/com/novel/read/constant/EventBus.kt | 28 + .../com/novel/read/constant/IntentAction.kt | 30 + .../com/novel/read/constant/LayoutType.kt | 23 + .../java/com/novel/read/constant/PreferKey.kt | 70 + .../java/com/novel/read/constant/Status.kt | 7 + .../java/com/novel/read/constant/Theme.kt | 20 + .../java/com/novel/read/constants/Constant.kt | 115 -- .../main/java/com/novel/read/data/README.md | 17 + .../java/com/novel/read/data/db/BookDao.kt | 50 + .../com/novel/read/data/db/BookDatabase.kt | 67 + .../com/novel/read/data/db/BookMarkDao.kt | 39 + .../java/com/novel/read/data/db/ChapterDao.kt | 48 + .../com/novel/read/data/db/ReadRecordDao.kt | 23 + .../novel/read/data/db/SearchHistoryDao.kt | 19 + .../java/com/novel/read/data/db/UserDao.kt | 16 + .../com/novel/read/data/db/entity/Book.kt | 52 + .../novel/read/data/db/entity/BookChapter.kt | 19 + .../com/novel/read/data/db/entity/Bookmark.kt | 16 + .../data/db/entity/ChapterDetailEntity.kt | 10 + .../com/novel/read/data/db/entity/HttpTTS.kt | 9 + .../novel/read/data/db/entity/ReadRecord.kt | 15 + .../db/entity/SearchHistory.kt} | 23 +- .../com/novel/read/data/db/entity/User.kt | 29 + .../novel/read/data/model/AppUpdateResp.kt | 20 + .../com/novel/read/data/model/BookInfoResp.kt | 33 + .../com/novel/read/data/model/BookListResp.kt | 52 + .../com/novel/read/data/model/BoyEndRank.kt | 51 + .../com/novel/read/data/model/BoyHotRank.kt | 50 + .../novel/read/data/model/BoySearchRank.kt | 50 + .../com/novel/read/data/model/ChannelResp.kt | 24 + .../novel/read/data/model/ChannelSection.kt | 8 + .../read/data/model/ChapterContentResp.kt | 16 + .../com/novel/read/data/model/ChapterResp.kt | 16 + .../com/novel/read/data/model/ClickRank.kt | 51 + .../java/com/novel/read/data/model/Default.kt | 3 + .../java/com/novel/read/data/model/EndRank.kt | 49 + .../com/novel/read/data/model/GirlEndRank.kt | 51 + .../com/novel/read/data/model/GirlHotRank.kt | 51 + .../novel/read/data/model/GirlSearchRank.kt | 51 + .../com/novel/read/data/model/GoodsResp.kt | 15 + .../com/novel/read/data/model/HomeBanner.kt | 11 + .../com/novel/read/data/model/HomeResp.kt | 16 + .../java/com/novel/read/data/model/HotRank.kt | 45 + .../com/novel/read/data/model/LoginReq.kt | 21 + .../com/novel/read/data/model/Pagination.kt | 14 + .../read/data/model/PaginationSimilar.kt | 9 + .../novel/read/data/model/RecommendRank.kt | 53 + .../com/novel/read/data/model/SearchResp.kt | 53 + .../java/com/novel/read/data/model/Tools.kt | 5 + .../com/novel/read/data/model/TypeEntity.kt | 9 + .../com/novel/read/data/model/TypeName.kt | 69 + .../com/novel/read/data/model/UserResp.kt | 32 + .../com/novel/read/data/read/TextChapter.kt | 54 + .../java/com/novel/read/data/read/TextChar.kt | 9 + .../java/com/novel/read/data/read/TextLine.kt | 39 + .../java/com/novel/read/data/read/TextPage.kt | 122 ++ .../com/novel/read/event/AddBookSignEvent.kt | 14 - .../com/novel/read/event/BookArticleEvent.kt | 15 - .../novel/read/event/DeleteBookSignEvent.kt | 10 - .../novel/read/event/DeleteResponseEvent.kt | 7 - .../com/novel/read/event/DeleteTaskEvent.kt | 6 - .../java/com/novel/read/event/EditEvent.kt | 15 - .../com/novel/read/event/ErrorChapterEvent.kt | 9 - .../novel/read/event/FinishChapterEvent.kt | 9 - .../novel/read/event/GetBookDetailEvent.kt | 15 - .../com/novel/read/event/GetBookSignEvent.kt | 14 - .../novel/read/event/GetCategoryTypeEvent.kt | 15 - .../novel/read/event/GetRecommendBookEvent.kt | 15 - .../novel/read/event/HideBottomBarEvent.kt | 5 - .../com/novel/read/event/HotSearchEvent.kt | 16 - .../java/com/novel/read/event/HumanEvent.kt | 16 - .../java/com/novel/read/event/LoginEvent.kt | 10 - .../com/novel/read/event/RankByUpdateEvent.kt | 15 - .../com/novel/read/event/ReStartEvent.java | 6 - .../novel/read/event/RecommendListEvent.kt | 15 - .../main/java/com/novel/read/event/RxBus.java | 74 - .../com/novel/read/event/SearchListEvent.kt | 15 - .../novel/read/event/SwitchFragmentEvent.kt | 10 - .../com/novel/read/event/UpdateBookEvent.kt | 10 - .../java/com/novel/read/event/VersionEvent.kt | 14 - .../com/novel/read/fragment/BookFragment.kt | 277 --- .../novel/read/fragment/BookListFragment.kt | 107 -- .../com/novel/read/fragment/ManFragment.kt | 144 -- .../com/novel/read/fragment/MoreFragment.kt | 110 -- .../novel/read/fragment/RecommendFragment.kt | 52 - .../com/novel/read/fragment/StackFragment.kt | 78 - .../com/novel/read/fragment/WomanFragment.kt | 171 -- .../java/com/novel/read/help/ActivityHelp.kt | 119 ++ .../java/com/novel/read/help/AppConfig.kt | 115 ++ .../main/java/com/novel/read/help/BookHelp.kt | 397 +++++ .../java/com/novel/read/help/DefaultData.kt | 37 + .../java/com/novel/read/help/ImageLoader.kt | 56 + .../com/novel/read/help/IntentDataHelp.kt | 20 + .../java/com/novel/read/help/IntentHelp.kt | 61 + .../java/com/novel/read/help/MediaHelp.kt | 82 + .../com/novel/read/help/ReadBookConfig.kt | 530 ++++++ .../java/com/novel/read/help/ReadTipConfig.kt | 71 + .../java/com/novel/read/help/ThemeConfig.kt | 212 +++ .../java/com/novel/read/help/TintHelper.kt | 488 ++++++ .../read/help/coroutine/CompositeCoroutine.kt | 83 + .../novel/read/help/coroutine/Coroutine.kt | 214 +++ .../read/help/coroutine/CoroutineContainer.kt | 16 + .../com/novel/read/http/AccountManager.kt | 303 ---- .../read/http/CommonHeadersInterceptor.kt | 35 - .../com/novel/read/http/ServiceGenerator.kt | 49 - app/src/main/java/com/novel/read/http/Urls.kt | 29 - .../novel/read/http/service/AccountService.kt | 94 - .../novel/read/inter/OnLoadMoreListener.kt | 9 - app/src/main/java/com/novel/read/lib/ATH.kt | 254 +++ .../main/java/com/novel/read/lib/ATHUtils.kt | 34 + .../main/java/com/novel/read/lib/Selector.kt | 445 +++++ .../java/com/novel/read/lib/ThemeStore.kt | 359 ++++ .../com/novel/read/lib/ThemeStoreInterface.kt | 97 ++ .../com/novel/read/lib/ThemeStorePrefKeys.kt | 32 + .../novel/read/lib/dialogs/AlertBuilder.kt | 118 ++ .../read/lib/dialogs/AndroidAlertBuilder.kt | 140 ++ .../novel/read/lib/dialogs/AndroidDialogs.kt | 142 ++ .../read/lib/dialogs/AndroidSelectors.kt | 58 + .../com/novel/read/lib/dialogs/Dialogs.kt | 83 + .../novel/read/model/db/BookChapterBean.java | 161 -- .../com/novel/read/model/db/BookRecordBean.kt | 17 - .../com/novel/read/model/db/BookSignTable.kt | 15 - .../novel/read/model/db/ChapterInfoBean.java | 94 - .../com/novel/read/model/db/CollBookBean.java | 195 --- .../novel/read/model/db/DownloadTaskBean.java | 152 -- .../read/model/db/dbManage/BookManager.java | 217 --- .../model/db/dbManage/BookRepository.java | 348 ---- .../read/model/protocol/BookArticleResp.java | 92 - .../read/model/protocol/BookDetailResp.java | 199 --- .../read/model/protocol/CategoryTypeResp.kt | 25 - .../read/model/protocol/ChapterInfoPackage.kt | 12 - .../read/model/protocol/HotSearchResp.kt | 10 - .../com/novel/read/model/protocol/MarkResp.kt | 31 - .../read/model/protocol/RankByUpdateResp.java | 115 -- .../read/model/protocol/RecommendBookResp.kt | 43 - .../read/model/protocol/RecommendListResp.kt | 67 - .../novel/read/model/protocol/SearchResp.kt | 46 - .../com/novel/read/model/protocol/UidResp.kt | 10 - .../novel/read/model/protocol/VersionResp.kt | 42 - .../com/novel/read/network/ServiceCreator.kt | 143 ++ .../novel/read/network/api/ApiException.kt | 3 + .../com/novel/read/network/api/ApiResult.kt | 18 + .../com/novel/read/network/api/BookService.kt | 60 + .../read/network/repository/BookRepository.kt | 126 ++ .../read/network/repository/HomeRepository.kt | 35 + .../network/repository/ImageRepository.kt | 12 + .../network/repository/SearchRepository.kt | 33 + .../read/receiver/MediaButtonReceiver.kt | 92 + .../read/service/BaseReadAloudService.kt | 344 ++++ .../novel/read/service/CacheBookService.kt | 281 +++ .../novel/read/service/DownloadMessage.java | 12 - .../novel/read/service/DownloadService.java | 444 ----- .../read/service/HttpReadAloudService.kt | 203 +++ .../novel/read/service/TTSReadAloudService.kt | 193 ++ .../com/novel/read/service/help/CacheBook.kt | 110 ++ .../com/novel/read/service/help/ReadAloud.kt | 108 ++ .../com/novel/read/service/help/ReadBook.kt | 444 +++++ .../java/com/novel/read/ui/MainActivity.kt | 195 +++ .../java/com/novel/read/ui/MainViewModel.kt | 143 ++ .../com/novel/read/ui/about/AboutActivity.kt | 11 + .../novel/read/ui/channel/ChannelActivity.kt | 77 + .../novel/read/ui/channel/ChannelAdapter.kt | 44 + .../read/ui/channel/ChannelInfoActivity.kt | 96 + .../read/ui/channel/ChannelInfoAdapter.kt | 28 + .../read/ui/channel/ChannelInfoViewModel.kt | 58 + .../novel/read/ui/channel/ChannelViewModel.kt | 24 + .../novel/read/ui/chapter/BookMarkAdapter.kt | 19 + .../novel/read/ui/chapter/BookmarkFragment.kt | 112 ++ .../read/ui/chapter/ChapterListActivity.kt | 94 + .../read/ui/chapter/ChapterListAdapter.kt | 57 + .../read/ui/chapter/ChapterListFragment.kt | 141 ++ .../read/ui/chapter/ChapterListViewModel.kt | 38 + .../com/novel/read/ui/daily/DailyActivity.kt | 95 + .../com/novel/read/ui/daily/DailyAdapter.kt | 28 + .../com/novel/read/ui/daily/DailyViewModel.kt | 51 + .../java/com/novel/read/ui/end/EndActivity.kt | 96 + .../java/com/novel/read/ui/end/EndAdapter.kt | 28 + .../com/novel/read/ui/end/EndViewModel.kt | 49 + .../read/ui/feedback/FeedBackActivity.kt | 35 + .../read/ui/feedback/FeedBackViewModel.kt | 19 + .../novel/read/ui/info/BookInfoActivity.kt | 167 ++ .../com/novel/read/ui/info/BookInfoAdapter.kt | 23 + .../novel/read/ui/info/BookInfoViewModel.kt | 142 ++ .../read/ui/main/bookshelf/BaseBookAdapter.kt | 26 + .../ui/main/bookshelf/BookShelfAdapter.kt | 74 + .../read/ui/main/bookshelf/BookViewModel.kt | 11 + .../ui/main/bookshelf/BooksAdapterGrid.kt | 61 + .../ui/main/bookshelf/BookshelfFragment.kt | 192 ++ .../bookshelf/arrange/ArrangeBookActivity.kt | 71 + .../bookshelf/arrange/ArrangeBookAdapter.kt | 36 + .../bookshelf/arrange/ArrangeBookViewModel.kt | 20 + .../novel/read/ui/main/mail/MailFragment.kt | 98 ++ .../novel/read/ui/main/mail/MailViewModel.kt | 23 + .../read/ui/main/mail/RecommentFragment.kt | 4 + .../read/ui/main/mail/pick/ClickAdapter.kt | 24 + .../read/ui/main/mail/pick/EndAdapter.kt | 25 + .../read/ui/main/mail/pick/HotAdapter.kt | 24 + .../read/ui/main/mail/pick/PickAdapter.kt | 150 ++ .../ui/main/mail/pick/RecommendAdapter.kt | 42 + .../com/novel/read/ui/main/my/MyFragment.kt | 60 + .../com/novel/read/ui/main/my/ToolsAdapter.kt | 19 + .../com/novel/read/ui/rank/RankActivity.kt | 133 ++ .../com/novel/read/ui/rank/RankAdapter.kt | 28 + .../com/novel/read/ui/rank/RankViewModel.kt | 52 + .../com/novel/read/ui/rank/TypeAdapter.kt | 26 + .../novel/read/ui/read/ReadBookActivity.kt | 690 ++++++++ .../read/ui/read/ReadBookActivityHelp.kt | 217 +++ .../novel/read/ui/read/ReadBookViewModel.kt | 182 ++ .../java/com/novel/read/ui/read/ReadMenu.kt | 243 +++ .../com/novel/read/ui/read/TextActionMenu.kt | 194 +++ .../read/ui/read/config/ChineseConverter.kt | 54 + .../read/ui/read/config/ReadAdjustDialog.kt | 118 ++ .../read/ui/read/config/ReadAloudDialog.kt | 164 ++ .../read/ui/read/config/ReadStyleDialog.kt | 170 ++ .../ui/read/config/TextFontWeightConverter.kt | 55 + .../read/ui/read/page/ContentTextView.kt | 504 ++++++ .../novel/read/ui/read/page/ContentView.kt | 277 +++ .../com/novel/read/ui/read/page/DataSource.kt | 21 + .../novel/read/ui/read/page/PageFactory.kt | 26 + .../com/novel/read/ui/read/page/PageView.kt | 416 +++++ .../read/ui/read/page/TextPageFactory.kt | 131 ++ .../read/page/delegate/CoverPageDelegate.kt | 83 + .../page/delegate/HorizontalPageDelegate.kt | 143 ++ .../read/page/delegate/NoAnimPageDelegate.kt | 24 + .../ui/read/page/delegate/PageDelegate.kt | 191 ++ .../read/page/delegate/ScrollPageDelegate.kt | 114 ++ .../page/delegate/SimulationPageDelegate.kt | 561 ++++++ .../read/page/delegate/SlidePageDelegate.kt | 60 + .../read/ui/read/provider/ChapterProvider.kt | 475 +++++ .../read/ui/read/provider/ImageProvider.kt | 84 + .../read/ui/record/ReadRecordActivity.kt | 69 + .../novel/read/ui/search/HistoryAdapter.kt | 17 + .../com/novel/read/ui/search/HotAdapter.kt | 19 + .../novel/read/ui/search/SearchActivity.kt | 235 +++ .../com/novel/read/ui/search/SearchAdapter.kt | 32 + .../novel/read/ui/search/SearchViewModel.kt | 80 + .../read/ui/setting/OtherConfigFragment.kt | 131 ++ .../novel/read/ui/setting/SettingActivity.kt | 26 + .../com/novel/read/ui/theme/ThemeActivity.kt | 11 + .../novel/read/ui/welcome/WelcomeActivity.kt | 74 + .../com/novel/read/ui/widget/ATECheckBox.kt | 17 + .../novel/read/ui/widget/ATERadioNoButton.kt | 67 + .../com/novel/read/ui/widget/ATESeekBar.kt | 17 + .../com/novel/read/ui/widget/ATESwitch.kt | 21 + .../novel/read/ui/widget/AccentBgTextView.kt | 48 + .../novel/read/ui/widget/AccentTextView.kt | 22 + .../read/ui/widget/AutoCompleteTextView.kt | 71 + .../com/novel/read/ui/widget/BadgeView.kt | 229 +++ .../com/novel/read/ui/widget/BatteryView.kt | 65 + .../java/com/novel/read/ui/widget/EditText.kt | 17 + .../com/novel/read/ui/widget/HeadLayout.java | 69 + .../read/ui/widget/InertiaScrollTextView.kt | 228 +++ .../read/ui/widget/RefreshProgressBar.kt | 197 +++ .../com/novel/read/ui/widget/SearchView.kt | 104 ++ .../novel/read/ui/widget/SmoothCheckBox.kt | 326 ++++ .../novel/read/ui/widget/StrokeTextView.kt | 89 + .../java/com/novel/read/ui/widget/TitleBar.kt | 219 +++ .../read/ui/widget/UpLinearLayoutManager.kt | 39 + .../novel/read/ui/widget/VerticalDivider.kt | 16 + .../read/ui/widget/anim/RotateLoading.kt | 219 +++ .../{ => ui}/widget/dialog/AppraiseDialog.kt | 8 +- .../read/ui/widget/dialog/AutoReadDialog.kt | 111 ++ .../read/ui/widget/dialog/LoginDialog.kt | 32 + .../read/ui/widget/dialog/PhotoDialog.kt | 68 + .../ui/widget/dialog/ReadAloudConfigDialog.kt | 128 ++ .../novel/read/ui/widget/dialog/TextDialog.kt | 97 ++ .../widget/dynamic}/RefreshLayout.java | 2 +- .../read/ui/widget/image/CircleImageView.kt | 466 +++++ .../read/ui/widget/image/CoverImageView.kt | 187 ++ .../read/ui/widget/image/FilletImageView.kt | 99 ++ .../novel/read/ui/widget/image/PhotoView.kt | 1258 +++++++++++++ .../novel/read/ui/widget/image/photo/Info.kt | 49 + .../image/photo/RotateGestureDetector.kt | 54 + .../widget/prefs/EditTextPreferenceDialog.kt | 29 + .../ui/widget/prefs/ListPreferenceDialog.kt | 29 + .../prefs/MultiSelectListPreferenceDialog.kt | 32 + .../ui/widget/prefs/NameListPreference.kt | 47 + .../novel/read/ui/widget/prefs/Preference.kt | 123 ++ .../ui/widget/prefs/PreferenceCategory.kt | 53 + .../read/ui/widget/prefs/SwitchPreference.kt | 41 + .../ui/widget/recycler/ItemTouchCallback.kt | 133 ++ .../widget/scroller/FastScrollRecyclerView.kt | 165 ++ .../scroller/FastScrollStateChangeListener.kt | 15 + .../read/ui/widget/scroller/FastScroller.kt | 519 ++++++ .../java/com/novel/read/user/UserManager.kt | 5 + .../java/com/novel/read/user/VipHelper.kt | 28 + .../novel/read/utils/AnimationUtilsSupport.kt | 17 + .../java/com/novel/read/utils/BitmapUtils.kt | 286 +++ .../com/novel/read/utils/BooksDiffCallBack.kt | 76 + .../java/com/novel/read/utils/ColorUtils.kt | 252 +++ .../java/com/novel/read/utils/ConvertUtils.kt | 122 ++ .../com/novel/read/utils/DrawableUtils.kt | 48 + .../java/com/novel/read/utils/FileUtils.kt | 774 ++++++++ .../com/novel/read/utils/LanguageUtils.kt | 105 ++ .../java/com/novel/read/utils/MD5Utils.kt | 39 + .../java/com/novel/read/utils/NetworkUtils.kt | 155 ++ .../java/com/novel/read/utils/RealPathUtil.kt | 175 ++ .../java/com/novel/read/utils/StringUtils.kt | 353 ++++ .../java/com/novel/read/utils/SystemUtils.kt | 73 + .../main/java/com/novel/read/utils/UIUtils.kt | 45 + .../java/com/novel/read/utils/ViewUtils.kt | 42 + .../read/utils/ext/ActivityExtensions.kt | 32 + .../read/utils/ext/AlertDialogExtensions.kt | 13 + .../novel/read/utils/ext/ContextExtensions.kt | 206 +++ .../read/utils/ext/EventBusExtensions.kt | 69 + .../novel/read/utils/ext/FloatExtensions.kt | 16 + .../read/utils/ext/FragmentExtensions.kt | 85 + .../novel/read/utils/ext/GsonExtensions.kt | 138 ++ .../com/novel/read/utils/ext/IntExtensions.kt | 16 + .../read/utils/ext/MaterialValueHelper.kt | 127 ++ .../novel/read/utils/ext/MenuExtensions.kt | 61 + .../novel/read/utils/ext/StringExtensions.kt | 86 + .../java/com/novel/read/utils/ext/Toasts.kt | 37 + .../novel/read/utils/ext/ViewExtensions.kt | 119 ++ .../com/novel/read/utils/ext/ViewModelKt.kt | 18 + .../com/novel/read/utlis/BrightnessUtils.kt | 116 -- .../main/java/com/novel/read/utlis/Charset.kt | 16 - .../com/novel/read/utlis/CleanCacheUtils.kt | 170 -- .../java/com/novel/read/utlis/DateUtli.kt | 104 -- .../java/com/novel/read/utlis/DialogUtils.kt | 39 - .../novel/read/utlis/EvenItemDecoration.kt | 22 - .../java/com/novel/read/utlis/FileUtils.java | 267 --- .../com/novel/read/utlis/GlideImageLoader.kt | 88 - .../main/java/com/novel/read/utlis/IOUtils.kt | 22 - .../com/novel/read/utlis/LocalManageUtil.java | 118 -- .../java/com/novel/read/utlis/MD5Utils.kt | 41 - .../java/com/novel/read/utlis/MyTimeTask.kt | 29 - .../java/com/novel/read/utlis/NetworkUtils.kt | 58 - .../com/novel/read/utlis/PermissionUtil.java | 128 -- .../java/com/novel/read/utlis/PhoneUtils.kt | 122 -- .../java/com/novel/read/utlis/RxUtils.java | 38 - .../java/com/novel/read/utlis/ScreenUtils.kt | 113 -- .../java/com/novel/read/utlis/SpUtil.java | 115 -- .../com/novel/read/utlis/StatusBarUtil.kt | 106 -- .../java/com/novel/read/utlis/StringUtils.kt | 65 - .../com/novel/read/utlis/SystemBarUtils.kt | 155 -- .../java/com/novel/read/utlis/VersionUtil.kt | 55 - .../java/com/novel/read/widget/HeadLayout.kt | 55 - .../java/com/novel/read/widget/VpTabLayout.kt | 157 -- .../read/widget/dialog/ReadSettingDialog.kt | 176 -- .../read/widget/page/LocalPageLoader.java | 442 ----- .../novel/read/widget/page/NetPageLoader.java | 221 --- .../novel/read/widget/page/PageAnimation.java | 156 -- .../novel/read/widget/page/PageLoader.java | 1552 ----------------- .../com/novel/read/widget/page/PageMode.kt | 9 - .../com/novel/read/widget/page/PageStyle.kt | 19 - .../com/novel/read/widget/page/PageView.java | 364 ---- .../read/widget/page/ReadSettingManager.kt | 104 -- .../novel/read/widget/page/TxtChapter.java | 80 - .../com/novel/read/widget/page/TxtPage.java | 38 - .../java/com/novel/read/widget/page/Void.kt | 3 - .../read/widget/page/anim/CoverPageAnim.kt | 95 - .../read/widget/page/anim/HorizonPageAnim.kt | 223 --- .../read/widget/page/anim/NonePageAnim.kt | 32 - .../read/widget/page/anim/ScrollPageAnim.kt | 412 ----- .../widget/page/anim/SimulationPageAnim.kt | 664 ------- .../read/widget/page/anim/SlidePageAnim.kt | 92 - .../main/res/anim/anim_readbook_bottom_in.xml | 7 + .../res/anim/anim_readbook_bottom_out.xml | 7 + .../main/res/anim/anim_readbook_top_in.xml | 7 + .../main/res/anim/anim_readbook_top_out.xml | 7 + app/src/main/res/anim/slide_bottom_in.xml | 7 - app/src/main/res/anim/slide_bottom_out.xml | 7 - app/src/main/res/anim/slide_left_in.xml | 6 - app/src/main/res/anim/slide_left_out.xml | 6 - app/src/main/res/anim/slide_right_in.xml | 6 - app/src/main/res/anim/slide_right_out.xml | 6 - app/src/main/res/anim/slide_top_in.xml | 8 - app/src/main/res/anim/slide_top_out.xml | 6 - .../res/drawable-night-xxhdpi/ic_back.png | Bin 392 -> 0 bytes .../res/drawable-night-xxhdpi/ic_edit.png | Bin 554 -> 0 bytes .../ic_menu_mode_night_normal.png | Bin 2608 -> 0 bytes .../res/drawable-night-xxhdpi/ic_search.png | Bin 1126 -> 0 bytes .../res/drawable-night-xxhdpi/ic_theme.png | Bin 1842 -> 0 bytes .../res/drawable-xxhdpi/cover_default.png | Bin 1926 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_back.png | Bin 405 -> 0 bytes .../main/res/drawable-xxhdpi/ic_book_add.png | Bin 8297 -> 0 bytes .../res/drawable-xxhdpi/ic_book_detail.png | Bin 1007 -> 0 bytes .../main/res/drawable-xxhdpi/ic_book_end.png | Bin 0 -> 30132 bytes .../main/res/drawable-xxhdpi/ic_book_n.png | Bin 592 -> 0 bytes .../main/res/drawable-xxhdpi/ic_book_p.png | Bin 596 -> 0 bytes .../main/res/drawable-xxhdpi/ic_book_type.png | Bin 0 -> 32961 bytes app/src/main/res/drawable-xxhdpi/ic_cache.png | Bin 894 -> 0 bytes .../main/res/drawable-xxhdpi/ic_cancel.png | Bin 1497 -> 0 bytes .../main/res/drawable-xxhdpi/ic_checked.png | Bin 615 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_click.png | Bin 0 -> 1752 bytes .../main/res/drawable-xxhdpi/ic_contents.png | Bin 409 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_daily.png | Bin 0 -> 28626 bytes .../main/res/drawable-xxhdpi/ic_default.png | Bin 107556 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_edit.png | Bin 505 -> 0 bytes .../res/drawable-xxhdpi/ic_edit_recommend.png | Bin 1087 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_end.png | Bin 0 -> 1015 bytes .../main/res/drawable-xxhdpi/ic_font_add.png | Bin 1559 -> 0 bytes .../main/res/drawable-xxhdpi/ic_font_min.png | Bin 1272 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_guide.jpg | Bin 26962 -> 0 bytes .../main/res/drawable-xxhdpi/ic_history.png | Bin 1118 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_hot.png | Bin 1135 -> 2232 bytes .../res/drawable-xxhdpi/ic_hot_search.png | Bin 0 -> 2326 bytes app/src/main/res/drawable-xxhdpi/ic_human.png | Bin 1380 -> 0 bytes .../ic_item_category_activated.png | Bin 616 -> 0 bytes .../ic_item_category_download.png | Bin 246 -> 0 bytes .../ic_item_category_normal.png | Bin 246 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_label.png | Bin 1772 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_light.png | Bin 2104 -> 0 bytes .../main/res/drawable-xxhdpi/ic_listen.png | Bin 1845 -> 0 bytes .../main/res/drawable-xxhdpi/ic_love_look.png | Bin 931 -> 0 bytes .../main/res/drawable-xxhdpi/ic_lovely.png | Bin 1101 -> 0 bytes .../res/drawable-xxhdpi/ic_menu_add_mark.png | Bin 764 -> 0 bytes .../res/drawable-xxhdpi/ic_menu_clear.png | Bin 1246 -> 0 bytes .../ic_menu_mode_night_normal.png | Bin 1842 -> 0 bytes .../main/res/drawable-xxhdpi/ic_more_n.png | Bin 685 -> 0 bytes .../main/res/drawable-xxhdpi/ic_more_p.png | Bin 663 -> 0 bytes .../main/res/drawable-xxhdpi/ic_no_select.png | Bin 1214 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_rank.png | Bin 0 -> 30145 bytes .../drawable-xxhdpi/ic_read_menu_moring.png | Bin 2608 -> 0 bytes .../drawable-xxhdpi/ic_read_menu_night.png | Bin 1842 -> 0 bytes .../res/drawable-xxhdpi/ic_read_setting.png | Bin 1919 -> 0 bytes .../res/drawable-xxhdpi/ic_recent_update.png | Bin 794 -> 0 bytes .../main/res/drawable-xxhdpi/ic_recommend.png | Bin 0 -> 1514 bytes .../res/drawable-xxhdpi/ic_recommend_n.png | Bin 1134 -> 0 bytes .../res/drawable-xxhdpi/ic_recommend_p.png | Bin 1089 -> 0 bytes .../main/res/drawable-xxhdpi/ic_search.png | Bin 1070 -> 0 bytes .../main/res/drawable-xxhdpi/ic_select.png | Bin 1587 -> 0 bytes .../main/res/drawable-xxhdpi/ic_stack_n.png | Bin 578 -> 0 bytes .../main/res/drawable-xxhdpi/ic_stack_p.png | Bin 570 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_star.png | Bin 1004 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_theme.png | Bin 2608 -> 0 bytes .../res/drawable-xxhdpi/ic_type_default.png | Bin 1495470 -> 0 bytes .../drawable-xxhdpi/seekbar_thumb_normal.png | Bin 1607 -> 0 bytes .../seekbar_thumb_selected.png | Bin 1886 -> 0 bytes .../res/drawable-xxhdpi/theme_leather_bg.jpg | Bin 42402 -> 0 bytes .../drawable/{bg_sex.xml => bg_banner.xml} | 4 +- app/src/main/res/drawable/bg_blue_touch.xml | 6 - app/src/main/res/drawable/bg_category.xml | 10 + ...{listen_select.xml => bg_corner_trans.xml} | 6 +- app/src/main/res/drawable/bg_corner_white.xml | 2 +- app/src/main/res/drawable/bg_edit.xml | 7 + app/src/main/res/drawable/bg_feedback.xml | 8 + ...{bg_coner_line.xml => bg_google_login.xml} | 2 +- app/src/main/res/drawable/bg_listen.xml | 6 - app/src/main/res/drawable/bg_login.xml | 5 + app/src/main/res/drawable/bg_login_n.xml | 6 + app/src/main/res/drawable/bg_login_p.xml | 6 + app/src/main/res/drawable/bg_mine_buy.xml | 5 + app/src/main/res/drawable/bg_mine_buy_n.xml | 5 + app/src/main/res/drawable/bg_mine_buy_p.xml | 5 + app/src/main/res/drawable/bg_mine_vip.xml | 10 + app/src/main/res/drawable/bg_popup_menu.xml | 9 + app/src/main/res/drawable/bg_prefs_color.xml | 4 + app/src/main/res/drawable/bg_search.xml | 5 +- app/src/main/res/drawable/bg_searchview.xml | 11 + .../main/res/drawable/bg_shadow_bottom.png | Bin 0 -> 3127 bytes app/src/main/res/drawable/bg_touch.xml | 6 - app/src/main/res/drawable/common_label_bg.xml | 4 +- .../main/res/drawable/fastscroll_bubble.xml | 37 + .../main/res/drawable/fastscroll_handle.xml | 29 + .../main/res/drawable/fastscroll_track.xml | 25 + app/src/main/res/drawable/ic_add.xml | 11 + app/src/main/res/drawable/ic_arrange.xml | 17 + app/src/main/res/drawable/ic_arrow_back.xml | 9 + .../main/res/drawable/ic_arrow_drop_down.xml | 9 + .../main/res/drawable/ic_arrow_drop_up.xml | 9 + app/src/main/res/drawable/ic_author.xml | 12 + app/src/main/res/drawable/ic_auto_page.xml | 14 + .../main/res/drawable/ic_auto_page_stop.xml | 17 + app/src/main/res/drawable/ic_book_last.xml | 15 + app/src/main/res/drawable/ic_bookmark.xml | 11 + app/src/main/res/drawable/ic_bottom_books.xml | 5 + .../main/res/drawable/ic_bottom_books_e.png | Bin 0 -> 1218 bytes .../main/res/drawable/ic_bottom_books_s.png | Bin 0 -> 1516 bytes app/src/main/res/drawable/ic_bottom_mail.xml | 5 + .../main/res/drawable/ic_bottom_mail_e.png | Bin 0 -> 1123 bytes .../main/res/drawable/ic_bottom_mail_s.png | Bin 0 -> 1331 bytes .../main/res/drawable/ic_bottom_person.xml | 5 + .../main/res/drawable/ic_bottom_person_e.png | Bin 0 -> 1617 bytes .../main/res/drawable/ic_bottom_person_s.png | Bin 0 -> 2167 bytes app/src/main/res/drawable/ic_brightness.xml | 11 + app/src/main/res/drawable/ic_check.xml | 9 + app/src/main/res/drawable/ic_clear_all.xml | 17 + app/src/main/res/drawable/ic_copy.xml | 17 + app/src/main/res/drawable/ic_cursor_left.xml | 11 + app/src/main/res/drawable/ic_cursor_right.xml | 11 + app/src/main/res/drawable/ic_daytime.xml | 35 + app/src/main/res/drawable/ic_divider.xml | 6 + app/src/main/res/drawable/ic_download.xml | 9 + .../main/res/drawable/ic_download_line.xml | 14 + app/src/main/res/drawable/ic_google.xml | 18 + app/src/main/res/drawable/ic_history.xml | 12 + .../res/drawable/ic_interface_setting.xml | 14 + .../res/drawable/ic_launcher_background.xml | 2 +- app/src/main/res/drawable/ic_menu.xml | 9 + app/src/main/res/drawable/ic_more.xml | 15 + app/src/main/res/drawable/ic_more_vert.xml | 9 + .../main/res/drawable/ic_outline_cloud_24.xml | 10 + app/src/main/res/drawable/ic_pause_24dp.xml | 9 + app/src/main/res/drawable/ic_play_24dp.xml | 9 + app/src/main/res/drawable/ic_rank_type.xml | 9 + app/src/main/res/drawable/ic_read_aloud.xml | 11 + .../res/drawable/ic_refresh_black_24dp.xml | 14 + .../res/drawable/ic_refresh_white_24dp.xml | 9 + app/src/main/res/drawable/ic_search.xml | 17 + app/src/main/res/drawable/ic_search_hint.xml | 8 + app/src/main/res/drawable/ic_settings.xml | 16 + app/src/main/res/drawable/ic_skip_next.xml | 9 + .../main/res/drawable/ic_skip_previous.xml | 9 + .../main/res/drawable/ic_stop_black_24dp.xml | 9 + .../main/res/drawable/ic_time_add_24dp.xml | 12 + app/src/main/res/drawable/ic_toc.xml | 9 + .../main/res/drawable/ic_tools_feedback.xml | 15 + app/src/main/res/drawable/ic_tools_good.xml | 9 + .../main/res/drawable/ic_tools_history.xml | 15 + app/src/main/res/drawable/ic_tools_order.xml | 9 + .../main/res/drawable/ic_tools_setting.xml | 12 + app/src/main/res/drawable/ic_tools_theme.xml | 9 + app/src/main/res/drawable/ic_tune.xml | 17 + app/src/main/res/drawable/ic_update.xml | 14 + app/src/main/res/drawable/ic_view_quilt.xml | 26 + app/src/main/res/drawable/ic_vip.xml | 9 + .../main/res/drawable/ic_visibility_off.xml | 9 + app/src/main/res/drawable/ic_volume_up.xml | 9 + .../main/res/drawable/image_cover_default.png | Bin 0 -> 3155 bytes .../res/drawable/image_loader_loading.xml | 17 + app/src/main/res/drawable/line.xml | 12 - app/src/main/res/drawable/line_drawable.xml | 9 - app/src/main/res/drawable/loading_anim.xml | 11 + app/src/main/res/drawable/seekbar_bg.xml | 25 - app/src/main/res/drawable/seekbar_thumb.xml | 8 - app/src/main/res/drawable/select_book.xml | 5 - .../main/res/drawable/select_book_check.xml | 6 - app/src/main/res/drawable/select_more.xml | 5 - .../main/res/drawable/select_recommend.xml | 5 - app/src/main/res/drawable/select_stack.xml | 5 - .../res/drawable/selector_btn_accent_bg.xml | 5 + .../res/drawable/selector_category_load.xml | 16 - .../res/drawable/selector_category_unload.xml | 16 - .../main/res/drawable/selector_common_bg.xml | 7 + .../res/drawable/selector_fillet_btn_bg.xml | 5 + .../main/res/drawable/selector_tab_color.xml | 7 - app/src/main/res/drawable/shape_card_view.xml | 6 + .../main/res/drawable/shape_fillet_btn.xml | 6 + .../res/drawable/shape_fillet_btn_press.xml | 6 + .../main/res/drawable/shape_text_cursor.xml | 7 + app/src/main/res/drawable/text_color.xml | 8 - app/src/main/res/drawable/text_font_color.xml | 8 - app/src/main/res/drawable/thumb.xml | 16 - app/src/main/res/drawable/thumb_drawable.xml | 10 - app/src/main/res/layout/activity_about.xml | 60 + .../main/res/layout/activity_arrange_book.xml | 24 + .../main/res/layout/activity_book_detail.xml | 287 --- .../main/res/layout/activity_book_info.xml | 222 +++ .../res/layout/activity_book_type_list.xml | 34 - app/src/main/res/layout/activity_channel.xml | 23 + .../main/res/layout/activity_channel_info.xml | 22 + .../main/res/layout/activity_chapter_list.xml | 20 + app/src/main/res/layout/activity_daily.xml | 23 + app/src/main/res/layout/activity_end.xml | 22 + .../main/res/layout/activity_feed_back.xml | 50 + app/src/main/res/layout/activity_login.xml | 62 + app/src/main/res/layout/activity_main.xml | 34 +- app/src/main/res/layout/activity_rank.xml | 41 + .../main/res/layout/activity_rank_list.xml | 31 - app/src/main/res/layout/activity_read.xml | 203 --- .../main/res/layout/activity_read_book.xml | 53 + .../main/res/layout/activity_read_record.xml | 21 + .../layout/activity_recommend_book_list.xml | 35 - app/src/main/res/layout/activity_search.xml | 37 +- app/src/main/res/layout/activity_setting.xml | 109 -- .../res/layout/activity_setting_activity.xml | 28 + app/src/main/res/layout/activity_splash.xml | 23 - app/src/main/res/layout/activity_theme.xml | 27 + app/src/main/res/layout/activity_vip_shop.xml | 42 + app/src/main/res/layout/activity_welcome.xml | 43 + app/src/main/res/layout/dialog_auto_read.xml | 214 +++ .../res/layout/dialog_bookshelf_config.xml | 108 ++ .../res/layout/dialog_download_choice.xml | 78 + app/src/main/res/layout/dialog_edit_text.xml | 18 + .../main/res/layout/dialog_go_appraise.xml | 31 +- .../main/res/layout/dialog_listen_layout.xml | 265 --- app/src/main/res/layout/dialog_login.xml | 59 + app/src/main/res/layout/dialog_photo_view.xml | 15 + .../main/res/layout/dialog_read_adjust.xml | 108 ++ app/src/main/res/layout/dialog_read_aloud.xml | 349 ++++ .../res/layout/dialog_read_book_style.xml | 227 +++ app/src/main/res/layout/dialog_text_view.xml | 26 + app/src/main/res/layout/fragment_book.xml | 79 - .../main/res/layout/fragment_book_list.xml | 22 - .../main/res/layout/fragment_book_shelf.xml | 30 + app/src/main/res/layout/fragment_bookmark.xml | 13 + .../main/res/layout/fragment_chapter_list.xml | 66 + app/src/main/res/layout/fragment_mail.xml | 24 + app/src/main/res/layout/fragment_man.xml | 70 +- app/src/main/res/layout/fragment_mine.xml | 171 ++ app/src/main/res/layout/fragment_more.xml | 70 - app/src/main/res/layout/fragment_my.xml | 59 + .../main/res/layout/fragment_recommend.xml | 21 - app/src/main/res/layout/fragment_stack.xml | 22 - app/src/main/res/layout/fragment_woman.xml | 11 + .../res/layout/item_1line_text_and_del.xml | 26 + app/src/main/res/layout/item_arrange_book.xml | 86 + app/src/main/res/layout/item_book_common.xml | 118 ++ app/src/main/res/layout/item_bookmark.xml | 24 + .../main/res/layout/item_bookshelf_grid.xml | 67 + .../main/res/layout/item_bookshelf_list.xml | 179 ++ app/src/main/res/layout/item_channel.xml | 68 + app/src/main/res/layout/item_channel_head.xml | 19 + app/src/main/res/layout/item_chapter_list.xml | 43 + app/src/main/res/layout/item_click_item.xml | 68 + app/src/main/res/layout/item_end_item.xml | 37 + app/src/main/res/layout/item_fillet_text.xml | 18 + app/src/main/res/layout/item_header.xml | 11 + app/src/main/res/layout/item_hot.xml | 51 + app/src/main/res/layout/item_hot_item.xml | 36 + ...v_item_search.xml => item_init_search.xml} | 2 +- app/src/main/res/layout/item_label.xml | 4 +- app/src/main/res/layout/item_pick_head.xml | 68 + app/src/main/res/layout/item_read_bg.xml | 23 - app/src/main/res/layout/item_read_record.xml | 42 + app/src/main/res/layout/item_read_style.xml | 12 + .../res/layout/item_recomment_first_item.xml | 38 + .../main/res/layout/item_recomment_item.xml | 36 + app/src/main/res/layout/item_text.xml | 15 + app/src/main/res/layout/item_tools.xml | 55 + app/src/main/res/layout/item_type.xml | 31 + app/src/main/res/layout/layout_download.xml | 46 - app/src/main/res/layout/layout_light.xml | 41 - app/src/main/res/layout/layout_read_mark.xml | 50 - app/src/main/res/layout/layout_setting.xml | 261 --- app/src/main/res/layout/load_more_layout.xml | 41 - app/src/main/res/layout/popup_action_menu.xml | 46 + .../res/layout/rlv_edit_recommend_item.xml | 124 -- .../main/res/layout/rlv_empty_add_book.xml | 2 +- app/src/main/res/layout/rlv_empty_view.xml | 22 - app/src/main/res/layout/rlv_human_item.xml | 51 - app/src/main/res/layout/rlv_item_book.xml | 69 - .../main/res/layout/rlv_item_book_list.xml | 75 - .../res/layout/rlv_item_book_list_search.xml | 74 - .../main/res/layout/rlv_item_book_type.xml | 45 - app/src/main/res/layout/rlv_item_category.xml | 21 - .../main/res/layout/rlv_item_last_book.xml | 8 - app/src/main/res/layout/rlv_item_lovely.xml | 57 - app/src/main/res/layout/rlv_item_mark.xml | 24 - app/src/main/res/layout/title_recommend.xml | 45 - app/src/main/res/layout/title_stack.xml | 43 - app/src/main/res/layout/view_book_page.xml | 151 ++ app/src/main/res/layout/view_dynamic.xml | 20 + app/src/main/res/layout/view_empty.xml | 7 +- app/src/main/res/layout/view_fastscroller.xml | 47 + app/src/main/res/layout/view_loading.xml | 3 +- app/src/main/res/layout/view_net_error.xml | 13 +- app/src/main/res/layout/view_preference.xml | 66 + .../res/layout/view_preference_category.xml | 31 + app/src/main/res/layout/view_read_menu.xml | 346 ++++ .../{title_search.xml => view_search.xml} | 14 +- app/src/main/res/layout/view_tab_layout.xml | 9 + .../main/res/layout/view_tab_layout_min.xml | 11 + app/src/main/res/layout/view_title_bar.xml | 9 + .../main/res/layout/view_title_bar_dark.xml | 9 + app/src/main/res/layout/widget_head.xml | 18 +- app/src/main/res/layout/widget_tab.xml | 61 - .../main/res/menu/bottom_navigation_tab.xml | 23 - .../main/res/menu/content_select_action.xml | 25 + app/src/main/res/menu/main_bnv.xml | 22 + app/src/main/res/menu/main_bookshelf.xml | 35 + .../menu/{title_more.xml => main_mail.xml} | 7 +- app/src/main/res/menu/main_mine.xml | 12 + app/src/main/res/menu/read_book.xml | 51 + app/src/main/res/menu/search_view.xml | 11 + app/src/main/res/menu/title_book.xml | 34 - app/src/main/res/menu/title_edit.xml | 10 - app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2963 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4905 -> 5339 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2060 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2783 -> 3388 bytes app/src/main/res/mipmap-xhdpi/bg_splash.png | Bin 41429 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4490 -> 4926 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6895 -> 7472 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6387 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10413 -> 11873 bytes app/src/main/res/mipmap-xxhdpi/logo.png | Bin 12755 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9128 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15132 -> 16570 bytes .../res/mipmap-xxxhdpi/icon_read_book.png | Bin 0 -> 7404 bytes app/src/main/res/raw/silent_sound.mp3 | Bin 0 -> 2160 bytes app/src/main/res/values-night/colors.xml | 69 +- app/src/main/res/values-night/strings.xml | 161 -- app/src/main/res/values-night/themes.xml | 8 + app/src/main/res/values-zh-rHK/arrays.xml | 62 + app/src/main/res/values-zh-rHK/strings.xml | 251 +++ .../main/res/values-zh-rTW-night/colors.xml | 43 - .../main/res/values-zh-rTW-night/strings.xml | 159 -- app/src/main/res/values-zh-rTW/arrays.xml | 72 + app/src/main/res/values-zh-rTW/strings.xml | 376 ++-- app/src/main/res/values-zh/arrays.xml | 73 + app/src/main/res/values-zh/strings.xml | 251 +++ app/src/main/res/values/array_values.xml | 43 + app/src/main/res/values/arrays.xml | 76 +- app/src/main/res/values/attrs.xml | 226 ++- app/src/main/res/values/colors.xml | 126 +- .../res/values/colors_material_design.xml | 338 ++++ app/src/main/res/values/dimens.xml | 39 + app/src/main/res/values/ids.xml | 8 + app/src/main/res/values/pref_key_value.xml | 15 + app/src/main/res/values/strings.xml | 402 +++-- app/src/main/res/values/styles.xml | 115 -- app/src/main/res/values/themes.xml | 91 + app/src/main/res/xml/file_paths.xml | 11 - .../main/res/xml/network_security_config.xml | 6 +- app/src/main/res/xml/pref_config_aloud.xml | 26 + app/src/main/res/xml/pref_config_other.xml | 33 + app/src/main/res/xml/shortcuts.xml | 39 + .../java/com/novel/read/ExampleUnitTest.kt | 30 +- build.gradle | 18 +- common_lib/.gitignore | 1 - common_lib/build.gradle | 61 - common_lib/consumer-rules.pro | 0 common_lib/libs/ZHConverter.jar | Bin 105494 -> 0 bytes common_lib/proguard-rules.pro | 21 - .../common_lib/ExampleInstrumentedTest.kt | 24 - common_lib/src/main/AndroidManifest.xml | 5 - .../java/com/common_lib/base/BaseConstants.kt | 14 - .../java/com/common_lib/base/GsonManager.kt | 44 - .../java/com/common_lib/base/ScreenManager.kt | 109 -- .../base/camera/AutoFocusManager.java | 122 -- .../base/picture/ImageFilePath.java | 154 -- .../common_lib/base/picture/PictureUtil.java | 283 --- .../picture/TransformNormalImageTask.java | 19 - .../picture/TransformSurfaceImageTask.java | 28 - .../com/common_lib/base/utils/FileUtils.java | 116 -- .../com/common_lib/base/utils/MD5Utils.java | 46 - .../base/utils/ObjectAnalysisUtils.java | 307 ---- .../common_lib/base/utils/SecurityUtils.java | 101 -- .../base/utils/StatusBarCompatUtil.java | 62 - .../base/zxing/activity/CaptureActivity.java | 330 ---- .../base/zxing/camera/AutoFocusManager.java | 135 -- .../camera/CameraConfigurationManager.java | 219 --- .../base/zxing/camera/CameraManager.java | 204 --- .../base/zxing/camera/PreviewCallback.java | 56 - .../camera/open/OpenCameraInterface.java | 85 - .../zxing/decode/DecodeFormatManager.java | 53 - .../base/zxing/decode/DecodeHandler.java | 137 -- .../base/zxing/decode/DecodeThread.java | 96 - .../base/zxing/encoding/EncodingUtils.java | 229 --- .../base/zxing/utils/BeepManager.java | 139 -- .../zxing/utils/CaptureActivityHandler.java | 103 -- .../base/zxing/utils/InactivityTimer.java | 124 -- .../src/main/res/layout/activity_capture.xml | 45 - .../res/mipmap-xhdpi/home_scan_icon_back.png | Bin 2210 -> 0 bytes .../main/res/mipmap-xhdpi/home_scan_pic.png | Bin 6756 -> 0 bytes .../src/main/res/mipmap-xhdpi/icon_line.png | Bin 1391 -> 0 bytes .../res/mipmap-xxhdpi/home_scan_icon_back.png | Bin 2555 -> 0 bytes .../main/res/mipmap-xxhdpi/home_scan_pic.png | Bin 14478 -> 0 bytes common_lib/src/main/res/raw/beep.ogg | Bin 6401 -> 0 bytes common_lib/src/main/res/values/colors.xml | 12 - common_lib/src/main/res/values/ids.xml | 26 - common_lib/src/main/res/values/strings.xml | 3 - .../common_lib/common_lib/ExampleUnitTest.kt | 17 - config.gradle | 50 - gradle.properties | 6 +- gradle/wrapper/gradle-wrapper.properties | 4 +- net_serivce/.gitignore | 1 - net_serivce/build.gradle | 41 - net_serivce/proguard-rules.pro | 17 - .../mangolib/ExampleInstrumentedTest.java | 26 - net_serivce/src/main/AndroidManifest.xml | 13 - .../com/mango/mangolib/event/BaseEvent.kt | 33 - .../com/mango/mangolib/event/EventManager.kt | 73 - .../mango/mangolib/event/GenericBaseEvent.kt | 14 - .../mangolib/event/HTTPReponseErrorEvent.kt | 17 - .../mangolib/event/OttoEventInterface.kt | 7 - .../event/PermissionReqResultEvent.kt | 7 - .../event/picture/OnPhotoSendEvent.kt | 9 - .../com/mango/mangolib/http/ErrorResponse.kt | 13 - .../mangolib/http/GsonRequestBodyConverter.kt | 40 - .../http/GsonResponseBodyConverter.kt | 57 - .../mango/mangolib/http/GsonUTCdateAdapter.kt | 37 - .../com/mango/mangolib/http/MyRequestType.kt | 10 - .../mangolib/http/ResponseConverterFactory.kt | 57 - .../mango/mangolib/http/ServiceCallback.kt | 125 -- .../src/main/res/values-v19/styles.xml | 9 - .../src/main/res/values-v21/styles.xml | 9 - net_serivce/src/main/res/values/strings.xml | 3 - net_serivce/src/main/res/values/styles.xml | 15 - .../com/mango/mangolib/ExampleUnitTest.java | 17 - screenshot/edit.jpg | Bin 101342 -> 0 bytes screenshot/night.jpg | Bin 185823 -> 0 bytes screenshot/书库.jpg | Bin 450665 -> 0 bytes screenshot/书籍目录.png | Bin 213919 -> 0 bytes screenshot/推荐.jpg | Bin 528862 -> 0 bytes screenshot/插页1.jpg | Bin 144835 -> 0 bytes screenshot/插页2.jpg | Bin 123441 -> 0 bytes screenshot/插页3.jpg | Bin 134011 -> 0 bytes screenshot/搜索.png | Bin 152339 -> 0 bytes screenshot/缓存.png | Bin 302442 -> 0 bytes screenshot/设置.png | Bin 53706 -> 0 bytes screenshot/阅读页.png | Bin 367223 -> 0 bytes screenshot/阅读页菜单.png | Bin 370500 -> 0 bytes screenshot/首页.jpg | Bin 331554 -> 0 bytes settings.gradle | 4 +- 871 files changed, 35951 insertions(+), 22760 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/dictionaries/Administrator.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/markdown-navigator.xml delete mode 100644 .idea/markdown-navigator/profiles_settings.xml delete mode 100644 .idea/runConfigurations.xml create mode 100644 app/reader.jks create mode 100644 app/src/main/assets/bg/羊皮纸1.jpg create mode 100644 app/src/main/assets/defaultData/httpTTS.json create mode 100644 app/src/main/assets/defaultData/readConfig.json create mode 100644 app/src/main/assets/defaultData/themeConfig.json create mode 100644 app/src/main/assets/defaultData/txtTocRule.json create mode 100644 app/src/main/assets/font/number.ttf create mode 100644 app/src/main/java/com/novel/read/App.kt delete mode 100644 app/src/main/java/com/novel/read/Ext.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelBookDetailActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelBookTypeListActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelMainActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelRankListActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelReadActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelRecommendBookListActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelSearchActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelSettingActivity.kt delete mode 100644 app/src/main/java/com/novel/read/activity/NovelSplashActivity.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/BookAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/BookListAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/CategoryAdapter.java delete mode 100644 app/src/main/java/com/novel/read/adapter/EasyAdapter.java delete mode 100644 app/src/main/java/com/novel/read/adapter/EditRecommendAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/HistoryAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/HotAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/HumanAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/IViewHolder.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/LoveLyAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/MarkAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/PageStyleAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/RankAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/RankListAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/SearchAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/StackAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/ViewHolderImpl.java delete mode 100644 app/src/main/java/com/novel/read/adapter/ViewPageAdapter.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/holder/CategoryHolder.java delete mode 100644 app/src/main/java/com/novel/read/adapter/holder/EmptyHolder.kt delete mode 100644 app/src/main/java/com/novel/read/adapter/holder/MoreHolder.kt create mode 100644 app/src/main/java/com/novel/read/base/BaseActivity.kt create mode 100644 app/src/main/java/com/novel/read/base/BaseDialogFragment.kt create mode 100644 app/src/main/java/com/novel/read/base/BaseFragment.kt create mode 100644 app/src/main/java/com/novel/read/base/BasePreferenceFragment.kt create mode 100644 app/src/main/java/com/novel/read/base/BaseViewModel.kt delete mode 100644 app/src/main/java/com/novel/read/base/MyApp.kt delete mode 100644 app/src/main/java/com/novel/read/base/NovelBaseActivity.kt delete mode 100644 app/src/main/java/com/novel/read/base/NovelBaseFragment.kt create mode 100644 app/src/main/java/com/novel/read/base/VMBaseActivity.kt create mode 100644 app/src/main/java/com/novel/read/base/VMBaseFragment.kt create mode 100644 app/src/main/java/com/novel/read/constant/AppConst.kt create mode 100644 app/src/main/java/com/novel/read/constant/AppPattern.kt create mode 100644 app/src/main/java/com/novel/read/constant/BookType.kt create mode 100644 app/src/main/java/com/novel/read/constant/EventBus.kt create mode 100644 app/src/main/java/com/novel/read/constant/IntentAction.kt create mode 100644 app/src/main/java/com/novel/read/constant/LayoutType.kt create mode 100644 app/src/main/java/com/novel/read/constant/PreferKey.kt create mode 100644 app/src/main/java/com/novel/read/constant/Status.kt create mode 100644 app/src/main/java/com/novel/read/constant/Theme.kt delete mode 100644 app/src/main/java/com/novel/read/constants/Constant.kt create mode 100644 app/src/main/java/com/novel/read/data/README.md create mode 100644 app/src/main/java/com/novel/read/data/db/BookDao.kt create mode 100644 app/src/main/java/com/novel/read/data/db/BookDatabase.kt create mode 100644 app/src/main/java/com/novel/read/data/db/BookMarkDao.kt create mode 100644 app/src/main/java/com/novel/read/data/db/ChapterDao.kt create mode 100644 app/src/main/java/com/novel/read/data/db/ReadRecordDao.kt create mode 100644 app/src/main/java/com/novel/read/data/db/SearchHistoryDao.kt create mode 100644 app/src/main/java/com/novel/read/data/db/UserDao.kt create mode 100644 app/src/main/java/com/novel/read/data/db/entity/Book.kt create mode 100644 app/src/main/java/com/novel/read/data/db/entity/BookChapter.kt create mode 100644 app/src/main/java/com/novel/read/data/db/entity/Bookmark.kt create mode 100644 app/src/main/java/com/novel/read/data/db/entity/ChapterDetailEntity.kt create mode 100644 app/src/main/java/com/novel/read/data/db/entity/HttpTTS.kt create mode 100644 app/src/main/java/com/novel/read/data/db/entity/ReadRecord.kt rename app/src/main/java/com/novel/read/{model/db/SearchListTable.kt => data/db/entity/SearchHistory.kt} (63%) create mode 100644 app/src/main/java/com/novel/read/data/db/entity/User.kt create mode 100644 app/src/main/java/com/novel/read/data/model/AppUpdateResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/BookInfoResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/BookListResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/BoyEndRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/BoyHotRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/BoySearchRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/ChannelResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/ChannelSection.kt create mode 100644 app/src/main/java/com/novel/read/data/model/ChapterContentResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/ChapterResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/ClickRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/Default.kt create mode 100644 app/src/main/java/com/novel/read/data/model/EndRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/GirlEndRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/GirlHotRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/GirlSearchRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/GoodsResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/HomeBanner.kt create mode 100644 app/src/main/java/com/novel/read/data/model/HomeResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/HotRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/LoginReq.kt create mode 100644 app/src/main/java/com/novel/read/data/model/Pagination.kt create mode 100644 app/src/main/java/com/novel/read/data/model/PaginationSimilar.kt create mode 100644 app/src/main/java/com/novel/read/data/model/RecommendRank.kt create mode 100644 app/src/main/java/com/novel/read/data/model/SearchResp.kt create mode 100644 app/src/main/java/com/novel/read/data/model/Tools.kt create mode 100644 app/src/main/java/com/novel/read/data/model/TypeEntity.kt create mode 100644 app/src/main/java/com/novel/read/data/model/TypeName.kt create mode 100644 app/src/main/java/com/novel/read/data/model/UserResp.kt create mode 100644 app/src/main/java/com/novel/read/data/read/TextChapter.kt create mode 100644 app/src/main/java/com/novel/read/data/read/TextChar.kt create mode 100644 app/src/main/java/com/novel/read/data/read/TextLine.kt create mode 100644 app/src/main/java/com/novel/read/data/read/TextPage.kt delete mode 100644 app/src/main/java/com/novel/read/event/AddBookSignEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/BookArticleEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/DeleteBookSignEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/DeleteResponseEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/DeleteTaskEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/EditEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/ErrorChapterEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/FinishChapterEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/GetBookDetailEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/GetBookSignEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/GetCategoryTypeEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/GetRecommendBookEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/HideBottomBarEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/HotSearchEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/HumanEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/LoginEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/RankByUpdateEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/ReStartEvent.java delete mode 100644 app/src/main/java/com/novel/read/event/RecommendListEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/RxBus.java delete mode 100644 app/src/main/java/com/novel/read/event/SearchListEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/SwitchFragmentEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/UpdateBookEvent.kt delete mode 100644 app/src/main/java/com/novel/read/event/VersionEvent.kt delete mode 100644 app/src/main/java/com/novel/read/fragment/BookFragment.kt delete mode 100644 app/src/main/java/com/novel/read/fragment/BookListFragment.kt delete mode 100644 app/src/main/java/com/novel/read/fragment/ManFragment.kt delete mode 100644 app/src/main/java/com/novel/read/fragment/MoreFragment.kt delete mode 100644 app/src/main/java/com/novel/read/fragment/RecommendFragment.kt delete mode 100644 app/src/main/java/com/novel/read/fragment/StackFragment.kt delete mode 100644 app/src/main/java/com/novel/read/fragment/WomanFragment.kt create mode 100644 app/src/main/java/com/novel/read/help/ActivityHelp.kt create mode 100644 app/src/main/java/com/novel/read/help/AppConfig.kt create mode 100644 app/src/main/java/com/novel/read/help/BookHelp.kt create mode 100644 app/src/main/java/com/novel/read/help/DefaultData.kt create mode 100644 app/src/main/java/com/novel/read/help/ImageLoader.kt create mode 100644 app/src/main/java/com/novel/read/help/IntentDataHelp.kt create mode 100644 app/src/main/java/com/novel/read/help/IntentHelp.kt create mode 100644 app/src/main/java/com/novel/read/help/MediaHelp.kt create mode 100644 app/src/main/java/com/novel/read/help/ReadBookConfig.kt create mode 100644 app/src/main/java/com/novel/read/help/ReadTipConfig.kt create mode 100644 app/src/main/java/com/novel/read/help/ThemeConfig.kt create mode 100644 app/src/main/java/com/novel/read/help/TintHelper.kt create mode 100644 app/src/main/java/com/novel/read/help/coroutine/CompositeCoroutine.kt create mode 100644 app/src/main/java/com/novel/read/help/coroutine/Coroutine.kt create mode 100644 app/src/main/java/com/novel/read/help/coroutine/CoroutineContainer.kt delete mode 100644 app/src/main/java/com/novel/read/http/AccountManager.kt delete mode 100644 app/src/main/java/com/novel/read/http/CommonHeadersInterceptor.kt delete mode 100644 app/src/main/java/com/novel/read/http/ServiceGenerator.kt delete mode 100644 app/src/main/java/com/novel/read/http/Urls.kt delete mode 100644 app/src/main/java/com/novel/read/http/service/AccountService.kt delete mode 100644 app/src/main/java/com/novel/read/inter/OnLoadMoreListener.kt create mode 100644 app/src/main/java/com/novel/read/lib/ATH.kt create mode 100644 app/src/main/java/com/novel/read/lib/ATHUtils.kt create mode 100644 app/src/main/java/com/novel/read/lib/Selector.kt create mode 100644 app/src/main/java/com/novel/read/lib/ThemeStore.kt create mode 100644 app/src/main/java/com/novel/read/lib/ThemeStoreInterface.kt create mode 100644 app/src/main/java/com/novel/read/lib/ThemeStorePrefKeys.kt create mode 100644 app/src/main/java/com/novel/read/lib/dialogs/AlertBuilder.kt create mode 100644 app/src/main/java/com/novel/read/lib/dialogs/AndroidAlertBuilder.kt create mode 100644 app/src/main/java/com/novel/read/lib/dialogs/AndroidDialogs.kt create mode 100644 app/src/main/java/com/novel/read/lib/dialogs/AndroidSelectors.kt create mode 100644 app/src/main/java/com/novel/read/lib/dialogs/Dialogs.kt delete mode 100644 app/src/main/java/com/novel/read/model/db/BookChapterBean.java delete mode 100644 app/src/main/java/com/novel/read/model/db/BookRecordBean.kt delete mode 100644 app/src/main/java/com/novel/read/model/db/BookSignTable.kt delete mode 100644 app/src/main/java/com/novel/read/model/db/ChapterInfoBean.java delete mode 100644 app/src/main/java/com/novel/read/model/db/CollBookBean.java delete mode 100644 app/src/main/java/com/novel/read/model/db/DownloadTaskBean.java delete mode 100644 app/src/main/java/com/novel/read/model/db/dbManage/BookManager.java delete mode 100644 app/src/main/java/com/novel/read/model/db/dbManage/BookRepository.java delete mode 100644 app/src/main/java/com/novel/read/model/protocol/BookArticleResp.java delete mode 100644 app/src/main/java/com/novel/read/model/protocol/BookDetailResp.java delete mode 100644 app/src/main/java/com/novel/read/model/protocol/CategoryTypeResp.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/ChapterInfoPackage.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/HotSearchResp.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/MarkResp.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/RankByUpdateResp.java delete mode 100644 app/src/main/java/com/novel/read/model/protocol/RecommendBookResp.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/RecommendListResp.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/SearchResp.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/UidResp.kt delete mode 100644 app/src/main/java/com/novel/read/model/protocol/VersionResp.kt create mode 100644 app/src/main/java/com/novel/read/network/ServiceCreator.kt create mode 100644 app/src/main/java/com/novel/read/network/api/ApiException.kt create mode 100644 app/src/main/java/com/novel/read/network/api/ApiResult.kt create mode 100644 app/src/main/java/com/novel/read/network/api/BookService.kt create mode 100644 app/src/main/java/com/novel/read/network/repository/BookRepository.kt create mode 100644 app/src/main/java/com/novel/read/network/repository/HomeRepository.kt create mode 100644 app/src/main/java/com/novel/read/network/repository/ImageRepository.kt create mode 100644 app/src/main/java/com/novel/read/network/repository/SearchRepository.kt create mode 100644 app/src/main/java/com/novel/read/receiver/MediaButtonReceiver.kt create mode 100644 app/src/main/java/com/novel/read/service/BaseReadAloudService.kt create mode 100644 app/src/main/java/com/novel/read/service/CacheBookService.kt delete mode 100644 app/src/main/java/com/novel/read/service/DownloadMessage.java delete mode 100644 app/src/main/java/com/novel/read/service/DownloadService.java create mode 100644 app/src/main/java/com/novel/read/service/HttpReadAloudService.kt create mode 100644 app/src/main/java/com/novel/read/service/TTSReadAloudService.kt create mode 100644 app/src/main/java/com/novel/read/service/help/CacheBook.kt create mode 100644 app/src/main/java/com/novel/read/service/help/ReadAloud.kt create mode 100644 app/src/main/java/com/novel/read/service/help/ReadBook.kt create mode 100644 app/src/main/java/com/novel/read/ui/MainActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/MainViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/about/AboutActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/channel/ChannelActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/channel/ChannelAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/channel/ChannelInfoActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/channel/ChannelInfoAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/channel/ChannelInfoViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/channel/ChannelViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/chapter/BookMarkAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/chapter/BookmarkFragment.kt create mode 100644 app/src/main/java/com/novel/read/ui/chapter/ChapterListActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/chapter/ChapterListAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/chapter/ChapterListFragment.kt create mode 100644 app/src/main/java/com/novel/read/ui/chapter/ChapterListViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/daily/DailyActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/daily/DailyAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/daily/DailyViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/end/EndActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/end/EndAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/end/EndViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/feedback/FeedBackActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/feedback/FeedBackViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/info/BookInfoActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/info/BookInfoAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/info/BookInfoViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/BaseBookAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/BookShelfAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/BookViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/BooksAdapterGrid.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/BookshelfFragment.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/MailFragment.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/MailViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/RecommentFragment.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/pick/ClickAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/pick/EndAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/pick/HotAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/pick/PickAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/mail/pick/RecommendAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/my/MyFragment.kt create mode 100644 app/src/main/java/com/novel/read/ui/main/my/ToolsAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/rank/RankActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/rank/RankAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/rank/RankViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/rank/TypeAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/ReadBookActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/ReadBookActivityHelp.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/ReadBookViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/ReadMenu.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/TextActionMenu.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/config/ChineseConverter.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/config/ReadAdjustDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/config/ReadAloudDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/config/ReadStyleDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/config/TextFontWeightConverter.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/ContentTextView.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/ContentView.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/DataSource.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/PageFactory.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/PageView.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/TextPageFactory.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/delegate/CoverPageDelegate.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/delegate/HorizontalPageDelegate.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/delegate/NoAnimPageDelegate.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/delegate/PageDelegate.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/delegate/ScrollPageDelegate.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/delegate/SimulationPageDelegate.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/page/delegate/SlidePageDelegate.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/provider/ChapterProvider.kt create mode 100644 app/src/main/java/com/novel/read/ui/read/provider/ImageProvider.kt create mode 100644 app/src/main/java/com/novel/read/ui/record/ReadRecordActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/search/HistoryAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/search/HotAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/search/SearchActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/search/SearchAdapter.kt create mode 100644 app/src/main/java/com/novel/read/ui/search/SearchViewModel.kt create mode 100644 app/src/main/java/com/novel/read/ui/setting/OtherConfigFragment.kt create mode 100644 app/src/main/java/com/novel/read/ui/setting/SettingActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/theme/ThemeActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/welcome/WelcomeActivity.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/ATECheckBox.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/ATERadioNoButton.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/ATESeekBar.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/ATESwitch.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/AccentBgTextView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/AccentTextView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/AutoCompleteTextView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/BadgeView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/BatteryView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/EditText.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/HeadLayout.java create mode 100644 app/src/main/java/com/novel/read/ui/widget/InertiaScrollTextView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/RefreshProgressBar.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/SearchView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/SmoothCheckBox.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/StrokeTextView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/TitleBar.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/UpLinearLayoutManager.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/VerticalDivider.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/anim/RotateLoading.kt rename app/src/main/java/com/novel/read/{ => ui}/widget/dialog/AppraiseDialog.kt (90%) create mode 100644 app/src/main/java/com/novel/read/ui/widget/dialog/AutoReadDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/dialog/LoginDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/dialog/PhotoDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/dialog/ReadAloudConfigDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/dialog/TextDialog.kt rename app/src/main/java/com/novel/read/{widget => ui/widget/dynamic}/RefreshLayout.java (99%) create mode 100644 app/src/main/java/com/novel/read/ui/widget/image/CircleImageView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/image/CoverImageView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/image/FilletImageView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/image/PhotoView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/image/photo/Info.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/image/photo/RotateGestureDetector.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/prefs/EditTextPreferenceDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/prefs/ListPreferenceDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/prefs/MultiSelectListPreferenceDialog.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/prefs/NameListPreference.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/prefs/Preference.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/prefs/PreferenceCategory.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/prefs/SwitchPreference.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/recycler/ItemTouchCallback.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollRecyclerView.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollStateChangeListener.kt create mode 100644 app/src/main/java/com/novel/read/ui/widget/scroller/FastScroller.kt create mode 100644 app/src/main/java/com/novel/read/user/UserManager.kt create mode 100644 app/src/main/java/com/novel/read/user/VipHelper.kt create mode 100644 app/src/main/java/com/novel/read/utils/AnimationUtilsSupport.kt create mode 100644 app/src/main/java/com/novel/read/utils/BitmapUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/BooksDiffCallBack.kt create mode 100644 app/src/main/java/com/novel/read/utils/ColorUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/ConvertUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/DrawableUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/FileUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/LanguageUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/MD5Utils.kt create mode 100644 app/src/main/java/com/novel/read/utils/NetworkUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/RealPathUtil.kt create mode 100644 app/src/main/java/com/novel/read/utils/StringUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/SystemUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/UIUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/ViewUtils.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/ActivityExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/AlertDialogExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/ContextExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/EventBusExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/FloatExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/FragmentExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/GsonExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/IntExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/MaterialValueHelper.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/MenuExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/StringExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/Toasts.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/ViewExtensions.kt create mode 100644 app/src/main/java/com/novel/read/utils/ext/ViewModelKt.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/BrightnessUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/Charset.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/CleanCacheUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/DateUtli.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/DialogUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/EvenItemDecoration.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/FileUtils.java delete mode 100644 app/src/main/java/com/novel/read/utlis/GlideImageLoader.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/IOUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/LocalManageUtil.java delete mode 100644 app/src/main/java/com/novel/read/utlis/MD5Utils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/MyTimeTask.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/NetworkUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/PermissionUtil.java delete mode 100644 app/src/main/java/com/novel/read/utlis/PhoneUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/RxUtils.java delete mode 100644 app/src/main/java/com/novel/read/utlis/ScreenUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/SpUtil.java delete mode 100644 app/src/main/java/com/novel/read/utlis/StatusBarUtil.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/StringUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/SystemBarUtils.kt delete mode 100644 app/src/main/java/com/novel/read/utlis/VersionUtil.kt delete mode 100644 app/src/main/java/com/novel/read/widget/HeadLayout.kt delete mode 100644 app/src/main/java/com/novel/read/widget/VpTabLayout.kt delete mode 100644 app/src/main/java/com/novel/read/widget/dialog/ReadSettingDialog.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/LocalPageLoader.java delete mode 100644 app/src/main/java/com/novel/read/widget/page/NetPageLoader.java delete mode 100644 app/src/main/java/com/novel/read/widget/page/PageAnimation.java delete mode 100644 app/src/main/java/com/novel/read/widget/page/PageLoader.java delete mode 100644 app/src/main/java/com/novel/read/widget/page/PageMode.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/PageStyle.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/PageView.java delete mode 100644 app/src/main/java/com/novel/read/widget/page/ReadSettingManager.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/TxtChapter.java delete mode 100644 app/src/main/java/com/novel/read/widget/page/TxtPage.java delete mode 100644 app/src/main/java/com/novel/read/widget/page/Void.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/anim/CoverPageAnim.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/anim/HorizonPageAnim.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/anim/NonePageAnim.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/anim/ScrollPageAnim.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/anim/SimulationPageAnim.kt delete mode 100644 app/src/main/java/com/novel/read/widget/page/anim/SlidePageAnim.kt create mode 100644 app/src/main/res/anim/anim_readbook_bottom_in.xml create mode 100644 app/src/main/res/anim/anim_readbook_bottom_out.xml create mode 100644 app/src/main/res/anim/anim_readbook_top_in.xml create mode 100644 app/src/main/res/anim/anim_readbook_top_out.xml delete mode 100644 app/src/main/res/anim/slide_bottom_in.xml delete mode 100644 app/src/main/res/anim/slide_bottom_out.xml delete mode 100644 app/src/main/res/anim/slide_left_in.xml delete mode 100644 app/src/main/res/anim/slide_left_out.xml delete mode 100644 app/src/main/res/anim/slide_right_in.xml delete mode 100644 app/src/main/res/anim/slide_right_out.xml delete mode 100644 app/src/main/res/anim/slide_top_in.xml delete mode 100644 app/src/main/res/anim/slide_top_out.xml delete mode 100644 app/src/main/res/drawable-night-xxhdpi/ic_back.png delete mode 100644 app/src/main/res/drawable-night-xxhdpi/ic_edit.png delete mode 100644 app/src/main/res/drawable-night-xxhdpi/ic_menu_mode_night_normal.png delete mode 100644 app/src/main/res/drawable-night-xxhdpi/ic_search.png delete mode 100644 app/src/main/res/drawable-night-xxhdpi/ic_theme.png delete mode 100644 app/src/main/res/drawable-xxhdpi/cover_default.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_back.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_book_add.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_book_detail.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_book_end.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_book_n.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_book_p.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_book_type.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_cache.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_cancel.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_checked.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_click.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_contents.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_daily.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_default.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_edit.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_edit_recommend.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_end.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_font_add.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_font_min.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_guide.jpg delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_history.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_hot_search.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_human.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_item_category_activated.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_item_category_download.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_item_category_normal.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_label.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_light.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_listen.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_love_look.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_lovely.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_add_mark.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_clear.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_mode_night_normal.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_more_n.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_more_p.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_no_select.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_rank.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_read_menu_moring.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_read_menu_night.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_read_setting.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_recent_update.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_recommend.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_recommend_n.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_recommend_p.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_search.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_select.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_stack_n.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_stack_p.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_star.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_theme.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_type_default.png delete mode 100644 app/src/main/res/drawable-xxhdpi/seekbar_thumb_normal.png delete mode 100644 app/src/main/res/drawable-xxhdpi/seekbar_thumb_selected.png delete mode 100644 app/src/main/res/drawable-xxhdpi/theme_leather_bg.jpg rename app/src/main/res/drawable/{bg_sex.xml => bg_banner.xml} (53%) delete mode 100644 app/src/main/res/drawable/bg_blue_touch.xml create mode 100644 app/src/main/res/drawable/bg_category.xml rename app/src/main/res/drawable/{listen_select.xml => bg_corner_trans.xml} (52%) create mode 100644 app/src/main/res/drawable/bg_edit.xml create mode 100644 app/src/main/res/drawable/bg_feedback.xml rename app/src/main/res/drawable/{bg_coner_line.xml => bg_google_login.xml} (64%) delete mode 100644 app/src/main/res/drawable/bg_listen.xml create mode 100644 app/src/main/res/drawable/bg_login.xml create mode 100644 app/src/main/res/drawable/bg_login_n.xml create mode 100644 app/src/main/res/drawable/bg_login_p.xml create mode 100644 app/src/main/res/drawable/bg_mine_buy.xml create mode 100644 app/src/main/res/drawable/bg_mine_buy_n.xml create mode 100644 app/src/main/res/drawable/bg_mine_buy_p.xml create mode 100644 app/src/main/res/drawable/bg_mine_vip.xml create mode 100644 app/src/main/res/drawable/bg_popup_menu.xml create mode 100644 app/src/main/res/drawable/bg_prefs_color.xml create mode 100644 app/src/main/res/drawable/bg_searchview.xml create mode 100644 app/src/main/res/drawable/bg_shadow_bottom.png delete mode 100644 app/src/main/res/drawable/bg_touch.xml create mode 100644 app/src/main/res/drawable/fastscroll_bubble.xml create mode 100644 app/src/main/res/drawable/fastscroll_handle.xml create mode 100644 app/src/main/res/drawable/fastscroll_track.xml create mode 100644 app/src/main/res/drawable/ic_add.xml create mode 100644 app/src/main/res/drawable/ic_arrange.xml create mode 100644 app/src/main/res/drawable/ic_arrow_back.xml create mode 100644 app/src/main/res/drawable/ic_arrow_drop_down.xml create mode 100644 app/src/main/res/drawable/ic_arrow_drop_up.xml create mode 100644 app/src/main/res/drawable/ic_author.xml create mode 100644 app/src/main/res/drawable/ic_auto_page.xml create mode 100644 app/src/main/res/drawable/ic_auto_page_stop.xml create mode 100644 app/src/main/res/drawable/ic_book_last.xml create mode 100644 app/src/main/res/drawable/ic_bookmark.xml create mode 100644 app/src/main/res/drawable/ic_bottom_books.xml create mode 100644 app/src/main/res/drawable/ic_bottom_books_e.png create mode 100644 app/src/main/res/drawable/ic_bottom_books_s.png create mode 100644 app/src/main/res/drawable/ic_bottom_mail.xml create mode 100644 app/src/main/res/drawable/ic_bottom_mail_e.png create mode 100644 app/src/main/res/drawable/ic_bottom_mail_s.png create mode 100644 app/src/main/res/drawable/ic_bottom_person.xml create mode 100644 app/src/main/res/drawable/ic_bottom_person_e.png create mode 100644 app/src/main/res/drawable/ic_bottom_person_s.png create mode 100644 app/src/main/res/drawable/ic_brightness.xml create mode 100644 app/src/main/res/drawable/ic_check.xml create mode 100644 app/src/main/res/drawable/ic_clear_all.xml create mode 100644 app/src/main/res/drawable/ic_copy.xml create mode 100644 app/src/main/res/drawable/ic_cursor_left.xml create mode 100644 app/src/main/res/drawable/ic_cursor_right.xml create mode 100644 app/src/main/res/drawable/ic_daytime.xml create mode 100644 app/src/main/res/drawable/ic_divider.xml create mode 100644 app/src/main/res/drawable/ic_download.xml create mode 100644 app/src/main/res/drawable/ic_download_line.xml create mode 100644 app/src/main/res/drawable/ic_google.xml create mode 100644 app/src/main/res/drawable/ic_history.xml create mode 100644 app/src/main/res/drawable/ic_interface_setting.xml create mode 100644 app/src/main/res/drawable/ic_menu.xml create mode 100644 app/src/main/res/drawable/ic_more.xml create mode 100644 app/src/main/res/drawable/ic_more_vert.xml create mode 100644 app/src/main/res/drawable/ic_outline_cloud_24.xml create mode 100644 app/src/main/res/drawable/ic_pause_24dp.xml create mode 100644 app/src/main/res/drawable/ic_play_24dp.xml create mode 100644 app/src/main/res/drawable/ic_rank_type.xml create mode 100644 app/src/main/res/drawable/ic_read_aloud.xml create mode 100644 app/src/main/res/drawable/ic_refresh_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_refresh_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_search.xml create mode 100644 app/src/main/res/drawable/ic_search_hint.xml create mode 100644 app/src/main/res/drawable/ic_settings.xml create mode 100644 app/src/main/res/drawable/ic_skip_next.xml create mode 100644 app/src/main/res/drawable/ic_skip_previous.xml create mode 100644 app/src/main/res/drawable/ic_stop_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_time_add_24dp.xml create mode 100644 app/src/main/res/drawable/ic_toc.xml create mode 100644 app/src/main/res/drawable/ic_tools_feedback.xml create mode 100644 app/src/main/res/drawable/ic_tools_good.xml create mode 100644 app/src/main/res/drawable/ic_tools_history.xml create mode 100644 app/src/main/res/drawable/ic_tools_order.xml create mode 100644 app/src/main/res/drawable/ic_tools_setting.xml create mode 100644 app/src/main/res/drawable/ic_tools_theme.xml create mode 100644 app/src/main/res/drawable/ic_tune.xml create mode 100644 app/src/main/res/drawable/ic_update.xml create mode 100644 app/src/main/res/drawable/ic_view_quilt.xml create mode 100644 app/src/main/res/drawable/ic_vip.xml create mode 100644 app/src/main/res/drawable/ic_visibility_off.xml create mode 100644 app/src/main/res/drawable/ic_volume_up.xml create mode 100644 app/src/main/res/drawable/image_cover_default.png create mode 100644 app/src/main/res/drawable/image_loader_loading.xml delete mode 100644 app/src/main/res/drawable/line.xml delete mode 100644 app/src/main/res/drawable/line_drawable.xml create mode 100644 app/src/main/res/drawable/loading_anim.xml delete mode 100644 app/src/main/res/drawable/seekbar_bg.xml delete mode 100644 app/src/main/res/drawable/seekbar_thumb.xml delete mode 100644 app/src/main/res/drawable/select_book.xml delete mode 100644 app/src/main/res/drawable/select_book_check.xml delete mode 100644 app/src/main/res/drawable/select_more.xml delete mode 100644 app/src/main/res/drawable/select_recommend.xml delete mode 100644 app/src/main/res/drawable/select_stack.xml create mode 100644 app/src/main/res/drawable/selector_btn_accent_bg.xml delete mode 100644 app/src/main/res/drawable/selector_category_load.xml delete mode 100644 app/src/main/res/drawable/selector_category_unload.xml create mode 100644 app/src/main/res/drawable/selector_common_bg.xml create mode 100644 app/src/main/res/drawable/selector_fillet_btn_bg.xml delete mode 100644 app/src/main/res/drawable/selector_tab_color.xml create mode 100644 app/src/main/res/drawable/shape_card_view.xml create mode 100644 app/src/main/res/drawable/shape_fillet_btn.xml create mode 100644 app/src/main/res/drawable/shape_fillet_btn_press.xml create mode 100644 app/src/main/res/drawable/shape_text_cursor.xml delete mode 100644 app/src/main/res/drawable/text_color.xml delete mode 100644 app/src/main/res/drawable/text_font_color.xml delete mode 100644 app/src/main/res/drawable/thumb.xml delete mode 100644 app/src/main/res/drawable/thumb_drawable.xml create mode 100644 app/src/main/res/layout/activity_about.xml create mode 100644 app/src/main/res/layout/activity_arrange_book.xml delete mode 100644 app/src/main/res/layout/activity_book_detail.xml create mode 100644 app/src/main/res/layout/activity_book_info.xml delete mode 100644 app/src/main/res/layout/activity_book_type_list.xml create mode 100644 app/src/main/res/layout/activity_channel.xml create mode 100644 app/src/main/res/layout/activity_channel_info.xml create mode 100644 app/src/main/res/layout/activity_chapter_list.xml create mode 100644 app/src/main/res/layout/activity_daily.xml create mode 100644 app/src/main/res/layout/activity_end.xml create mode 100644 app/src/main/res/layout/activity_feed_back.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_rank.xml delete mode 100644 app/src/main/res/layout/activity_rank_list.xml delete mode 100644 app/src/main/res/layout/activity_read.xml create mode 100644 app/src/main/res/layout/activity_read_book.xml create mode 100644 app/src/main/res/layout/activity_read_record.xml delete mode 100644 app/src/main/res/layout/activity_recommend_book_list.xml delete mode 100644 app/src/main/res/layout/activity_setting.xml create mode 100644 app/src/main/res/layout/activity_setting_activity.xml delete mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/activity_theme.xml create mode 100644 app/src/main/res/layout/activity_vip_shop.xml create mode 100644 app/src/main/res/layout/activity_welcome.xml create mode 100644 app/src/main/res/layout/dialog_auto_read.xml create mode 100644 app/src/main/res/layout/dialog_bookshelf_config.xml create mode 100644 app/src/main/res/layout/dialog_download_choice.xml create mode 100644 app/src/main/res/layout/dialog_edit_text.xml delete mode 100644 app/src/main/res/layout/dialog_listen_layout.xml create mode 100644 app/src/main/res/layout/dialog_login.xml create mode 100644 app/src/main/res/layout/dialog_photo_view.xml create mode 100644 app/src/main/res/layout/dialog_read_adjust.xml create mode 100644 app/src/main/res/layout/dialog_read_aloud.xml create mode 100644 app/src/main/res/layout/dialog_read_book_style.xml create mode 100644 app/src/main/res/layout/dialog_text_view.xml delete mode 100644 app/src/main/res/layout/fragment_book.xml delete mode 100644 app/src/main/res/layout/fragment_book_list.xml create mode 100644 app/src/main/res/layout/fragment_book_shelf.xml create mode 100644 app/src/main/res/layout/fragment_bookmark.xml create mode 100644 app/src/main/res/layout/fragment_chapter_list.xml create mode 100644 app/src/main/res/layout/fragment_mail.xml create mode 100644 app/src/main/res/layout/fragment_mine.xml delete mode 100644 app/src/main/res/layout/fragment_more.xml create mode 100644 app/src/main/res/layout/fragment_my.xml delete mode 100644 app/src/main/res/layout/fragment_recommend.xml delete mode 100644 app/src/main/res/layout/fragment_stack.xml create mode 100644 app/src/main/res/layout/fragment_woman.xml create mode 100644 app/src/main/res/layout/item_1line_text_and_del.xml create mode 100644 app/src/main/res/layout/item_arrange_book.xml create mode 100644 app/src/main/res/layout/item_book_common.xml create mode 100644 app/src/main/res/layout/item_bookmark.xml create mode 100644 app/src/main/res/layout/item_bookshelf_grid.xml create mode 100644 app/src/main/res/layout/item_bookshelf_list.xml create mode 100644 app/src/main/res/layout/item_channel.xml create mode 100644 app/src/main/res/layout/item_channel_head.xml create mode 100644 app/src/main/res/layout/item_chapter_list.xml create mode 100644 app/src/main/res/layout/item_click_item.xml create mode 100644 app/src/main/res/layout/item_end_item.xml create mode 100644 app/src/main/res/layout/item_fillet_text.xml create mode 100644 app/src/main/res/layout/item_header.xml create mode 100644 app/src/main/res/layout/item_hot.xml create mode 100644 app/src/main/res/layout/item_hot_item.xml rename app/src/main/res/layout/{rlv_item_search.xml => item_init_search.xml} (89%) create mode 100644 app/src/main/res/layout/item_pick_head.xml delete mode 100644 app/src/main/res/layout/item_read_bg.xml create mode 100644 app/src/main/res/layout/item_read_record.xml create mode 100644 app/src/main/res/layout/item_read_style.xml create mode 100644 app/src/main/res/layout/item_recomment_first_item.xml create mode 100644 app/src/main/res/layout/item_recomment_item.xml create mode 100644 app/src/main/res/layout/item_text.xml create mode 100644 app/src/main/res/layout/item_tools.xml create mode 100644 app/src/main/res/layout/item_type.xml delete mode 100644 app/src/main/res/layout/layout_download.xml delete mode 100644 app/src/main/res/layout/layout_light.xml delete mode 100644 app/src/main/res/layout/layout_read_mark.xml delete mode 100644 app/src/main/res/layout/layout_setting.xml delete mode 100644 app/src/main/res/layout/load_more_layout.xml create mode 100644 app/src/main/res/layout/popup_action_menu.xml delete mode 100644 app/src/main/res/layout/rlv_edit_recommend_item.xml delete mode 100644 app/src/main/res/layout/rlv_empty_view.xml delete mode 100644 app/src/main/res/layout/rlv_human_item.xml delete mode 100644 app/src/main/res/layout/rlv_item_book.xml delete mode 100644 app/src/main/res/layout/rlv_item_book_list.xml delete mode 100644 app/src/main/res/layout/rlv_item_book_list_search.xml delete mode 100644 app/src/main/res/layout/rlv_item_book_type.xml delete mode 100644 app/src/main/res/layout/rlv_item_category.xml delete mode 100644 app/src/main/res/layout/rlv_item_last_book.xml delete mode 100644 app/src/main/res/layout/rlv_item_lovely.xml delete mode 100644 app/src/main/res/layout/rlv_item_mark.xml delete mode 100644 app/src/main/res/layout/title_recommend.xml delete mode 100644 app/src/main/res/layout/title_stack.xml create mode 100644 app/src/main/res/layout/view_book_page.xml create mode 100644 app/src/main/res/layout/view_dynamic.xml create mode 100644 app/src/main/res/layout/view_fastscroller.xml create mode 100644 app/src/main/res/layout/view_preference.xml create mode 100644 app/src/main/res/layout/view_preference_category.xml create mode 100644 app/src/main/res/layout/view_read_menu.xml rename app/src/main/res/layout/{title_search.xml => view_search.xml} (77%) create mode 100644 app/src/main/res/layout/view_tab_layout.xml create mode 100644 app/src/main/res/layout/view_tab_layout_min.xml create mode 100644 app/src/main/res/layout/view_title_bar.xml create mode 100644 app/src/main/res/layout/view_title_bar_dark.xml delete mode 100644 app/src/main/res/layout/widget_tab.xml delete mode 100644 app/src/main/res/menu/bottom_navigation_tab.xml create mode 100644 app/src/main/res/menu/content_select_action.xml create mode 100644 app/src/main/res/menu/main_bnv.xml create mode 100644 app/src/main/res/menu/main_bookshelf.xml rename app/src/main/res/menu/{title_more.xml => main_mail.xml} (74%) create mode 100644 app/src/main/res/menu/main_mine.xml create mode 100644 app/src/main/res/menu/read_book.xml create mode 100644 app/src/main/res/menu/search_view.xml delete mode 100644 app/src/main/res/menu/title_book.xml delete mode 100644 app/src/main/res/menu/title_edit.xml delete mode 100644 app/src/main/res/mipmap-xhdpi/bg_splash.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/logo.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_read_book.png create mode 100644 app/src/main/res/raw/silent_sound.mp3 delete mode 100644 app/src/main/res/values-night/strings.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-zh-rHK/arrays.xml create mode 100644 app/src/main/res/values-zh-rHK/strings.xml delete mode 100644 app/src/main/res/values-zh-rTW-night/colors.xml delete mode 100644 app/src/main/res/values-zh-rTW-night/strings.xml create mode 100644 app/src/main/res/values-zh-rTW/arrays.xml create mode 100644 app/src/main/res/values-zh/arrays.xml create mode 100644 app/src/main/res/values-zh/strings.xml create mode 100644 app/src/main/res/values/array_values.xml create mode 100644 app/src/main/res/values/colors_material_design.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ids.xml create mode 100644 app/src/main/res/values/pref_key_value.xml delete mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml delete mode 100644 app/src/main/res/xml/file_paths.xml create mode 100644 app/src/main/res/xml/pref_config_aloud.xml create mode 100644 app/src/main/res/xml/pref_config_other.xml create mode 100644 app/src/main/res/xml/shortcuts.xml delete mode 100644 common_lib/.gitignore delete mode 100644 common_lib/build.gradle delete mode 100644 common_lib/consumer-rules.pro delete mode 100644 common_lib/libs/ZHConverter.jar delete mode 100644 common_lib/proguard-rules.pro delete mode 100644 common_lib/src/androidTest/java/com/common_lib/common_lib/ExampleInstrumentedTest.kt delete mode 100644 common_lib/src/main/AndroidManifest.xml delete mode 100644 common_lib/src/main/java/com/common_lib/base/BaseConstants.kt delete mode 100644 common_lib/src/main/java/com/common_lib/base/GsonManager.kt delete mode 100644 common_lib/src/main/java/com/common_lib/base/ScreenManager.kt delete mode 100644 common_lib/src/main/java/com/common_lib/base/camera/AutoFocusManager.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/picture/ImageFilePath.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/picture/PictureUtil.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/picture/TransformNormalImageTask.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/picture/TransformSurfaceImageTask.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/utils/FileUtils.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/utils/MD5Utils.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/utils/ObjectAnalysisUtils.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/utils/SecurityUtils.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/utils/StatusBarCompatUtil.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/activity/CaptureActivity.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/camera/AutoFocusManager.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/camera/CameraConfigurationManager.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/camera/CameraManager.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/camera/PreviewCallback.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/camera/open/OpenCameraInterface.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/decode/DecodeFormatManager.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/decode/DecodeHandler.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/decode/DecodeThread.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/encoding/EncodingUtils.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/utils/BeepManager.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/utils/CaptureActivityHandler.java delete mode 100644 common_lib/src/main/java/com/common_lib/base/zxing/utils/InactivityTimer.java delete mode 100644 common_lib/src/main/res/layout/activity_capture.xml delete mode 100644 common_lib/src/main/res/mipmap-xhdpi/home_scan_icon_back.png delete mode 100644 common_lib/src/main/res/mipmap-xhdpi/home_scan_pic.png delete mode 100644 common_lib/src/main/res/mipmap-xhdpi/icon_line.png delete mode 100644 common_lib/src/main/res/mipmap-xxhdpi/home_scan_icon_back.png delete mode 100644 common_lib/src/main/res/mipmap-xxhdpi/home_scan_pic.png delete mode 100644 common_lib/src/main/res/raw/beep.ogg delete mode 100644 common_lib/src/main/res/values/colors.xml delete mode 100644 common_lib/src/main/res/values/ids.xml delete mode 100644 common_lib/src/main/res/values/strings.xml delete mode 100644 common_lib/src/test/java/com/common_lib/common_lib/ExampleUnitTest.kt delete mode 100644 config.gradle delete mode 100644 net_serivce/.gitignore delete mode 100644 net_serivce/build.gradle delete mode 100644 net_serivce/proguard-rules.pro delete mode 100644 net_serivce/src/androidTest/java/com/mango/mangolib/ExampleInstrumentedTest.java delete mode 100644 net_serivce/src/main/AndroidManifest.xml delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/event/BaseEvent.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/event/EventManager.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/event/GenericBaseEvent.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/event/HTTPReponseErrorEvent.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/event/OttoEventInterface.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/event/PermissionReqResultEvent.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/event/picture/OnPhotoSendEvent.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/http/ErrorResponse.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/http/GsonRequestBodyConverter.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/http/GsonResponseBodyConverter.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/http/GsonUTCdateAdapter.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/http/MyRequestType.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/http/ResponseConverterFactory.kt delete mode 100644 net_serivce/src/main/java/com/mango/mangolib/http/ServiceCallback.kt delete mode 100644 net_serivce/src/main/res/values-v19/styles.xml delete mode 100644 net_serivce/src/main/res/values-v21/styles.xml delete mode 100644 net_serivce/src/main/res/values/strings.xml delete mode 100644 net_serivce/src/main/res/values/styles.xml delete mode 100644 net_serivce/src/test/java/com/mango/mangolib/ExampleUnitTest.java delete mode 100644 screenshot/edit.jpg delete mode 100644 screenshot/night.jpg delete mode 100644 screenshot/书库.jpg delete mode 100644 screenshot/书籍目录.png delete mode 100644 screenshot/推荐.jpg delete mode 100644 screenshot/插页1.jpg delete mode 100644 screenshot/插页2.jpg delete mode 100644 screenshot/插页3.jpg delete mode 100644 screenshot/搜索.png delete mode 100644 screenshot/缓存.png delete mode 100644 screenshot/设置.png delete mode 100644 screenshot/阅读页.png delete mode 100644 screenshot/阅读页菜单.png delete mode 100644 screenshot/首页.jpg diff --git a/.gitignore b/.gitignore index 603b140..aa724b7 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ /captures .externalNativeBuild .cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 43fd926..3c7772a 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,12 +1,26 @@ + + - - + \ No newline at end of file diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml deleted file mode 100644 index f2aa065..0000000 --- a/.idea/markdown-navigator.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml deleted file mode 100644 index db06266..0000000 --- a/.idea/markdown-navigator/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 89482aa..b45762e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,16 +1,11 @@ - - - - - - + - + 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/.idea/vcs.xml b/.idea/vcs.xml index fdf1fc8..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,7 +1,6 @@ - - + \ No newline at end of file diff --git a/README.md b/README.md index c5a187c..eac3fba 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,26 @@ # Reader -一款在任阅基础上改进的网络小说阅读器📕,采用Kt编写,支持追书、看书。拥有语音朗读,仿真翻页等功能。相比原作者: +一款网络小说阅读器📕,采用Kt编写,支持追书、看书。支持TTS语音朗读,仿真翻页等功能。相比old分支: - 重写代码逻辑,优化代码结构,Md设计风格 - - + 使用郭神的LitePal框架存储 - + + + sql分层处理,MVVM 架构 + * 语音朗读、插画、国际化、黑夜模式等功能都进行了实现 - - - 适配了安卓9.0,使用AndroidX控件,对刘海屏等异形屏幕有了很好的支持 - -注: 之前项目采用Java编写,之后才转的Kotlin代码,可能有些替换不完善。欢迎大家提问题。本人一定尽快修复 -## 使用技术 -Kt、AndroidX、Retrofit、Okhttp3、Glide、LitePal等 + - 适配了安卓10,使用AndroidX控件,对刘海屏等异形屏幕有了很好的支持 + +注: old分支之前项目采用Java编写,之后用studio一键转的Kotlin代码,没有kotlin特有的语法糖之类, +如果有同学想看java代码,old分支应该更容易懂。master分支为全新代码架构,欢迎大家提问题。本人一定尽快修复 + +## 使用技术 +Kt、AndroidX、Retrofit、Okhttp3、Glide、LitePal、MVVM、协程等 ## TIP -- 目前书源为轻小说书源,书中大多带了插图,因此屏蔽了tts语音朗读功能,之后会切换成正常小说书源并添加语音朗读功能 +- 当前书源为轻小说书源,书中大多带了插图。(不提供正常小说的原因有版权问题,同时防止有人直接用代码改个名字就去上架) + 因为书籍为爬取的数据,服务器在美国,所以国内监管比较严的时候可能需要翻墙或切换网络去多尝试几次。 -* 同时请各位大神手下留情不要攻击或者爬取数据,供大家学习使用。之后会切换成网络源。 +* 同时请大家不要攻击或者爬取数据,供大家学习使用。 ## 项目截图 @@ -28,9 +29,9 @@ Kt、AndroidX、Retrofit、Okhttp3、Glide、LitePal等 | --- | --- | --- | | 设置 | 搜索 | 阅读页 | | 菜单 | 目录 | 插页 | -| 插页2 | 夜间 | 编辑 | +| 插页2 | 夜间 | 编辑 | + - ## LICENSE @@ -50,3 +51,4 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ``` + diff --git a/app/.gitignore b/app/.gitignore index 796b96d..e25efbd 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,3 @@ /build +/release +/google \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0fccfd2..0d2dad3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,38 +1,162 @@ -apply plugin: 'com.android.application' - -apply plugin: 'kotlin-android' +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-android-extensions' +} -apply plugin: 'kotlin-android-extensions' +def name = "reader" +def code = 1 +def version = "1.0.0" android { - compileSdkVersion rootProject.ext.android.compileSdkVersion + compileSdkVersion 30 + buildToolsVersion "29.0.3" + defaultConfig { - applicationId rootProject.ext.android.applicationId - minSdkVersion rootProject.ext.android.minSdkVersion - targetSdkVersion rootProject.ext.android.targetSdkVersion - versionCode rootProject.ext.android.versionCode - versionName rootProject.ext.android.versionName + applicationId "com.novel.read" + minSdkVersion 21 + targetSdkVersion 30 + versionCode code + versionName version + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + ndk { + abiFilters "armeabi", "arm64-v8a"// "armeabi-v7a", + } + multiDexEnabled true + } + + signingConfigs { + release { + keyAlias 'key0' + keyPassword '1qaz@WSX' + storeFile file('reader.jks') + storePassword '1qaz@WSX' + } } + buildTypes { + debug { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release + } release { - minifyEnabled false + buildConfigField "boolean", "LOG_DEBUG", "false" //不显示log + minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release + } + + android.applicationVariants.all { variant -> + variant.outputs.all { + def flavor = variant.productFlavors[0].name + outputFileName = "${name}_${flavor}_${defaultConfig.versionName}.apk" + } } } + + flavorDimensions "mode" + productFlavors { + app { + dimension "mode" + manifestPlaceholders = [APP_CHANNEL_VALUE: "app"] + } + google { + dimension "mode" + applicationId "com.novel.read" + manifestPlaceholders = [APP_CHANNEL_VALUE: "google"] + } + } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - testImplementation rootProject.ext.dependencies["junit"] - androidTestImplementation rootProject.ext.dependencies["runner"] - androidTestImplementation rootProject.ext.dependencies["espresso_core"] - implementation project(path: ':net_serivce') - implementation project(path: ':common_lib') + implementation fileTree(dir: 'libs', include: ['*.aar']) + testImplementation 'junit:junit:4.13.1' + androidTestImplementation 'androidx.test:runner:1.3.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + implementation "com.android.support:multidex:1.0.3" + + //kotlin + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + + //androidX + implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.media:media:1.2.1' + implementation 'androidx.preference:preference-ktx:1.1.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + implementation 'androidx.viewpager2:viewpager2:1.0.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'com.google.android:flexbox:1.1.0' + implementation 'com.google.code.gson:gson:2.8.6' + + //基本的网络框架 + implementation 'com.squareup.okhttp3:okhttp:3.14.9' + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.7.2' + implementation 'com.squareup.retrofit2:converter-scalars:2.9.0' + + //anko + def anko_version = '0.10.8' + implementation "org.jetbrains.anko:anko-sdk27:$anko_version" + implementation "org.jetbrains.anko:anko-sdk27-listeners:$anko_version" + + //sql + implementation 'org.litepal.android:kotlin:3.0.0' + + //协程 + def coroutines_version = '1.3.7' + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" + + //liveEventBus + implementation 'com.jeremyliao:live-event-bus-x:1.7.2' + + //lifecycle + def lifecycle_version = '2.2.0' + implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + + //Glide + implementation 'com.github.bumptech.glide:glide:4.11.0' + + //MarkDown + implementation 'io.noties.markwon:core:4.6.0' + implementation 'io.noties.markwon:image-glide:4.6.0' + //转换繁体 + implementation 'com.hankcs:hanlp:portable-1.7.8' + + //brvah + implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6' + + //字符串比较 + implementation 'net.ricecode:string-similarity:1.0.0' + + //epub + implementation('com.positiondev.epublib:epublib-core:3.1') { + exclude group: 'org.slf4j' + exclude group: 'xmlpull' + } + + //flex + implementation 'com.google.android:flexbox:1.1.0' implementation 'com.allenliu.versionchecklib:library:2.2.0' -} + + implementation 'com.permissionx.guolindev:permissionx:1.4.0' + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index f1b4245..bc660d7 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -19,3 +19,235 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames + +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses + +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose + +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers + +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify + +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses + +# 避免混淆泛型 +-keepattributes Signature + +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable + +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* + + + +############################################# +# +# Android开发中一些需要保留的公共部分 +# +############################################# +# 屏蔽错误Unresolved class name +#noinspection ShrinkerUnresolvedReference + +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆 +# 因为这些子类都有可能被外部调用 +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆 +# 因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View + +# 保留androidx下的所有类及其内部类 +-keep class androidx.** {*;} + +# 保留继承的 +-keep public class * extends androidx.** + +# 保留R下面的资源 +-keep class **.R$* {*;} + +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { + native ; +} + +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ + public void *(android.view.View); +} + +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} + +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +# 保留Serializable序列化的类不被混淆 +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} +# 移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用 +# 记得proguard-android.txt中一定不要加-dontoptimize才起作用 +# 另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制 +-assumenosideeffects class android.util.Log { + public static int v(...); + public static int i(...); + public static int w(...); + public static int d(...); + public static int e(...); +} + +# 保持js引擎调用的java类 +-keep class **.analyzeRule.**{*;} +# 保持web类 +-keep class **.web.**{*;} +#数据类 +-keep class **.data.**{*;} + +-dontwarn rx.** +-dontwarn okio.** +-dontwarn javax.annotation.** +-dontwarn org.apache.log4j.lf5.viewer.** +-dontnote org.apache.log4j.lf5.viewer.** +-dontwarn freemarker.** +-dontnote org.python.core.** +-dontwarn com.hwangjr.rxbus.** +-dontwarn okhttp3.** +-dontwarn org.conscrypt.** +-dontwarn com.jeremyliao.liveeventbus.** + +-keep class com.google.gson.** { *; } +-keep class com.ke.gson.** { *; } +-keep class com.jeremyliao.liveeventbus.** { *; } +-keep class okhttp3.**{*;} +-keep class okio.**{*;} +-keep class com.hwangjr.rxbus.**{*;} +-keep class org.conscrypt.**{*;} +-keep class android.support.**{*;} +-keep class me.grantland.widget.**{*;} +-keep class de.hdodenhof.circleimageview.**{*;} +-keep class tyrant.explosionfield.**{*;} +-keep class tyrantgit.explosionfield.**{*;} +-keep class freemarker.**{*;} +-keep class com.gyf.barlibrary.** {*;} + +-keep class org.slf4j.**{*;} +-dontwarn org.slf4j.** + +-keep class org.codehaus.**{*;} +-dontwarn org.codehaus.** +-keep class com.jayway.**{*;} +-dontwarn com.jayway.** +-keep class com.fasterxml.**{*;} + +-keep class javax.swing.**{*;} +-dontwarn javax.swing.** +-keep class java.awt.**{*;} +-dontwarn java.awt.** +-keep class sun.misc.**{*;} +-dontwarn sun.misc.** +-keep class sun.reflect.**{*;} +-dontwarn sun.reflect.** + +## Rhino +-keep class javax.script.** { *; } +-keep class com.sun.script.javascript.** { *; } +-keep class org.mozilla.javascript.** { *; } + +###EPUB +-dontwarn nl.siegmann.epublib.** +-dontwarn org.xmlpull.** +-keep class nl.siegmann.epublib.**{*;} +-keep class javax.xml.**{*;} +-keep class org.xmlpull.**{*;} + +-keep class org.simpleframework.**{*;} +-dontwarn org.simpleframework.xml.** + +-keepclassmembers class * { + public (org.json.JSONObject); +} +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + + +-keep class com.burst.k17reader_sdk.** { *; } +-keep class com.chineseall.reader.utils.** { *; } + +-keep class org.litepal.** { *;} +-keep class * extends org.litepal.crud.DataSupport { *;} +-keep class * extends org.litepal.crud.LitePalSupport { *;} + +-keep class com.allenliu.versionchecklib.**{*;} + +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + + +-keep class com.uc.** {*;} +-keep class com.zui.** {*;} +-keep class com.miui.** {*;} +-keep class com.heytap.** {*;} +-keep class a.** {*;} +-keep class com.vivo.** {*;} +-keep class com.umeng.** {*;} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-dontwarn com.google.ads.** +-keep public class com.google.ads.**{ + public protected *; +} + +-dontwarn com.youth.banner.** +-keep class com.youth.banner.**{*;} + +-keep class com.android.vending.billing.** diff --git a/app/reader.jks b/app/reader.jks new file mode 100644 index 0000000000000000000000000000000000000000..9401a7f01064fb98e9b1723710d614ca482b9456 GIT binary patch literal 2073 zcmaKsc{J1u8^`B2Gsd1J48}U6ETj4jhO4oQix7$!GOx1a+KOu#H#NpsvL%wOEXkTB z>k#7=B9%ebBFR2w&sG{<=braH=l=En@jd7H{_&jWIp6O&pM#Zy6$k_ZJreM@;65H? z@W_Ncd3JRH0^tBaDx3`-L-1e`031+(3IPBI1Wtvs{`$Hd7le*N1_t$u7LPu+LIx0h zZtBhr8(l4u@>%8XG3jh+E9BloBe`sT*tMVi5^AQ>bST(uU-!r|M1m(leNnn7quaj# zewyrY=3PsEUVJDD#Z76FjXwXhyLD6h>yXT>!Po#-;eAm{!lub1f79r?20sEvoBs8z z9Rg&ctLL!8E;o{I+@pSS2;;8L)%@e;>=gkD@t4iXXC$P^z1}A}bn7w9y=qu|bs|*ngNfG3OR>H&^1g7rFQG;Miipcai)6W)$rX9xm*t*KGb%7`9rNMt-C$;wgPU zBlFm)*ylr~-lR%aWhYOsqQ;6XY|75Ieg&D&5uqnFFfJdRsavA6Po`x@AjHc0G3~6) znOXJX(KXk+r$GTW)xBGi6izQTbzp^IWBZG-WbXCEr7P;k?a@y^b!Unm`GeXJ`f0A~E)T^OTh zNityCVX$Ir&uId;&EuO~Zj;A3v8Q8CXZz67b14lG#=#$STMN;Vx03bnQx*nW3~I_p zR~aLQ`m|M3hv_&n&C}t`+L+FLrAaho!j`uD{Zn_$)VF)uvK~T&$7i7$Qu9#En~@G? z+|KfDU*z$adzgIH4OG*9EeSTpXE4*NypyV!oV2$`+N`>TVUe@y(IQTkksNk+-pIGr z3=evKmHs-A@4I|bs7EJ$T-#MwQTtSRCp2mQ$6=DfJDO7mre{2QlGzBD=nM7Us2ZDWfh9dsRhK9fL8aEa``>7weB;K~ zsi7N8ps&2Xt@cnSAJtv$;oOZ6ORgf0Mlo+oilue_d4u|6`;qI&zXT#g;A6%^|x$;%kIfT#So94;~6F%3RT%4Ikg_Xi4#n zvFQS_YjA1OpHf#QJ$!HS&^W0R<_-m~-Ab0$nzZ$ZS94JiwUIv=XXG|N=mPFXU zPkT0Zn-8wwqMq=ulL^k5)%lUXYxM>=F}4T=kwl>uEx+|_8?}s7Z;Seb<=7d|vsfN* zIxshJKRa|V4|L-~G!cQ607v~zoSqn=$bymsQ@Gf`A$`=-Z_LzyOG z7>)4Ld__O<1BNoReuMN?N#-#*k5VNtWsw?_V}w{fncF|q`!^Oj98cpx?ITbQfmCQe zNCoKmFem_p!b4whH-P*IZj~6bm|cDV;N^gT;y50V3jwo-^BxDn|2M;q14K{;$*+b3 zH9$NLudV@V5Rv>EnxMKm_+R^fHmLympJ$FB45I=9kfTp{pi}^WL^*w_s{suzYXaFJ za_Pa#UKptg3uLUYdH=0_OOG2_-xbwb_8SFBh4+NN4j{PHHz>d0T8tCL-V z+dmuZhqV1-_Rr_+s%%U1GCq6}!8)9O`&e@&%5cMxRWNKJZmzbMv8$gJYBG#ObgJph z)jD*kF@SHGc7-FwQO4$%k#o zkTq6#e}kz?=B;e)I<{4d(%BVH3ocQQkbR>EKQrWWkd&&83H;$$Qg20(y9c~BOVK1yEt7+ef4 z(gyYKmzybk=&sB?6+^o1$5e6~`)7zpT^)r8K)f2cPkf8OecCb1>7CJA8DHW3d6z%8 zBHg_xNJXrRejP$^W5>D#C=dAzRW{gLqG%GSCF}mH7fSXA5Y|BRqIff53csMHYiP;H zS7~4wFHA}nY`xXGZ6CyZj$ZQPv&Gx!wuKvpmX#lV_V-n+mJ_=qU>F+G=wF&+Szz%S z9^h8Sjt)?A%%ZFkC?Pf1+DY~f9e>D5VYNTnW{gd$5*NIcPW~$)aJ{mbDtP$T9LE1Gmm`-;HZW_@`?UaP6RDuUfGqvXAmA)JX+K__qORV|IIVwSfy7uRThcCUls x{qwiBBTMRUajZn23=fvc)Y1C^T0Z)4AE*SN=29qFjF{{Uxkx{v?> literal 0 HcmV?d00001 diff --git a/app/src/androidTest/java/com/novel/read/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/novel/read/ExampleInstrumentedTest.kt index a2dbbae..a15eac6 100644 --- a/app/src/androidTest/java/com/novel/read/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/novel/read/ExampleInstrumentedTest.kt @@ -19,6 +19,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.zlj.base_libaray", appContext.packageName) + assertEquals("com.yjd.tuzibook", appContext.packageName) } -} +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d784d9c..09b0643 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,71 +3,96 @@ xmlns:tools="http://schemas.android.com/tools" package="com.novel.read"> + + + - - - - + + + + + + + - - - - + android:requestLegacyExternalStorage="true" + android:supportsRtl="true" + android:theme="@style/AppTheme.Light" + tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute"> + + + + + + + + + + + android:name="com.novel.read.ui.daily.DailyActivity" + android:launchMode="singleTask" /> + android:name="com.novel.read.ui.channel.ChannelInfoActivity" + android:launchMode="singleTask" /> + android:name="com.novel.read.ui.channel.ChannelActivity" + android:launchMode="singleTask" + android:screenOrientation="behind" /> + + android:name="com.novel.read.ui.search.SearchActivity" + android:launchMode="singleTask" /> + android:name="com.novel.read.ui.read.ReadBookActivity" + android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" + android:launchMode="singleTask" /> + + + - - - + + + - + \ No newline at end of file diff --git a/app/src/main/assets/bg/羊皮纸1.jpg b/app/src/main/assets/bg/羊皮纸1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40f397735e1c6d641229e4428b416ae0bc2527a0 GIT binary patch literal 251439 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�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

-i;Ez#sl3ooWh((_oH-=1>RKys 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

B1QefcV#@+7VrWqNY$Ki_SEM$$IY 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

R>B0ez~<<RW>>7q0Xhz4y-y|X5 z#M3^fZ!CA#Uq)R((#G$XnumM7Ck+Lp>b})Hq(ptmYJA&nD`Fs}iLB?Z0|Smt2w$D{ zb9UGz=3l$JZ!JuC<+Z+PA`gj+5^x2F&kRcXRgn7I;sXgW5Jio5`D26a99)&+V>e*) zMA@xw4p~*0bwQ0KkB2=Mmi1HFCu<#|<8I%zWqesYRGg!#1ZHX*9Il${5)8R?-tm0k z<#`NIeVd{oqN@Cn@*FkHv=?l)j_- zb&@Loh+Z>e%=MdB)w2B8v?py*B z+2rNXsEjS1($0nK$@}qo7h3?u-uML>J9HEZ5 zu-|EjCtQ$&vR_fc&a?wCHRl0gVuUdFeWxpzIYA#*6F@m*C*9mY<43hRL0|lId6|DZObJKC zR0Kt+?d5J?XMWggAWCn*E9_m}IK>C$n_%BimNFb?s$iRT8j#1)g?i+A(bd`@GH&_$UkC{-nLz~DGq6}oaYhOmRp}9tZ%y2X06(6f} zopymb&GCWAsc^betNJzT(5$q^kUt(Ex-A7g@6%C|lf)(&K|d$R_%?8xC^(uUZIQ?L z#ECON_4-_E${t$w?S9+Wjukkm?*Tt+eg>9IB)>((RrXWY6CYh$vdZ}IGzOmlHg$K zXtJ&u>su+eY};R;fjHy+%YCu54kFTN<~OCYW6}Y^0>m3xj$&-``xTMfYjk@0>*-{- z`^~IZC92e!Jim>J(J>7^&rVBDtlXLlfvqZl59U_|3?`h4E!23OHTO?}fadOWNbrH} zRywbL9fMT;W7vt{3J*6ho(Vd{S}lFe5j_X?y9%ytX;xO_hE+t@45eC5%Fh3oxt#5l zOh^GBEK;fC1<2}Li^`fGo7-X%9Fy*N!t2fGWe^fk(Go>J*gC0iFO>od7tu>KbKX-SHf@XT1a zS6%(8*G?%M#-7V~?>qwB}CBxK1%mG7ZksrwTuE`N?oCf5>dN*0+~ z5g5i=#-BP)M8ppDUAOK2)Jh?esZqf(zVsUVSHv=-Onqoi?xU;L{+XFa#CA~h_5)%3 zoxcA%UN!Gl^BoBWN%J*@E~?@F^Nt_(;5{dcL;N|V{QNPY<&LE+4|7dB$uvMa4VEb@ zm-nu=_lditT~UB5^j&S#gG|=hpvp8G_>0rn!eX z&i=>>!z|VttV?~^c^O{sH<$X?NPJB|qnC4A;^0Jqe|S@MnT{k!Yf*R4F`vD7{Lo+O z{co-1UAJjbC142`S?&gY`hyn2-FsEYcj9^cq(bzBqJ)??b>v|Uy zK|*~TN2%E-gZ~QS^?nH5oTa%18QNDZ{w*4E8m?Mt*+SP~<}bf>$Tm2)zIC6NX6-Bu zS~X-p!Mrc52UJMnQe>e4xWSV>{b5RxnMdZp7D>aZ32|r$%!xc221@xa{{}@>xO^KF zUK$vNzh%|W^}j|e5%K#h;J7%G^e!4L=&6J!MG}jzu(Y@}Wxc4H-if?m$CPyZ6W7!a zO8plgV_!Omh}~4Vaa;GHRyuN|Dw0BUxsM8^;^xUIez1tkrEZ;X)CA)MXbI#z-g6#H zjU60kw$1uRZn#VR6iI*u>Xe@pm^US&y_bfCDRlW&r}b5f1@vX!4>duIkoh=2N< zC3inHS^Y${I%HMs9qWCGXZH}vri=sG<)gwT<-Pvvw#C2VbZBRvRzUeWi(b=~KbIzp z67LeH*Tf?mb%e|}U{fyoA|0^WtxOX0gz(RaHKt2vo{aTZ{fFIMzMC+^h*sag*PL9a zy^e;InNj(6$Qip9uTis|?Bd#YiFDIj0#8+f%@-COi5|r6M&=fUGY}+M7a>zB=(jm@ zO9$Dt8oXKnD+9PBEzOdyW9)7yXl9&#+FQuU6=m)ML`KJ`E>f)|Dx~3%&;<3~Aa`K2 ztezI8cn(Fjyl3Vz2q%%$6K^g_^wJv-s3*tsL#~V^n{hOp$xw51Jr15b=;aK=p6Y$k zY&HZ&AWy*CSMmNQj%`j}4BfYH~NJ1gMpZW0K%M&C-`8ze)o zS;r(3xqb_}&W6?iSe#YVWkNVl)}Zr3y=+E8osEti*%%qg9m7) zj7s`m*S)b-;m@Kaq8n|0$}TTX2X|npz<}yOf0_GWqe<-#m4@-BOoOcw6p@!UIiwC_5+toRmlVUoFryOs;E4HvtU zv!@AsDM@K}=3`LwY{FA*(hxmU77*#yTsX zGO1BudCk>iMcp{fWVzk8z9y%L(GI+B+2Ji|^BvUqB1l*f!&qIRqh0h8+9o)p@c*2L zUP+#9KCcX?c_cC)3ijridH5_3l$-Bz-l8n)tJI71T+Xhh=|@4K(~AOA{)sN#Kp)EEcR{dDI$%Tp z^k0bd&Rn1ECHR5RXbD3Aa9@IxrMo(S1>3vzAp|ExoqF)Y=z|`VcNEk?cB&Wh_?0uA7g)_s%{scZ1Z)EAqGQFJf@a z3DOnZx`<=L^wI6H7%$^6-KQ{!LbJX}+L95u0kLxbr2H19D_1L0LVR(eW%VmIxHQZ+ zV$VYJ-D>#Kt}Py)_c!Vn-jwwslfLPJUY_wP7Eb*z92ENeEkSS82~m>pI!8%!xMgmC zGrG|KrK z7&KES*SoIn0#+bwh4hk3AEqpJ$m0+%KQIkW?O$P6dFWqXNA4_gu2|E%MR2_*{Z&z+ zM>xflE65+aLg;>(Cp@7Jly7-pxgrpKExhDq-7z)_C=cAV=*SmUR=zpY3P1* z0zUPbmaz36E^Z#U?v9+^7=+lw=<%sO$O(DYk+e40v@IJgLR*=}0B&x8r^i}ZS*J;+ zr09l&d3Ta7zhm{2oozGuxoRY}>JaXH zc2RfbEBfZO=>QS>bKKwF%b8LC*G-`=e_4-7*)QEDTuZLMf7cWBiRL|)E81n%4KG?cEp)lEIVdM!Fsq!0E&)5sae^9&D zl}$|en=utsqaK(ep*6xRXJpRR7hoGbbfg0pyZrCjpYDKWRa(vAboD8%-N0Gy%9?)r zb58ycJh6)+GbtDuV3*|Q`(JywL6T~B;|+!UsZ#;o69VLc79$#xiqO)mbT6y(hT_@@ zK-viRwgDP+GZ6XLT!H*VmpasamFQ$EYYY)eQ|O>Ixf%oGd0GDz4|?*d-nFLN#f&W> z#{a=l?`Q97d33VIOk!uQIl42pfQY`x<-fVDlH`RJc$#T-BbgL`s9a-p}=u_52@dEkrvI1;}PE_vt+PtMdH$`5MHiZ2m1U zeCiK3^*f=bU#ZN%2tF_{2#$B}M_2YKUVyHj8JtgDL%uR(us7eaJe;|3RV z2vDp8){`fN^RLRwN|8?Zw_qOVTh5c{N_P6Y+xN>ierPLJ_!@K1_M}6)!78qp482aL z;4JBz(qM%IQTA`;S)D2*h9!>sCa4qKW^={=l5TBwC!1;2#L?SEQ`#72|_Kw(j! zKOcbGYS&H@v;w6Eju)(?3ezz3vjAR>UmH>j7DzMom1wjLjo~7OVg+O zk>lStON87VR+pC4itq%O>{JUeMSY~9&&_eS&||@g${ALidhZaPLI%_4pC06uTe_Dr zwDuv=2&2{H()x7xpq#pXLgiVMjCw^M8IVeP^N-{5`{80z4eH|$8tj{L-bfXlNpHbDkg_%ur$dUWI}8Q}n4yXqKtae?{L8 z?@&Lj6LSv=wI9L|U#Em!_%R?BE?UCH)UYv|qSpp`)Ey5=?>^$wIx^8w?}=}5QI<(B zc)id2hyZAx&zA*JWo-^&{q48~issbG`q$T4|EjsxUSHC6b7&=-{zUv(VNcSqa#Ynf zo2^nGcpY;|V<%5Mp-x6jPfmvtP_nXn2Hc{IQ%-}NjB;I#W0X0ex>9PmL$Ce6)kuP2 z^IL|3T>yG=snei)UEktFUJ9O{3>ytO%mbE+S}U}Gu2d7TntkC9Yl_v1kOTw?=3_J} zxO>+rfz}mrF(-Gctow%|$z)~pb$lYYc{tHD2NG}34A%SJfG+O3r2UGb%_$%jxUcEf zAOW4C&@F?kzOrriJKK^$;6VKcUcf5E`A}GyjEXqd;#2HQQNOr4ihX9YnT%)3q?SMMS^x&hXGY)80z3%uL+PPN?i zb&mx!BaC3%tjohlgF$(4Jp4rH!!r^IFG|`uAQ7g7J-zVP(M1Xsr~A;DV5T~AI#$?B z{%+$s&BJYmrutGL($OvjI9_+JmU!rJhr@^yz`Jl`+kTFwMu&C-=1-;J^?xCv2G#ure zDvV1bZp@1z{%m!ar&(H#yd*oNKH@&oupo;I^tk{Th@k#bC~*yZsq9X!iR>(!t-cjx zS2z5t)ipuZtP68Sgd^E2yu|M7FxK5V$5#?ACRfw~%@oD_ZnCXR^I@UU7P-Z}H4O2u z!)i^qZ@63b^!klmKL+;F=ZROgTV?OIx@?Wal}v^TvJx5^M3ghM<_F+B_zSa>?LA300x1EPY@V6MpHHL;x4K51gz^7^%P`84n!JKC~@s(N%X2 zU(EB3dC&wDSMv&-joGA3R4A0Z+W9*;A9!!^a`go#ir}~2mgYVo+BnW2y0~EJtkbs> zlc1*({vq8_WW3*v@{Ye27D*ClOC(%B`w;g5_@D@&(~)iL*v6FxwqHpe5}aDLI)1fE zjcj)g-%t-cABCBmq2;gHE+%fMuw&+oxl2cDFbU{-o-1I!5j}SU_o{e%SC1FvI4F2x7xT0L zB9`_0-jMOdrcN)W#}r4y0qYe17Iv+Tuz>6B+~THZ#|ij-3rL#v)dVsMc6>3>ihg&S z8#FG7jF;}mr~8&q@kVB7q!e>McZ$L67gH5s*f$zFB=q0eS6au#_{_*SPk9PO&dwz$ov@3hOHyC^0V9cbEmQ zd`hb?Q9mlKC*6;4J~dz8WWeg@y$Zi;Wj{{=Nub)Odu4g#S7HG!770S@AJc)+*o80n zeQtH<)I3z=fz*gDJ+VwPIxcGD1Qj9Y zK)fzhVh}#j6LjT(im?L(!1Eeld${1*G$_X|2@Haax`fTbFT1$r;J+5hX=~Kobm%_5 zzyUzUcWz;Zz(80R5eKfat>3gp=Z`eW4X+WncwFSIQcux^MHvV0UD1W7k{>?)PH(#@{mz{nWf>v>z6& zb2O0OnOdT>+fRHZF>q!Rp;{Z5-jEOI`yHDXMeZZ*@Z^7bbxo6@KdBvSW2LY!yUg?` zHI0IX{%AW(wT=eKF{@zAn+tc}xG-0#%rOcplp=qO=3Cwi>5bzbc_G_oI|r9I41$%^ zjAZd{kHiT6HXS~VrX-FPk1t0BKb#`|oQeR#?e*D<2L=RgXha7gUNQ$1oQh5V2q=II zWO0PiOT{_27&yTMzl~Tyv#lHXUBolS5xdcBf}*EtZmj`D-9IA zO|Y`ZXF$k;VYUFSR_GR84Pb2=iZG?>EkQfyhJQ^+R&p)WxIRo#t?IpAXQzx@>vr}1 zWms42Sl=aexbKm-iD#AP1G?ct(ddHAJat#>kzhOU^;g|BFF>q`j(YF|(Q##nnjPIa)$M{WWuxth>rA;{b?8lSGnSq&kVLL(7x?G9){ciG1Z~RzQ z#r6G8iipXGhiw|}`plD0$ZH|QY!Kh3((h6C`%LRTu_W)#N2k8Bw4LYfOGzw9>C^r> z0fyh(0O?OqGy4kERK1l+7Ky2Ilq{o2ol|9R`HR1GVj$Sx+O;XPM&4q%9m6oeSlwJR zYz-elQ?Lg3Z@`Wu)0T}mp-)mEUAqI)r>Sj57IQxb6%*Z_52tC zDxxy4#uU+j@tXD6R>;27YWNPLbU8!(U_ief4SU|1imXLLZqQXGxx4#a7+|%QA&IM% zSTjj#EmD;6rV?%?C@{+)wp-KvukVf$ij*Y}wr60+l^y>Rxjx&Q4Dd8L1zvhLtjc-` zU8ypQeCJt6*7(&sA34-*$E z`KOwuBdQGij!hnnPW#FfpPT~nSAkIDiVv#1*J2Zj3v5FZ!Oy^7Fhy7N^ZMuy+@R>0 z7v(0|Z=F*8tRhm@^jJ`mw!`hpg@IZ#H?wTTP1o$GZg5gZWtdf>B7*HnfI4;FE6DG$ zg;j04I)s#VM;l(46o>lwTW$Hq2Euh0hVHx~=sYBNG?(_OQoetx!H2QLhf8nFzcYIe zQ|(`Iw)s7elSlLHNpyVK)KpvtSIU3V=Y?FQ1trbP4@0IqIFxvtgU`qo#yY~4-8ozPoGzE45tPXOtc zcT_X^Q;T8vLhtYE#Ei+O|3^;}&b=rR?Xfa<@+;Uhk07pVgCGn2a<8rRjZ#Q!tt$Ec ztKt2&L6H>sPj%$yH|%d`jl*0mx($CbX$jcjv=p_}nJCFG^|Sm*<^->qpWeNJn6p!2 zkSr*0*CJ*=r?>|}E1h>A(n6grM`IDf&m@bp`w5b)DKqN`Cgwb%0FxxKGin(x_r~5K zSuU7o6(3DypGkR`dZ=YOxC^1pJ|W2$3j8Wa2P~pbzRk4U4!bXbl?;jp{&3eEzp@=$ zeAOB`;&nxE_uv6Aq88XlPSw~A)c)y_-c3fFkj0jC*qs?#?$g4`L}3Q{{kIwRC+2|8 z#KwK;mvto)yMaGE0zrrQHQB=QAir&0RKpVQz>)7r1IhSDZ9jDa_ZsWQ51ky z#6am(Ny$gc4P`=+w+T}c+3wqMF zf0vbp(GnszKqoYZfM=&eeH7&ul>AXw1O-tT#VpSkF5yK^gn7EUK`0Fw_c?$*c zDz}(0kMX@U7wY2EYEl5YU+oCq<;D)zA%1REVN0XOaw(6yQb-{eUoX8ZdQ3Ai#6=)hn0ph(G8f; z?2w8wFFVL}H>#Xr`*B}QGGX05d+;zhn7jG8ljUEwPE}ultoxCT<4o9Up=8Zcr0$Mc zq8Vsh>%5@555=<-jbb8X#Q(JjHeX+w#+e)hcI>95LW&0S#5L$Z&ezG-FD9z{DuO7; z&C|iqZ4uv|b>rTy6c*E9zpt#OTi5PMaPG9bbGN6^q|_tWX~_QIK5zT-wIs_@AUJhr zy7`84=@TJZ?|{LQjyGZ)Un_w#hAn96(3?vuMEugm+(L>92Brg%76epwd8?iyoVU9n zFza%10;!(V%7XVE{1df*S`(JzEHRl@qQJz~W0i=yHDzOH$Yg|0bUe99(iZ3jLa{yO zntHM#4kqFH#FWBVbY1ZkSF;zKq9bmtZ^M%M1-=J~%^NE%Q4H{NGMvgnS|UUO%b(qF z>jXi3%&L;RckO;F6QJII$RgoR$=JsL>1ORSTXQI$10pF`-Gd*+A`JPHA!&tO05tAL zp}gcMv9e>z6?Lj-ztGavp$lbl-l=+L6c=t{jRg=jmVQLS8GKr9V*RK@Vij{vRaiJ8 z;N_)+eeAmy`aBqGXq5GslY8h`YQNIO8cu7VfA?eaHhz53Ps%t6s6R4ch^sK&@(Ec? zjbN{ck1~K0V@pIEBm_9Zy$0;Jvt_+8zap{znQOkFe_6aGYEc{Iht8Um4p9un4=X$x z%VrI~mGuvcf?sCN4Sk)cEG8qY#K@-t|J6h0k6C=3XtaO1!3o|!=yjoU62kHA@}E|) z)?t_UCW&yIZ5|(NhilW~;;D00mRdtIHF63DgjkjJr!j}|-vb1GA}-J4nKr6gVMHtU z`jR1@M!ro&>P{-uQPfw6+h8Lt5<|)GuW-wjxG0wPthxlA}Y-UBkB ztdi}A0$g8lCUbWL1YjQCKd!?wX)`Pr#km&pC>LB48ovo-K}5+1>vl)MX;|)vh%#Sa z=*^IPMYAT;?yAJ+M*}F1Gj077!M1TP_xrZsNxSmKrsj>Cq*@wTdd_rv+ax=#giGL^la!F=)8<$=ERPx8|^B4zC_0!W17T=_7x8r}ok3ZYu z*>ODfMU~qwu`Dh=AI$Iw+g&_1C>S53OaO*=nb*}Y+i8*K*~4K)ln>L94U6@SI1@50 zW96KcsbhRbC&^Gm@1!0skN2%FNvXRQF#r(KdL5qjS1!|ZH~S+6U#ZJyk>@Nd&8)-8 z^}oi9>aee*yf#M)E)M>*5qjfj(+1>e?u!MK+_>SC;PI*i7$xFd9mwXb`trd+Nzs1& zd+B$8u-wx>hU@QePVYqJze^-zVx^4#fuQLzVY@USa2Vi-h__7lbDym8Px<6g2hCLd z{O9S;H6@}kxyyRooV4YEkDwsc&I~!*h`!X8!cEu2?%eW6I7f2giKYAJm1d{3qhD$L z{G6ycAwRE^EKB%(U15;b+~9KGrTbQEJx6~qkGJiyN9d(w1;wEdlSSh(IU+Fqd|Hux zpp!B&8R@<;rY}T}|G_pPhMetL5@~lQfBc2`IwY{RzeHXcbItfJ*y0?P%06|Qy(kBZ zPxFP^?d*6sQ4SY*_uI7J{o1ok<$I$#Jywp8*62o>Y9L)|8XG1G;->}%;i`77rRZjA z?5i=8PX$)FJ*$!52;f6S))e~!gbso~71-vHd%`~5xYEg+<0$cop_V>|R%HzW$}gKhFhs&&p(0V`6~r=f9pNhCkfpDVUm9EB~^66OJK&LYtTh>_}`gdCv=Ct zPZdz!l)DsKSs(8cTUuL%ewX??g@`o}+bO(U$%zj1X?$nOfirS9_#lP4?qlDK5LGDN zN*A2ysL{>_y7!)VK(HxyYQ)-=zxEO6`)ojs2Kje}oE~UF`|J$JKZGw?q&Nf@sL)ReD+@#O(bOpueOYLdU@vZMIxW%7e>(>5RNYg7 znOq7A=y_-Tm_bO!8E(2}mH}M!e<2%?&D76z(avp_UO?pW|LKS-zE_Ea<|%6aQT@tD zN*0DovYb1o$gftFVB+C#a3WH)sY3=b**ca%u_waLPu;j}AmXH_|50NdOIg++dX{_c z{!tHeIHmU28mx-qD;;>{*`I*p2JKrl3BQxY2i0Hm%a>CHkP}&hl}Ey;z*IlY^sa!5 zTBo0uoqH*G#J3MIqjC2TglWomiFI#AJO1j%*_Ce%y_{Mc;4h+tn_~!3>rbCOr58?O z;h!(3l1BqUL<&qPEVZ+l;j5Y)*CK1dOrydH!PfnqaOyBKx|#f{i1>I+ym zhl`gxh`JGLGwkw8LSBOv05yK1$d)V2FJ*S&V#KN4*yWiJt&0s$NsC8el%bU*ULxjcr3#VPuUo`ZoK73(yQga&HVE=ln# zH4m73#}aAYmQAZS&tlK#I*Y9bB<)wicn8)$!hK}!XzZ#Yk7_!{lZ zGLMu|w^N9I`=IB!c`&SFwVZ&S^vgJ_T~iins4j;O8S+^ZVx^rH{8deUdtMVB3Saly z`i2P-OM@P`96u6Wl0O#**!s4)n{&nd>Z8%KBPpJ}YXr{ppxjak9B7dL=m=?eZ}EhT zSDJVP`Rz*#w^-^RN-`r?o%M-Z(*_!0u_X`lTL2BG_RHQcAGV+!UqUf=Jb6(00@baxQt5DVG@C_Y5O)xIb*-lG0vPeW?!T*8SGE!X~=xW{PK_UX=Lg zkrAWst+Xa$V}{gpZ_A%y6}t_VlzD~yywEeZUmAFHlg5hTqyQF-nk~%F!AR>C1Kjvq zUAVvYEAo4OHV^f2OD5Z+Cq$qi!|0J z0|B2-l>XisPLc-ODWo^96<<6dZ(T{ej(jLwS0>Fm=U7Yq6J2WUNBUp0pz4I|r3i(~ zOP#CU$J;i#BIkne)mJcwE#@z|fhl1`c}UA}23%+JSWwd`wt`z-T?ANYVXzy3>9clTRxbn)BA)t18EW#GFm+nm9nYEC-#FXSOtNq_q- z`dp3H>cqR2X`_7X{Hksp)pEVyNdN5yL~MS(dgA-iHGmsz(;Ad793lVfk2_{6un3VdEWUVoIe+9w5=8F%7; z&C5EI{YFA-5>+Iehb|4hDvW9auT<rW1*?)QEmE_R9^WTSiZIe!H{5&w$RfSEk9j3Gv`~iN?)O zGs%WD`+cd56_T|RWt?v2UVSit@js}gtuR-Vpl;?v_9kM^d(V*U84y&doZ?A}=o_#5 zZQIr_8l9hHnt3lTdaaY#U$i$=*`P2HU=H!iV2PBwn$%&y-|F?P{xt;3IhqKTm0dM6 z%A{%@leK4aw+`3eV(DJi!(6Npc&ZPy)DY+??oUf@Ib$ZqW@=2a@51(>+4|C~b`l0v zsjcFW-!UJ21-nwFPCAJ`UC-1cBfVxh#o6U&d@{P1!#m8856z%g0ubv2zg0E^A&Dtr zya=Ptffum1*u5%haHCjvWw6(laay_>oy_thI~5LE3N zX?0K8C0S`$j(ls1yCAEHx!rUN9SHz+j4q@f3AEb98QnCR^RRM8i6?7&c_l)y5Vx}O zVCnM5`trqc22SMuz)u9dsp58~kULcFZxbO&oRyHxKA||NB@yPmDwEG7d#aofx#w-O z{twje5fZ~4XDns+^ZDBJr4}Um4>~UYW150(GfCavw6U@-!6`<#VE5cJ?9|j-CN;%} z-v@cN%=F`Cf@=lFjpZWP7uO52(H}IsyOmI8RM6vq-;<-p(9r=ODF#Kv@P(!yb60m6 z$xp~6s@OXgS(W@sxM5WRSlZP#{j!(=2|SQq(Ej75bO1HB;Re0qM_LKp30iKJ^Y!Re z?2=q{t!!8pD~YFZH1f^smH+dec}dJVlGbT9i7j8>Ny>9qs`I6}t z?UJt$`Y$(HeYL{*ciGY#y#;fg$0IJ)s0g0R!`8qfalq`-MKpk>QJgE=qXVkH_R^tqq>|1SKQ@uFiEZef>g8tA>KepaVEZb zc&rOf{p+5QOtoPf@Ritb8u6hmvVur#hwQK~pI4^rxVP$EMa#TB@ z-1JcoW)DnuxZ8e`XIzj$=boH5?ya%)m@YFC{{Ksagp;wxs061()A9vEW~ID<}WAO8JZY%|&ULy+OW- z)9jSoulh#{4wMJP%1eL1?=X@rru(aYQdD0+?Wgi{LXJBZEaXb9v0btwOAiZ7)jL4~ z&D{bj>78Fh_DOmk{lyi!XsvWqew5`bB{nbP;KA9@EkDl{L2ry@axfTI-16; z=u}AO=RJ=zai{K-|KPaM&rN^b>8P&eT{_-ppqliq=9W~Dx$7Wlb6X*zYz!c`(?eUJ zzrP3!qMOd_XS9EVBIy%vNgdfTJ3}+xlNmtzCV~lf%pX{eG(9#1uf;;zVm{mTv1!-l z;z;+&Fvs=Z^aLecHOp zH(%83V?UtNw}i1SOjP+}npED_?4YLtMS{)?pxACD&B(w%NPJ3of059CYL|Aj!n-0#g=XU#|Jq^R#*gAt_}K$=~%mW7#HA>yib zsrDbIL==n{?{kHGb!J3D{AT3?XP1tYv}7!jT<_NTdtBDoJt_JSdgg|~ky9nx&QVpUx$dHLnNuU>c|W`zI`NI@pB|E6=vV98@b1yDYe)AW36iTB+Bsvbpd{$w z-gQ!P?XABgDI{o~{b-R1ko+xbhvI|#cE)3=|Ah{Q1ZG_g{#L0^UH_kA2!d4BHwkJk zS&o=fky;TtF;hpp;)dc+87PK6Q7biH0{ZpNPGYjA;Q_%gB~Ia=eBdyY0smGQ_aWG5 ztZPK1X=k2nEP0gNLkFdQrxuOe-F#GPp_{G0H0J!)HV=%>aJadmu(o^=pje7gSlyk( zngSRF*MAGN4YnhsT>9J0swA7a0qdtFEgkBYRpvbu4W-V{eOlu?phTI>Dbdecjx4d5 z>T5?M+tYQlL^=gG?|VZ)Z*jsv%a-OKcix*BaZfVq4(#6sD$H0*fS0!5im$*^lC0ZA z**CVc!q5@}MORx7DTo-IXtmE!+Gl6I6+9@}nTfF4W&|+#7!iN~mAxqcut&NYS)$qW z3qWFatR&zvBUH3Gx>FkA!~`9NFCe^QfX^OUH~2w@v->zf&$sIom7j&8QKR8K9zivA zzsFtka)S*z*2iW&=pZGwdxx$lF%Sb;<%sLgPI)sc}3S$9@P4E4Brb|%l7q7!< z>@{MJ5twZ&mLjc>Mv}*?C+Mr;RvzxfQGxdHSoqz(OS!!U_?7M4b2T&S5C{W#+bdt? z?MK?DleF`4Wef_2=_WQ9>;H;%Y=+`+^D?N;5_oG7#R04XG!TUD1200b(I0T!6bIWo z53gc>M|TwFuPhrCrjG12{mlwFspl1In~s)XAI2s@!dAy*+)UZdID+s5MuVrl^S8ia z?9YTGV7}NNnh4nQHNqico51myL1+E*V2C zj*dKUK*XJ-9%(S8rAm2|p^mFBKm48_J71%}J{rWOfGfbUm|)wK%rq~zuiQanVUG1a z9VvNr5%ub>8+JOZL({x3VUKOzvu>w^32AWc+1<2{-AXyu@ud2id{h4oQ!Jd~)F5*U ze{kmD725v|=Umzt@B1Q8T*?3t4U*C3-;P~fS}90j|5c{$A2=e8rHU?Tq9Ygdak*bY zA+>cR*;ubPv@UAew?-5wG4*$Vb#Kajr_IS6eOKeI6D4BAVX$CTc6lLT_u9WeSitzI zBo|K1%fL?bHOMYFG6&DoN+ z9PTMfK{kC(jNbB{664ys1?tddC0;A8Xx7fsg1~igQ0DIu*NH1r_N3R}`eGE@5*v`B z%+E({dt-Yh>!9PB*H5eNANdcqhuo6|RLcIN`YA}S8yvnQoZ9lFzactye1hIVFQJDA zAFOsv8xK8KXIbPfaFXN??InV=JlhkfZXtp z_I*`q>SduZwikrgUIep|L}c?7rumhjb2Y+Q@0<|MP}CMyp9k0b)2Ar-vC$t70=%)+ zOzt?#^n4Ob9HcY)4s0^HHfH%f6hsp&M=&CXeu%o%LiWkfw4*KWCxjHYwA0)N#U%a9 z7EUiN_U=*P)aWyU)Egz(C5%=J8!7klUz~P3rG@r1bUOi^#;JQR=R}xTY`wu2M%WH? zRQU1k$3+2Ku{c~jK=rXH++7V6_07N^E!WL$g_rbN=2$5j33~oNg`EO2TmcR+CZ?92 zZPZ0#k!8Nxilg!U+{j`M!yJvsdftn2ctHo8hy#KC;!272OFT*DkY>_KbZXUj$qqN=WvOGCf&7LZZ&dl~ceXyc_~J0W3{GF-nz1k@=l?kFXOgS5cO3tuaoAAmOQD zS0KWBbNI-egp$nlcv{ZaDLtddMv*{c%4KC}OS;jMHCJ~Ouv`7o1tgv0;Rpe~r4EC$ zvp&UnLbd_FYdAFTSK)YuOYG>3b#hD|?xXXEuIjkO3YV)Bf(iMb~H=7q6(M@}@m5|4z=pb+agN9if zAW2rj>cWw^tkJoh^vCOizpUv7&f+dL>oZBlrN6&(J2JmbdS~f3-Sv~*xOi$**u!T| z;CckgzbQ0Mmuw`zSgU5eDRgJ_V8a+=^3Cgn&OKS<;1l0}P3~;TeAxRvOlUvzs?3pB zd}UK#O6sJcWRe;D(@3SA&&elnyI?H{)a|^aG*gcEx5G^tJz1YgJPjfql%6*Eod&G5 z`vw<=Bj*8es!J!;f{4s2f#N1a*xI5$l*x|w(sxDcK1}=P!A$>Jj%?6#)IhZbvE#3? zek-|^y0XK5n@*{|;!5dy@BO9{iBV#oY%FWh=YNd!!QXYwm@G=si_Ef$HwxfwpCt>1 zqNDhaYzurbKh=E=hzG$0sNH&F z0g;#wO4cWoT~Ba^k*B{11drm+`j2~aZ2oPxwVL&Ec#t63x#e__fQNw~UAass^fS1e|pX(?TrK6*#M@i1GE+IT`hMYu;cF@jcAF#i~D*9$QGCZ^Qsw0&L*8w zIKt^zx^2P&o|HYl6h$%QhqJZL=$HiMBFtLIP>Fz0`kTae5vkv^*vwVwq@nMfw4 zb1@e)|6r52wlp#s}=6dGWQKjZsaC-WnIA%rTR53W0>EUT{ z{N+9&OvRxi9si%AbMZ^+{{Q$vP}CHytYCuTu+(bhZ3Zfe`JJ~4ytP_6GjXZS45YkZ zDo9#$gyN-(L!^nfwr-o1u3XSXv{D@SOY=%X5}M{U)3p6Q`v-g|N6tB)_xtsFKIa|b zy*GTKN(wO`W#Mww?d*Crl<`4Yc1gbC)-MG&p&}}FUcTU8W%-?@)ozx$9ufI)Yno5G z6jo?@RDcA9=dt#<0IhJC^M%L76zgC(`7NRzQN|4mF>A-e)PD0XJG$OA#Pa-B4bU4W z2J}fd;>lq>x8qpdyuO37`_+*&7ZlvpvKQnmA=&Ex5he_iA+M0Q1LRLph1v8O!@l>; zT5_;|frW{S?AU(nr-gbt1D?Ftp^H583htP#C;03BY4(3n3xq%8$HNtOwQ{uo<dqZVo&3uHGgt<&m(oZ`Ebo>jooq9yhm| zq_90VtVN__8t?KPB6o{+KC=Qzx~+lo;plreh~VB*vD0UE6T0jDbX}b8%$uLu4&Sx9 zw`7RyHbJ@TLIxR@? zp#PbxaN>XZ(CAYUp^UND?@RS+!00ae@s`zbh~Jn^@cX1X(LK_$IbL5RfAysduY;{L zMz522u_ix%O(6LE{k@cb3ckdm;Pv>)&pWbg-jz~yKR9Yhxa8k=op`R9wQ5}aRkqE_ zL!fQ;3~v~bWgTgc2r>DAmxoffqgSqlw*>Nl8>lpG6z&L!`eoy#~uoSuX~3)5gaLh=Q2T zRKDK5UNM96i=lgtx|%ui?bzxKPs5qB8aqw(ae%u2W+y4teW=j+#c`SLguxJv|J3K0 zFZs~9<1i5}=zHtZyp(;y0NxqxHl3xOu7yJt9dSfGsPZTr*NPI+7->WWlwj0KCQ6`$b%Ci9%Ens1-{$OyisL_8 zRCSgHbgA2%;|CbQQ8FaBTRV5H?0oiX#jZ))B7K96)g{<3g0x>NS}#dP&*Jq-(9s|t zHCI<5b6S}T@haHwi*gf!FjEFLfyM3CE?k45r~#{1Hg3;mgCo>Md$-njr7zE@Do}4f z>g}(a28PI-NGWkM`)mW^!Yu~{+3F8(0Cpce5wt6AgLWe9af_V?VWZCL=WXRNlB@-AOKxo;*RPD2UcFQ z$f9h%{mVkP)qkPZuAD}cR!t;SAE|Y7muk`#PTVlvje~HmV9CB<6O4xODJE1OXV|;M z=t;=RxS{)(mV(@hCurY-J?J`_rUaSl>T)iNR(_LI4=-y=YCl=*h565CpJzJ91A_mueus zU2-4L96zKTkMq=)WZ@d0EIvigW6hz7N+?jI^{w=d=wYevCgJUBh!VJn0Xe-Cm?9F9 zh;WunE}!7-)?E|3Q}f^y6ZWaDOk^uGg-auQha=(Q9A*s0-BR2Wv-FO*XTz>X0lUse=;XSVmtjO6Jo;Tbuy{S~7u3dkTP{L-0J-*tO zsQ^*s4aZK#a$w5VEim2)2C)2}=@M<|V@}hx=&>qJU@ss^Bul5wh_?6Dw|1rZ(N)6P z+(^jrhs-G#Xg!ZNsDbSZKNvUbA>6(3SgM)cP<;IRW}lxv7*rQEME)scCD}|07l-;^ zAe_d+Cq^pcoN-;=r=|2ljLiOJMV3!cj&g4VN4CBTB(W{rSDppmNWQ*!-f;ss>#7x< zq6FSczJ*Ru<$TLDU~BHw>ybNK+&GY7f;OJ%U*Ke?^*m@&cK-QVVXyt`|D7lw>Rzn< zfu!^Vzmz@TRm|7+Aa^iHV?8|*hKzT1L*qmchDKhv>onD9b$&sxX zp7U3vlTI%ym&}7Piv|jh(LQL3&|#wv`)aBbMB=EF80QL$>K!gwhzqi+Z>T-`Q@-sR zWzI<0?gtA)+=(Jgi2V*?$6$8eLc@9M!`olYJJtWUAs0-A6<=nMty&2?-e|OMU0!Lc zV=wgabwqu$F_!~l8Lpn zDGQz;2da(F1U;-Y_NS=$wbY=H{Q$8WgL~y`!C&rXM8M-RKA7+)Nd&~IR?w7Ul-j=} zhl{hL0(4VwqB0h`nmhBDL2g#O6q-IxwWTQj4zAq-pGE~8Jf-{MTWCdryb4!cX}<8} zRwNR6$7OG$Idhz;c)d3sUJe*A0L1Ek*9-ygK@HEpiFDM!cpVdpI}ZDl&3-;^IMe0m zaifIaGxg99X;~|cH`3}6`93#k3YAEf_@0sb0eR%Q@y`hr2yT0u6?MMQi;}Uk%M|w~ zSCrf21-+hr0#~L)V1}B`nm4y2?`+999siiz=2x>63Dew;%rI(JQb)9VPgX_2656|% zZN#yvbwm=uaURka*V-Q8-E%U?C8pD;$qtc7!z>Ga-n?-?vX_jsuiCLkuS*fLKdA*s zl1BeAK%uJOT=@K9m-P`|*>ZSS2Da)31<&nfN4|^5ckT1#J#~)R_0{d$Wo7+8qekgt z#%r+YPJSRRc3G!?vr{Z_ed`gqws}R$`F>rn`#oCz~Mpi15nB4$J`%wQ;b$3daU}3+vn-e|J@!0AT zQ4i_{wj@j{a&z8wmxz{uG5uAf=UFZJxy8c2kZ(BR`Z;{@4L0Pl94^bZzu8-_4LQu~ z6+ada{FB^8_ zo|MAkv)9t_WgQy2uq!FXL?(x|C}*YHpHyfPrd>F$OPA1XOu?(#NJ$0k7S$4OOLLMa zkz6WM*gIxW2JS`V48Zm)7Xy9`Jco&74&3x>x|VT9$D!SE=o*~z-&r5gX|dburEwO4 z`#$VSSDNj-&F?LULO6d$>A7AxY!NV?eDG*-dHw(`MKx^-0Gzbr$@DHFq_rXL7~})? zu3@im9A+Lcp%&DMLJ3!~3k}N4Aw$9eNZnEQ zDv_VZ>*&Rj#)BoU5=}b%j@vz~KFL?$6P1LBc8InMA~W|^Ms4iIXOMIfFc{JzQ%y-E zJwKA45C;%m6Cw19Kfb%oRXg1QSuwLNHap79Se6>P>hdh$&3V{g*=pD|MHV8>>d2w= z5W+S^%zu$ekg&5f^mCi|0%=+>8;TMw5DiZ)T;Yja`PeU|een8JVm(p^9M7atE-Iq< zHArV0Obxtei;@zvgB}u9;!>S+gst+L{T@j#PlN_tx>|0V`b*J>; zo(iaS=ZID%u6`%?M&H6I$swHtqgQZ3?=TQR-u2%a?!V&+NSb|;U?Jn3E%TGX_Ele_ z-g&uE%#oda*^$}Y;Uq_a!{%kt*9uR z4KUg6q^s`X8~rb_zd>SG>V?H&kVm2Kj5sGb6fH;g&PaV-5#rTmPp`1q!Ozi!1Z_sA zNI;n%6K1kHmRdm1>*%eZQQ8egZuxI=v-@QefY#D60*WXj!xgvlVT8WOQ;1S;1_1u( z8gR$Yx}Gq9>CO2N`_b9C=G_JZlCQk&q$$(G8n5OKQGIo8lKaJL+jEUkz+(BzrfmqdN$4dx5)cr4X!Rgi$q{TDpu+I#4 za-}gri=W|j&-={_O-LPx^?e$G~wbN z4x5jHI^DQVdZ$;}i4&35T2ivrUZ#A-IdClndu{UQKQsgoKCbdhS6V&V75;~gbGmS_ zp>FXgr{VVpunrs>cz66_MA+q=sXuwC2AE9|C^N2pgy!dis2XT9rKkazX z(jPY1>eT8(YlB9kVa-~?Lw1SfwLZt+EG!aoo8FMxQ^ZfwrOfIf(7M&X581$5--2QU zS-q}SaV$r?0f0ROXK8WJ*p$lT3f~7HP&Gsx$@BKM1~|u@4*{PWd_&)cM?3|t`Pae} zkB!GLW|10?}!AB!Z_g0PfOYK zi7>C34y^8zF3LRs|FE-X)j4zxyr9brt&CAMKOMALc`o;5erARZ{M3&^+Q+EEa$`;) zTS3UK$a7MoMo2V843*s!b4VcXjzp zahnLf&d-2ZYIJuG6Dk@<%Qq-2)i-Ur3vg*vS2wPzQkJs$PyUDZln&CT=c;prWcy4p zQG$pI#it>uJ!cbOg&4Ap`tM^gCkQ9!u9`O>TuJW*tPs=oN0SJ4PLRtuC8pqbsEwZq z!wMm8QpKE(S-av?88}#iyXHQS)9J8u4w3LV`nOUPb78SohdNLk5$%AU^;zHBU)Vu1 zRI7>~kQ}H?K}+3VvlMW6;$#k$T484bWJk*;Cqr1xTJ*eP3!lG(vyJ4;WkcxdaDc=( z&QxD{ya7q}w=387F#F5II;%&VP3qDRObyxzFbOSIS`-1|x^fMJNdA*zCgOs)j3CED zJzPGo0mZ7kCenfgnHO80(P7x9fr&)b&n}6pfY-Ljxy{%CPj|wMUWO@&lR<;)=YTTA z=+msFOXIC6&)F7|p!@p*rS)F+ell3n97$T#mC#F z-WH2jT{p1d6aAORzf%wgl(9{t!KC?4NKo`}=XJb|j@6UsTWPWq(&2rRm)ug(T-+@bAtE##;22Kz>kveXzQ=z?P-trw|u!G5W@u#3dT3?;WxZ)`N#IGu&s{oCQZ3jq8-jz zJPRgvOsK>G5D0!HjkDVI<1Ux!72DazN>Ju|s$Q5c!-mTog+e(}NWBV1IJo^mBN?XXC47a8v-P&h~gXf!B;%WpKJf}vWTP; zE4riRc>LV2L(eCJMhls(O4xwNB^$El6~4Gv(!PykNp%!Z$62eMIJZr~{4Ps<6UA-@ zRXLqtDW7=ijIVBJC*O_?=b5#c$sA`oY9np);fa7{V?1c89S3hv;pUpP0yF>Y`lS`; zRt{^O%xHzDtk(vO9*naN1ykOANT;KS^#eE;V2m+AZtF@z#yTJ3{C$j(lYDami&$>&Wu&^K%t_S zWVx?Mi=w(7aMbDV`jy|fdil&_^yElO;|7R?cTwE5X|w&Cc8NhUbgPnfIH13Q;AJa; zk`J}J1D?&56*oL3l$Hv9r?O9B7FMo(GstYmD1qYbpQGnDw0tG^Wl$|0_Ky@i5*3mk znzP*;1VJX5MkO1!a_Ej$*U5-&ma=)gpzdnC4hHDh%7@HIhZucHCTUp}$18ocrbpZ) ze!Sc1d56>c4A1(h6aq8$f$G;k#2o$ATA9T`!MQs|^t4Pl+EAP~T}Lg7_=9^3wCgr( z%|BA%L?HRAO0d>pBB8?fSXJTw-cf_U1(Y6||FZ(y%)S=^L3+eiB$d6QDglM}>n5GtX~J>3FF z?K0VH`c-~_;y6R$C=&Aw`{Z&{%IB#m-gMoIG&p4Sd|+j3`WLpM9gOuEjlY&04L|b$ zZcr8dQci2qo?VoYbCR)k87?t9C{cTwH}rpZ{=))b>N{!&_usbs!RK%K;3;$`1S_E- z5g@hH=n6TZBR!O!vZwhCn2w?LHkYJrf~Y%k#5573`KOd|-+VbkaUHtwar*-iPtc^n z-q1devVH?+(A(JA>UQ}8`A=D08_9lW>;nLfDP;-VnWF!@YHmWBc)!mvRl_fSLs`nO z@M5cU7FH>0XwXRClMw0R2t{i?D3(SqA-t>{1?4Tz1YVy`KXqNp6j=@t7ZhPX7JM63 zYDFKg88yYjN=eewpY6Q#mERiq@=KmZ^V;&1hZqD*`s@i;g)rD7%2FadbKbbug6Y@)Qn-? zu{y|BHk<|fQ;ScxSzD1C(2qH!j34uoT-<|x2L0o6|<8W?lGZwtQJYRTgZ zd*?tgW@oKw^I zevbo;YL)7O)%}*Bt$!ZY7u|-|jB?fzWnH7*qSLitiGEr^xC7rj9jb`vzeI|vI9Y3C zt(mz;1f%7f|GP3sqnOZq*Mm3LM0|Wc*zkj%T%7TV$8UT`%Xiv6e0dpVGUYbVYcmA{ zN0>MmnPMketobpHpGc;Kd6YnFl(k4gqa0kBIE3YJt6}%)A4tgC3pI`Hgt~8bP%yfp zb+BteZF22Z#dXpFIJ{Z1zLy|Ahck9iIuSu!ct4|gGAs+k^^5QS7w8Ck0DF0P&0CKy z7t&IuA;d!zCwLHbTYbYBX2Pmcn3R`T;YZ6Jl9>T*AcMU|uI>KZl(4>-cHBz)G2C10 zo6!m3j0s+Da>BqJXD8p{K{tLl5g6E;@HX8HmxfTR z`utRORC9iDqa=;!8PBm!V>5$XrHR+EW1w~w4PDmuR6<*uyK>x?ucE)tGCQFE( zH(a*~+ac9@VPU&dE!;6bxU)F62gHVi9G^&7FySg@60nFYc|}GmQlkvExCh$+@n>Fg ztocB>(Ne#|rn;*{xJX&_jU>jWp*dE27bI~3N&*_IQ2{1IQDnBY)%CAKHJUR$XSWtW zbK+!sOgO6(I+6NdS=H!U%3MtzG>$YyoHD4&(nD?kKHA$Iq1+1f`$U#V1u(nv7-Kz| z_@QoId8AQ_{_6gip?&gYfn$RsSDeo=?h1WOC)4KY>D9E8hp3nJ1A{7;6Y}gt$4`+^ zLafovD21m~+b!-nfkvXqjVMUrD9-$RN@nJBD;hl8z>2oZJ&-;vm8Xb=!jDBPEbqQ8 zv)vOCahn8rRj!S2^m|TlIN3n6{cF~(GDeu6Ln7S4-+~K8)yGNlB}TTOhtB|hzLQ~l zPj~oY;gqKx78|nAI(Fm@_mJhWl6!k^`DTm?4?6ouk*Ox%IKpRmv$H*z&+7e4I=-7>(JGGDX4RWPjeWe%4-7OiiJJKgyuulSc^0qt52lV)!9>=}|cTG+Od zh|7fE1p)8loNK0#5sME9k^DpgXy2E+Jl-ImqLE!pK?;&jzt`#sPpkbSTAV&wL2;a= zx)s;%8XK&KBYo$6Ke3}OIT{5w}BbvYHYjYEwmK?R4X*P+^ z9CuM!9|jdL?Y*!cFB<>sPtp$3Tes#6yHicFYMEAiO|CD$CvECgpU&FVgGNa5J13gg z+o+q|ESlS&>E^*{IVz5@?v(}H4sOA$J|1|VbhM%?Yux2Px<=*#&yW7F2+Vt$_V02( z3~$J7JsyT}wk^6lC{QeCt5&2d|CIE}^mCufU-ti=k*FTAYg$KJBhvAB^Nr1IE&dsT z;QE-nt@H$dY$+~R)!_heHxzE!-t1SUF7Zaq{Z4C=_0(b<85+g^iWA(7sLP1{q>A-QzD{qVoAGjH5C7c z^%L&nbijBB_`YxGzOc=5+pi3-GXrTR{(i}Qfkv;}K7jAAV18zf7@un(VGQ#PC5^Fg z`sy% z_;$~<=+(G~<|M3MAXSz9Qyg0^+nZR%*Yk>Cupkd!HAp(~>U%JJf+RK ze3=n4KoLgy@{IJtE14sZ%A05Tis&}~oDE0Y%T8V8c0pF+YTEUEZANZtJh;@LzkBT) zQoQ^RE4u3PM{}>bgQt$rj%P)bgb+@WrjD1c-;|z3@UMRz+U^&dM(MaJfZu_~ z+yh90Xl@@zqP;eWP+u0EX}0^=(Ejas3%PxQ77ml8<~YNobYJ*joSO28f4c)?P>Eji zHe$Wp)Vxr6lp6ik#r4+bRgW?uw=(5ioD&lRBEh7Nm`^t+s04^9sE$yEc|)xMj_X3( zI~{V(wzBxeY=L@8Uf8xq4@REs$eo1Wxazu)MmPE6oUCiR>61`Haw$6wHIWh-4Q62+* zU-)FmR+CcJS>YF-Lb$)91m25M<3d&kdbIqMp^Op>=~%*VIN!+HMqeqThD(eyEW7B+ zGbr}Va23bsVjF7@UpuFZ3PHSOau|7Gu@v~dn15v092Z+jTM}%;J)_{E&TVl5H}C~w zwvU_X`#FlFw>4nu2Gx^U3Q3Ll^5n;EVn;u-66wSs!Ak<(?}cSTV)6xN#3WPI|*4*&X~NKC{iw@~dKo1wR*f?0pOH z80ncG>YbMY!f65X664tF4D4J0es#Fj!$27))9xKg1<7-8>^27&HX4{q3pP32=7&GA zv(a!3>J^tDNP*`KbJm`Bb_W+3C{N3j?0|eCp-f3OMmuioZ^2pOjr_BUshOTr9{K*u zJw+jL9>TZ#9JIn72Cdc=H-H4@ak(IRUfyoRokLYolPt2fk~(l?L#mI7*FyXrb`kc6 z5c^&9E|)cNXKGH8{u2;-sK4URJEpM=A#}>)b!LbeagXH9nvIClI)+QwWMtlh-1u*{ z47w3OTNb3nj#St%xxIwCO<`6lDnBos&`}{eS=NN3rRlZ zc?O_8-@8jC))4(YED||+6bk)Hq-{wZZni4>eJc1~B!cX%#R#FO_t9Df` z2RD*@Xi;)d{gNQUX;Ff+7N`6V?f-Noejk3^FLw3*jB>6vKAizrcQN5U<_|N)roQG! z@p;+&{NRA1w9)`$Gv$#tVKO0i;9jiDltT>@61jrVa4Z3MMFP5(ZPL9o9`N&(J%N1qFO zT`wWgOm8K+`{&P%=h3Y0wR@emHCfi=OEa!U>DnFdPSNT;H=Otva-IO7(26hkKWbKo zNrWk|*Kw91j6%0(;jC=*G52055E~|n=Za1y>?d_75X`8f7mCLoT~s>iaShK?26gFpH!iqd{hnXt9%Uw|kSLp2w}8 zbxtsH_bz;EI#CoN>oWV)N?bY4NsPSCp9H6)nY;F)D(Pw8(F*F}RAx1hA^bLXko1>K2?z@40Jpx!jty{Z5hcwE&t}Ir2xX;xM5K*dIP*D+2k5FP ziFo!}>UOVG|DCEzSg0*~s*7f$dZK7|DwBPXq#{LetkS%&-F-R$dhj$_PlQ_>@D+*k zEB=MB-ZX57kuO9yF6K){r$%$F#0d6_!b=6 zQE}4|%B}M@i47k<)CM-+)s{N{;FL?mai#Rz>9@7FZ8#gh-JZ=9SKw1PA%q@yghVr) zWq9gO$e4i-T2X+SMF3j70AVgLOLbFXl%A^46N7Qu?fw-ONYXsW1{D-waZhymn_+3f zf!ZKh93ZRIjsGuZZQ(l_d}XvWWqU{%5C(rXyh}b0K^H^`qUa)9;u-sC5Zw)wEtTiD z$QSCz9Bj^r?9cE53uQikglfeu%sF_|)O@Fd9w-=>ko2F{9ytO7r(e^DpvAGX4% z>;&P!9W>g&Ax-Rsm1Pq9s6NZ;@`P0l0MR=*-W-O%EH4SS!OuN4GyPFawS9OpEUhFI zqhqP>1Q#N3Pq20#BX_*r51vfXrQ2+QcLlV=B~m9mJ5eS4MPM=t{KLY4{*bPm!Eby=gT6|jRF+Qh(_sw+@069e=n%RfHo7Ki%`!b*8R!+cTyu%xtP_)~X)g-=h^;~YICj?|YwfF@?z~mk= z%71H|(~QN;$4EWd>P)2F!(Euk{!4xO{+~Hs?#MTx-K$ATjQ<5RaiSU+aVHhAZDoJc z*pVh_%wD77IPWi@y%ku|KV1wHpVcH^Y}rS4w^b*{hmiy!g`)W`HhpD`ud$eRVG7O_ z5x0#PC{PzQ50!*18^AT-h;7E$1Pw^>O$Oy;N`Xxfn^AM~P`nM$C<>6deI#56fo$+gH6ebEmPLlf?^-KhN7}V0 zUhm0gHG>nG+p@fzuvW;pl)7q*75mFb)~u1IOi|bI@f@Sx6ZH-jFS4Q z6GmBLf_L`}DF&f;st$`yV?0={gkVsDD6vQ78o30NZ8b<=0i>WdJ$&5t4mNPdg3c;f z3d$TUp=aPHJzagGjbu~Gz5j5lTkp7CsHxq9v0cXjIt=U#O&vPy zzu81U+aQ!?RkshnA;`q0)I+$M6h1&@i(P3p!hfO643d4AZThNgfk*%~yM3nLnp2E} zvJ>l)AK!2@$gt+7dMD!~@O%Epz>I>erN9wum3~e2s#>eCtW&^$VWjRr10oTg~bc1x1G4@I{#=pXzm%nUtRBl zKXD8JGT2nF#5cJ-XSTz2i6SRr;NAqSiOz;K9MPIe-E;d9I{D9c{Iv7Lt zPF#*IV3mMtc4mZn$CeX?co*@Oggy23_N3iU50Ib3WuxUK?lliFPIFSlGrtLooZ<4{ zpWGdNKFBkK+W5N4J5FBuSRA;wWIJb4w-L$I@HglMbtQ>-giPsQ71i^+K z_bDA}EVy;U7IAue&coV$vL6$DotG1Z-#C+&y6kW|`iz z@YKu8#6y@*1rtkMi-p+|WqfNv{NDVu!`*RUN_)VnGyv`U*=D4oDg(>0!oduI+BXLN zY_QSg0^QALQ2V@gxcqc`ibw?Y&wbM*xkvc5GWF>$KLC$-Rd^X zx^HP1u#vISq}BI}yDAlHFK#y>bq$V+e6j`qZTY|3vyC-)%EnE?$6b~YZsL-1ohZ2>0 z!|N+x0=E*1;&oUMr5!Qlo9NrkiQ*?X+qTqxRUsz>IO{Kku;L(`Npe~S%BqgJpYg@& zGQT93zNgTKniXpjY;#5T+Py_9{`JzElb0+flwl=CrjaINPJict@K2kDcGKoUw-c2_ zl9DXk(}f-H_io>MQg=~_>2i6(>hL`!MR&1!krVqY&>~(h#`B49nb-t*v(}R1wesq{ zpr@Bec%!gs&81g&{mjuw6Cd6otZ!oSKbI%ikG{*C2wa~ZJxv5Z6oI4W8s6qr_?I&8 zBmeeMqq-$i2yN=?Fh(njpT^v6eJWM~xYGK{{UyO<%@G7?}DiZJhc&zKViitLgS z7BZ9{s<3$nE2X4p!c7U-5_0e%zwwo8?%w9<*3I!IZoOOhr=hr0@RvdqMK4~7FHA+> z@H^X$KSE8Gl_GD;>r7k{o@r%KvDkUfZX_gN&yQVN8Y_c8ylHgFeh2wu9b|Rp!x&$Dx${dg z>HxA8_6NfhpIaV-v{*DMyT=B^C5#Nf{}AY3~dF5?e2+7m9?S}bO2N?86 z!U!!3lDVhol?HS|j&oP;xuU?2Ir}UmeDUNQg z^h^tl;xAy+Ycc&kbKQ~Xs!NW{$zcC;>eii5LgH{qnXt<}2{v-RZmznu)5Z5g4WaC9 zmIM*?&edDx3Ja#TzSZU1=)|APf4ZOe;uWFUhJ#IwvG4ix58$O4FBpQ{%}W$WzADZn zK2+I?-<0n)x6%*^cH^{0seBO5FYy+*Jf$ct6}7JGSqY39vLTaz&_$j=TzE`0RE9S@ zF8cjl4tc4(MEse3U0@PXZ$u+tB&U@mI5>gZr?ZW~fCz%$N7`ri=LcinD?G2cq7H-Y zl{p0Ood^{K!yn?_#&A0b6FsVgd_X%la5R~VxSS-Q8v7v4jV__G_<|OxS-$IUU>*e( zck}HYc3swSD43)CM#DnAAG*NeF~~`An^KXfq%mn+^O~~d4|SqTTQk<7vJ6GvKiu-2 zAb7@{shdp;z5{)oHaMelH(@qs0jV8rjeJB47{&UNX!xElhQZ*mdsNk*?tk2wvx7o>qJbAx0ju zb_*p!AL>k?xU^`aye|%5Egz%>u_kwa7-aRSVF8<6{f#m^i6vIsJ;d{8-C|vBeL)B6 zqQbB3asf1zVjt@^T#{<;QC6K2&%J1`BsUgt5GJ~v_-^>0T~oXBbN`F(F&*I-orL{m zzU$0L8g}H=n#I=TyaH2bzFj|3&rYJ3-NOvcCGv}pM^t_E6|AwJUTFxQd|siXU7D!e z4iEZpw8h5S-7hu35O!G7@hzzhgz)?yxU=}BuFRmrzI^L+9T0AGp zFI3%Dd7)#g6}p|=T-z0nn(Xx~^qlKD2>C4P)O{7Hk9(Gj&TlPSJW^d=%HnpC|L7FX z3We&1r(yIB-{qYnb(vwA)TKXif1nFk{a5}Z${%Y#CMOUv-`@`&R@T3~HfnMP%4PCD zbS3}3`@-XsuSaI2{oXs?VB}7c+IVxFi*}0J_RUvqZk)+y_x$D`pdNbA$3Xg|NPja$ z->{N|ED6C34HN}hJNR7Imfa&wP?ri{3;FW~s{g4Ix=+kX;5Dfic!>V*(4%HmZg{8< zkO@7Rbu~qfb&Qo)y+XhuUb9ovUcK+Hy?{zR_%6;vLA`@Tm0jm^QW2-)-sFPkWR?0nAGO?p83B7?FGeMriyPlu)FFSTi@ztL2!?o z8y~J|CI6Dt@rE-$f3*#UNXYT8K&(7{RBEbOwE5j=_Q?BE8XU-A-W4j1v*D{-eG3>_ z?OLbqNbO?Q_?}cm##oh%JtwC4)zrfN$jMUlL`83i(eppNa|yBCvtHOoufHCSN~>kS z2)!>WsjBo6pLJPEn>TWV1{O3NfY(e1$0u2jT)rCw04uG&oWaQnLDN|{e}T|28K&7l zf579-p`1fZE=UqeGqnO%aKt_4AQBAG(@x^k*ryk2#Ai_-f!=4$J(iK%ATzYE1CMHY zK$uLSW8r(-Gy}nwUF>iu%hCEk@dNM3n|MwLq9~x{phcMyT0SP-Pq^@e-stIY`zFT> zr0^60UCFyV&OE6=0_qa;9CVvd=Mf@7{Wh0KPKqnMR@&0_fBt$S5%*_Z>4CqK{M`sV zAiTV`XUB$fk)}9jn8z%g*IVjA-MXd}LXK3%ls*ATtdlXR+k=3noCqd?!(`HANZ+_y zuSjKdP_*_wdgAH29n`Q=w+@A0&nf6#n$5Dg`Cp~aN3hG0T(ODUnq&v|HdqAU{)PG_*bA?=wYiCVjOs;RZu`Fd zHnrZD3ohPSU(L-Jfj2Y6s*}f^quYJ#-15%)#eGl~bPYu!fgIk2Gd+^+xZs<371tP| zT>(BsBpN%XIAr@iRqGhXdI~ukFAV}@p|LGzF#U`yak_4LaHB1=U-V+v4!2$vw@6~F zIXza1ie4GiBPS-nW0If#J`@e3LNN>WT1r8Rew*TC?U$Uv1-uAiNA+=niIX7%e}YL5 zc!fjW4R}9af68g)xH~P7!^l2ee{(O0rAn+t%X$OF7nV;ov$?Jy`IWB~Us*nO*-TJy z{}@-Mf%ff~dNA$%Df}FPLC#JrqU^{dE{9v8S6#B_c%f=Fx$!)eLF}>$pel)7dFHzr zq>j#=w~1ripL%O?9rJIK2%@nP5jJs7V%)}*J#|2E1wAc(^UQe=L_SPDPX8}?pcxdZ4Ov2%iC*aEgP zc9m5e7!(|tbrmvhBiiZAcau6MgWRq1j(cM@pHD%hCU|Gx3`bQeQNyi1@=_3rJ1^BW zIw1+g6Hz_JF&3~=)-YENO({qnSI@7>2f7Az66ZFWvFhnGHP8{{=T3^t!c&1dA* zmE_0&ITm)YFG9H@`#-9>ch?y0v~8euBTNdm#ZTfdIbn@* zPd?+#-bgQI7(2+xw1&w_Xt!k2KNIzB`4$-bs=gNg%*6ubv1FbxJv~xsL(+ zlSOv2!rvUq8iwwH{(`TyMpx1zNAf;K@NT)JvJ)2T*LUSzxe6zw+%}ZZ;P%)3>jM0v zCU(<_dR~t@7|tZ(6NFvHWKPVwkjUUOl_;C_VkURDxO(!mcD8o^iC1yNHll>GC$)=V z3NgV*#_w#^Agf;#WOh^>T<^(ed!_66$GAl`0*_w1u`8tzCZ$ zgFuX-ztG;L4W`)g3+xv~CDdj5zFYO?C*3LEgoH}uAEgknW-}*_J;zhkLMP1KZW({@ zYz4OJD+ZNQ|X#~qY{>|*T1Vo^TOj{9g*D1T6KA070|7l ze;?A&Y#jW21m{+CF2?ZQ98ec1}{9 z=Q^twpDshL$xk+-{j>kJqBe2wwQZtXpe`GVf(Rd5j0;WCWO6bzMmR=MsP^P+-Q~+S1xO4DqF;BN)Se`OL=`*gieP$I>bu~3H(%EL@ZvuM5J8Rk+$?P? zkf&yD8_xvonF2h}Dl({6*!7cp(?)ivkZ65<*nUS2%(xgzm}<15QyU!l5#~2S+k$;pkCOt{T1+Za_*S)hzStm(dc^G&0T533p6b7>z1;G% z$BMSMk&$}~It+p&N+3!h&atY+ul>y;AwfG+`~5%*#Oj&rbhG*vW)d3C8mN8}6`FEQ z$QfdGs~@K|w=dvNEvs+?f2|kF$vHDiQP!!@&5N#s@01UZvrClsosju%;{P-MEB^rl z@RB0i0-TV)*^$Yen~eS!7wzJ|bxw5bf}~+9WZ404sZ->qp$4@GK~oKbU(&akkzoZ2 z@yLdua!X;)O#dZeNl-VHMyfM93;_+B{gLZChfX6F#*M}rU2O`6rTQ#Q1~#gErLQY3 zC+9EqcWtcua6|jT)$||oMGy%9XJDJ^89B(XjQ_P!0J5g}YxH1@1p;?Ff4EI-Q}%zf z8^ff9PBYHJ632;GOq(+Vffbo`RK|o_8W*b#s&-EJ*F!guLMbB!P9NS%Y#<1`~Z> zj?paH*wKwB?=TNoKE~&#%LyhWYrlj@?OMUFd`lgy6bY;q)nU*9((9iTc}GKJjoVoq zH^4c$`nUcCWOuF(Jd`a$_Qy(QC|1V7yLVapfAM3Z0xMnt0KQv4V2E10$`zv+>d>j* z?vNB+JNE`><^Ll5(_P$yQv;QWw)ZACa}+9RylEUvi%WWI zcQ>-Ii2I~+w$HF-m@wOtqf1u`6i}jJ?^gxknP2@wqky8#6N{=r5vz?^{4ex9cIUJx z133PO;h`E9IO2ke-Z@|p$QZ*<`?b_M5uwKR$*1^7a{{2-KwFy&R&xwRkLZ?Sqf>^C z`ndJud9|*E9b3~^UXdoL#z8M9%Q~Ve1J{P>xU-^!nJyP#OnY7ul+zF)toVvI*%Mx~ zMrIpK%exNke1Qt>AQuyBM2X_ecANjK&ua(6UqD|eV}SA8G{dpvF~-1?*TTo1uge;( zIbRCH*11~&o{OcN@VDDOIBrB3Ow@vcf0KpQFu7No0e-yd7wc)(dywv>q`JEk4MnM$ z{hb4~TXl(|Zcb!?>|J)a(KH3FE<&YwhnoWPHTWn(33aqPo`QhQ0-~&zoc@_q3#!r- zQy5~dq~{8eq=_nIz4dFlq69r2cnik!VYO%ainD$N^mCQeoTSO;>9tPqtKc-tpO--J zHWbCa%Bd?jjyVzXKyOY#a=;<#luQno7;11V6SQWhOJx=$&^drmOx^^=NRSEcL%U$8 zH0l&-l1Azx`pyMrfLqxuOT@Kffs@sTP#dxyam%Q_Y2L?*9}k~}!(BQQhOp>4kx(q| zc_1t$y$?WQv8>?=PSVn0$Hf2ee@Aoa9ivqObFB>z<0MgB-?-*Nc)+JuHbo5CMkOKv zRlY#fEJwQMzrx@=ir<7iwuYi^Y;UM^pq@i~q5(GR+!|LO{6ntU| z1xa~VOdUZRsg8zebEBBHd`s{@Co$}ieY^btZuPAX7Zwb94?oXsf$(-$=A~{8k~q}; zX1uCElK`>HhO0hKheF{&ncEb5?dE@n=bjO`Dfcc&OD^<9-1oHrTzcBKgl_dg&C%@B zB+xKa#f88$T1%dMBFqX=L0D1~U^Hl%InWw9q2AJHdJ;(@w!iN$h%s*0*(G(L+q(1Y z9~FkX-GhVl*QTm^yj8$(8KStJ%3e)sN2Du_gj~msn}g5fmdj!}CwxDj0!t#RwUBN z>CdQ-?H!$83&S+|J~JUEaK$rskDf1f-H!Z@orn-ca!{dhK&R;w752`NClct3E-|k% zFWPdy8mL50m)h)bb+Lw+AGJN}YyVRj5{q9D?%^Lws+aKCWD^>MaS8mWJcS#|5ZYuNI0c8nZMj-E znwPZikMn2Du!nWE8T(_bliVHcd7~cF->8_kQEc`1U3P{+8wIPo|IqqVYKtR`{WU3r ziMw!wI9Xg+c=+l~ZsPNuNT=TNl+~$}A~oXxZJ+^mf-x|rab3sB#$i$)hQ}3OdN~9! z{P)k_)@-}C*i0}?*3aG4vQ)G5g^0c@88rtrc2?gr4qS5bFn$4c8??m)>=h1{CwCc$ zIC1E9a?}6LH3cSPwWnxmIBB59DChc>7m)qC4%fUrg(=+BbwQoNaq?%n;Z@CGseRgO zXiy;TO!T9Jl6%BvDWJquHKJF9SFN@d<9M zP$ZISNnFfMRj2o?8Rd$v4Rwpstani14CRdCMawNT>%&$T9^A}*h3nY!7&gcB-q(MB zg=TG82ms_6qIZ$y3CG4EkteJ~sqifhp@^sJcssb{!#L;&wjWNZsJJp+w?MZl_PA+3ftaqofTH50Z7c?!%I6v2`}N3`@zL<3SiYX}a)%-Gs8> z(Mf~N#vPctTeCF?EplBGNU4s-%3b6kK~I}a{3FMsg_7B-vnS}b0pRNByV^y@lk|Ag z?Cs=dhM8s|PgtwPgxG?Ml&hCOfeH?8S51g4z?5MxF%HWOQ>tC2|I~V|fUg#SaRJEq z$-xio)=?77=M(M8Whjp^QEBW5hcya&+`%VCB#&@gvw;m=L30nynD7IaTne}e zXp2{21L8n!F`&>Swb4HTRtBCpZ{PpwH0{tGw}Kwg@@S{^0It!xG5K<|Hl9|m-qHXq z3xW4V$OMIfSEbp10 zwmog9lRMLDLWc@{DPFqQ3aUL0mLUcNVM`YhlbDLDefQbD&M(`y?V?LU+!|=csc}82cWTuj}3CZ_Q&qwjLv>EWzHMk)zn^JJV4~t%wWfro#;{1>E|KI7P zE!gaYoCAE@E2r)8qtxnp`)pX9K<*J!h+;H*fBQh!gk)X^c-6%J2c)`+Pi^~<_P(sK z+ULBz?_$8+i$8WW6|!ePu@Fl@7D2qF+o-y}_D}KWqD}$eN#jQKH+kK{a;9f5nYR!o zn+_||xKg$8goU1|K7*?=n5XvCm1E%bD*87EJW6Dg&l}6myxwi{TpiE>G*IM|&quvW zTPK{#H}5HSbOCq)i$@-Ef7<)PcfZ^s-Hy2GB9VnJ^Ak#9^MerjSo?x!r|F1z9${6? zVl|<0G-TUM-2~0Pj+nN%zggY%$UBtfHOX#*iso|Q)2>r((3Ke-V8-cV2@@vZjqDpO z+vqX^jMG$V zJcfWodRQpji}ic?J|1-Po__>I9ZRHu`92locjirs5aYsb|L8%;NPxD%SZyEp9=*+o zW$ccX2+AeqchY`5f{M<1!Dtw=8j8s&0nGM|KU|`#U7j6-V4xrm8F4KD;9Ny1Dmbtn z*7-&qAUs6-cdj8f9h@8q!PX7HwOP@!$3SLk6`$ zR&nMSUYq4%vwzRyYw$wQiYwcKhP6=a8T4sa=t|`;rlHRKjE6tR0g43 zJt$KD^oj!;DlH3l5aM!)?2#|Mcy`o!9lZF?@sVllJXUK=iye?2>$z-aUU?YRJoxF$ z`)iF)mpUxj*u4YtjTmg2sp{<3@sfg_J->!uz4UCTh9f`57ap$lS-WE+4FF`$JSfo% zuB{KrxYgAc7JNTWC#MmiKWkt)G}6wSxPo)thE|iSg!n_u%&_p~o#>XULy!f$JmF{0 zO&eD}yP)(;7&3{1w0cq>ZC?!17e!7Fzq`;F@;IkxENIBo&Oj+-P(?JQ_Mpc8S?NY3 zxL80nrP425SL!UvkQjU(KkN7_>7Q7%TL_Upt0+ABSKd*$BpF%GMsPSfuW8(@!hGNg z3Lqrk1);Qe`oA`74=RRSlwngGeYi0v`HIr}+e4rF_7~2XWh}qoO+YxAN-7;XIi2*De9oaCnIUqmC(`3g~JL| z(JjY2-<*Q{{Fe|WyAbj_)1Naur(N%@TEQugbscA^I@* z6pm-rZmwW%Ki%Qsy=?!G{+{wDF6SQ@(RDM5_0D`>5PXBQEhl2Ev*}%7EX`jFoK+@I z(&40nExb!FT)1+ER6ak7+Zi^uMTd8cTlvsMt4rRJJ+456uo8c9Lt&hOPhWPtT z`)$&HEO|ZO zYlX8;uzuZy>Wj=-eN7Jg;FM3JENLRD>K`q(T{UDSDt4xL-l--?OTk>z z*C3HBgk$i&NxmN}c5YtgKm%!&-l`gcnD7w(5=D-Y8R6Lo!%=st?V;03_J z7pF!GAl;JV2K#)724`%>=|wkPplO7|21cer^7Nr3G#+v7`l{l!| zNL!AJm&vJ~k{QJZ$NjK?egKwC@{+S$oiw4qS4V0OqOM#je^$B5j-5>1oqL@+m1qi~ILw;#M{=6IVUM1MYT$+iRN znucNOm2#TvQ4P64bCC)_nm#*m=25m5l$7WmDKmy%gM-`2gkU3!`zTBDgkLDGf z<3q_c$%7J|-SkY&dfLH35zV{r*4Lqe$N9dTBdZJS$7d@cUpv{-FBu8B%(iXD*TCa# zehJ=7#%I4j22)#el^R1ZBr-*T1&&sH9m4`+9(_C=6ktSz&pSqm0j@&^nR&B%|5^`z zauXe^-O)fU4hin-KIX;Ya=p(igg06X`WAqhYCDZL973nH1KK@st&#O&)#!eE6ahVr zwP=%vJS!BRtVY>kfTr!!o{Gx~(=Rh4EX;Uh{4~gl)#E_X`tuIXgvVqD;j7I7Q>A7% zHEp)T(dtq_lMtZ#&m-a~GTzqM4 zX`}7$M8V6Jm{PO@Y9lHrrLNHFL&n#Ls7OoH#EfFk5ckk&0ZBMrd*vS3zuhf!tvKWG z5y{g0@4#=%Fk|P=NEycFqR&tg6Nl4A?)BeNtQ>2{RTk5dUltW-)MNZ6lI5ZtWqosZ z&B>OtSFv&7g_vFT_I11hg(wSabH;Ef~Eu2fd8v2jmZdmJi$;-#XLCU zkFpaF4+(y*-*N1<+TU$5Fc`_!#!Yva(K%bV{z%%w*C^<(>l6p$YXdWH&&la8lrjQl z`lM~4)ve%_2r2csr$4r&mtG|z=8KjilJqGZ)F=wiw)Dt<5IpQG)`_E?I#sv)QKQ+D z`?VJTOAHkW9LSPonYZlw%cH_!%Zv%1U1a(0d(&u{nx1pb;|8%Ly<{uQ5pVnZHi`t} z^dvjFtJlhoXp=otiElc`e_lT@k zi|vbsgYAIFry6*0x&yqZ(frNp9AdBsHPI0tHayrI>R4A)(sl9YobykTk)QzVlpE?IJZjJ54A0Qx&c>hH+wilB zM(6M@^-8YFPW(&)-CEDTO<3rSavtIn2PK686yuiNB#VPJ80e$;^xo8Bo2^o16SCg~BUp@XPoD#7TuL2JPOwUmT<4BC2mmVwMY$qc*rq9(Jd>(!`#jCOA(K!4T&O4{p;Ul7|+5BI@ z@T+s3zKJ5iV9ur)HIhO7MXKdVGZRU#u0P!K==r-e1ed7=vz%X)kbwbIto$~oyph5c z6`kLODPS`jYT-9maQVPCx`ud?Y+nbsXZ&=1(QuHjBuCugZZ0uK5wAQu-_|y?l?tx} z2>)$)Li+_T!;|rdxSEvuqxWJnc{sPlvVY5Bl@WEk5AG`9{bJ%{9CDrld;tV znTuQZrJR5Hv4}laIRVVS0!c=~04&e{RYE%NOV|kD-Ev|}1}{P=yThcnrzyQ4;z~Ct zsF3tLy%IVM!a3o~klnlPVviHA6>i?B>+~>`Z#3%RmH#jJRp0T;L6a&F8I}hGVw@iS z^!r+;u6l*4P34mg_Q^xesEcbd*uyM8f&?x68a}7RoLSrt;Rua?hd}QlavY>KPKqFT_XO) zX_Q^IuYIc-BOv(xMF*VWl5i?mNyQzy=qe~_Lb>WXg%M1Hon%TPjEF%ZFe~rwzCNl= zmtMaw9w<1pljkL}MxhF(hMA^$F=krb-HYxr&bXm?tJkt%6D5u`o&S9IxmMmnOj-6@ z7WY`jD>wZ@FPkh8#>jl_E<>O^<9oL2N%9y28e?BAtZ+nkNUYQeUo*p|93B<=2Lx`8 zj4qMIuMW9L|M@_wO|Xl6hKi1bXyiiwe<`hA%g43JKye!Al!tM*5J(~>{Kjpwx&qxS z520^;y+8QueA!@0t}b8tLks4f6@bY82QeBR-{t6JpG`h6E|kC?!BqA@*AN1Q7kBkJkelHB-DM#`X5}UWf@m*e)jD+YtpU*4is6giH9v^+(e9$=4L0 z&RPvrQY49|*NT3QH3@d+rY8@Fc8^o-+$jZz`X_2H@6HSZK!l>{I>a^{L*30BX4U+~ z$ME^A_FAJh#Dz^wNg;s=K5p;#szCfC5Fx&KGx9G!hC?jY(aw?H zIDLou!;2TV#a@EzS5?pe!BiJ6vCjjx@ag-zQSV z&QiU&On;LB~A1kL8@3nY@GUTuI4{VOo#(gD0b+*wMH+ki% zJziQT;)yVgSC2*O=VC}5aM8)iKXdDVUdOO-l|CP8NsZ0Ux_26lgselnW~)kN(C0wniB_$A$}fQ598+O-ta{bH@6yknudbJyzufY>NJ! zTb7e&4dRht{5n}|Q8CgnfeAsC*&sG~(XqKx>oC%-tD85fz|Tis(`ThL)H*l5)#jyS=x%m|S2Zk0EF+P4sbx6_2@*e6B^U!}`0_HlVHRg<|N3inceP z8WpeH$518Z`{9oPiKB(5>R3B5pd73?4WFult$9Xm|B!j;`wi57+(4S{qU~T)!f2Z6 z`{5HytV%S9SjoT8niY<%xRSp2<+w5ACM4>A!e1ZA;sgV{B9_~+kGmwxy(>Ui8BohPJTg8R-2Vq7TnmFJ!!-eI*H)fpN_Ktx7D8 zOuD->Dw;oFPb>)JxWHG75Qp1!*a~~vym)4;M+TmyITLP<>5vqe@cjN>UlmQIPwzQeZQg}{dr}$h4w)pO=-;+dP9g4KMh~O# zHH5^+yuxZi%=ymoK(~NHA;U~esPh9@k=lZ$82oxaZ$8y71*ZtYuo1KG&#qhS^v6Jm zoDdG_u4DYRk0_LaR&VoT6jbs3h7+DSFwmI>>b<(`fQbchWO)qE4{M!Dl25n~^H+b9 zE+JHedW1V!r&uSHfFoz(-l&l9l?A&Kf?qyy%-Xni!NkAQk)Nh|=mJfI;Jk$4S9~^F zFq!r@D9)EB8r!wPzN_LBQFOQ$4}e)CVfWsNfmu|-wsCH-{l{?AA=K2yeaZY}MDsGI z$Fd`o?9}Stjw%bzU0GP@aj|MUSb132y0(zLI^$Z!p+F8ja9o+>pEje|#C2pNB9QPr z!y#Ys>sC6`bN&e~H*G zuY?8THEYUYCI~r<_KAJ6Ar~$ltgPdZcs+&F1d_iK(@2k&w+{0@u}hlX5f+ja8hBl+ z3G|uXLG%SqUHvMjqEAc{$RIa&Exx^2*NmO&zdXD(F&6KmV~Z{XyBnFf%IfERDc;ws zLBwvbCmX}JhDg3xW$;O{Sl)LFehF}?aZ?35qin_S)^(zq4AW|)$f+VE&@=uL*aevQ ze2WAKHHWU?JJ*xdY^=!dg$UBoi1p-H(l-bHF3RNt8{s?l1eMTi(Eueqt#~AN1VicXSStyEFbDqrFvPSr22X<(@f+KTPJOGw&+3<1 zTqH;Qdx9g3sgPSFM%kL%L>r#v^pQeNXea##Ig!V^a1YnX z40O#*2l?m(lGnd{gCsY=M&2z9!8)36r# zHd5DE{pD&#dh(hQSme!ri8Q1LiV^fSwQj*dLygvV{{hJ56^wvPWO`Q7R-eOHwDOk? zPsdRMl1mOqGnFXgHFZoneWlTcO53Mj=poZQo9`2ACIPN@2MJ?JOuJxt?7Z@w5D?#Z z4}W|DvJ{I6W@DVF9h|9xsb{CFRC}h4L`#`!Q~SFV>;=`GVL0iyS18xo^Mocby~p8$ zoAj1Fu!?I1n#|HOzdqM61A-H<7XO&~bWJE|XvatyuOx_h0otSX0H1c5_>JmFL!jYB z0D^bB@ePZnEr)pRz@Ld*=nk=GppG7{ZTR((DZH0B{0J57D3F2aHWa1*S`geHoE>AA{`kanzR?p17jXB+`GdYoI%yhVD1Xys z!p!&7YQvDJ*>;>pxT#Ug9C z2m4CozBPEWOpZTqBv7|}R@^wN|JoNsv(I#qO|~_Z9yY#e5uGJ3RbrmxZRmne)^uAo znRy>N2aB-8R5Bs4=P7S=zP;ns2hL&iM3i`sE7Owizrl$!JS$CY;N!Ry_goH-A z62x$;i^$WEEPnBO9>q#jKZhs3f4Ca>3LGTIJZiCk}rTU2Lq7i#gnsDr( z=Rc&1Fh7Xniw|phQEtXLUz6ghQ*LN3W_hLaSdTw9wr!BQM>blny=I|AuSzvrY3*xY zNh!Ga6SA9+f!cHpGj->cMzk(i*3SKijH=&X4E~Wa_bF&ET9bki#@6XVqG9Lj1SIgt zR%V965ALJU==8ZN5k~AcgQLBbRc5>0G@Wl6=B~ zX`gQvy%rC>JrlWnwKOCQJpRPe&gHvM*qSklorKT&G)^rL=^(yO*}B}d)o7)JAPnOY z{`MUdu??3}>(l{=8MQDL`|3d~p-B8Kq3bhIiH3C^C_FQMUk;ID@^k_|3-?yst}>vS z4y4f42Yz3*NA!(f?nGiZCZc{CE8%@c-_lc(D-2Gl$4~u7oHs^}z?S#XCEy+@$ zUYz!dr!Ru?64ByG!nwAL{7T&^RgJRn5=bITq{!5_B7bL>*ZD{zeVj!g$8{D*8}2%Q z<CA@tK~#{^L5wx=`zXxjRhs6AUchn5+WS906en}k!Vq@%{VD^ltW#Ac8?fTZWqg=-f1Y@kuN<&h5tlI6VUjwlsFV2r@b;J7BUoi z0!wOj(!Y2+Y3j&#>|A?9J4yESaQ*C^_Zy_brQu4}zpNKaW;%Tp1UEx?uyY6yTwBEl zY0*|MDz3+h`~}ml%HNdjIUB^#mPUh&o>_oby_#lck3+a*gS zlEajR-oT^P781gHk><(40T6?5EgXOZa%!|GwiuH>HKU-n(bb-2Cww+XqOGqm651cZ zr(grZh#eX-Evdp3m;#|PebAG?P?lud=J8bqQpPZVUN^dH%veI zi8VmS6EJ+wP}`_Kmif-7TRn6z3xNM{wpUi{)bACcQghQDnjoUNd{g3N2o48vA_8`w z=@Nzx6#+miL@vgWU?V|%u9;CV4ZOWD?r(xEo|W>I@M+aBTM|)>G3iV*NS?}X$4U%0 z97)Q>+vxIbuje8qGb#Y)f?r0AlL^Z_ONLpndyUrHz4F8B{vz=)V2h4hSK$aOc#L7_ zfre7Now8oI@C|GoimmO?4)#s0UP)eV$PjyCf?en>91Kt~PTE=Z{RdrVwe7@cSzV7m zeHTVFhtlnqN=5HWAkU@!__h(S+jp8n;Q)+2X|#cy%|yZHS8>-eJ@4$k4Kn-_HrxWd zEf+Py&R*(hS-e9w`)&WGac;5|VqN`W?kH+`g z_3{dlG%vLL)%6QR=etFyQM9%n9c!MdDw}BFj+c>k1iLm#->aFIr*kvmS_{sZO{}mJK?FQ+fKz(7zSO?MoJO zf3%0AJ`V>mbMISrw2(39&DXiVjNzMVc6*ny?&taJMqwqY$YR>?%-jW76#tE2hH_)w zqKZ41=MjrXJu5d=zA({-Q};p0HZP!!j{dpYc4boF<*;YRG|};PvDgefDkbboSR1SY zMY`|Z_khlhk74R^868yf>?MN!qM{%a5mzDsaMQHZ?tS5ZjUOn)@HcHt{|{PfQ}&Yx z&$|weQFXAZ7!*%x(dxWuOcfFIvx*&F zBkp_3!Ji+IS>95ED$68(i7237K_emG!$C-*9)9#uWJOZxs8P#7d z5i>EVT~pUnB=)Kz>+G>g{um06GAdvB9!JOlhn`^iBW<$ghjJ4Y*$o*0G|i%=k-0?p z9IC0+lSX!XOIHy)maSX9mQK#8hz`AR z7}g>+oa`8_OL8+@V(jnRNPf}Ag2QnO;TdnFvK59V@bRaKC_EgIT#b&_i^XkYOtk;9 ziIsWy`QPCRx^yBJgOl?5%%b)ZRv>0ISr@H0IlPftKmwqTcf6gnO&J|Ks9@VXY7VcK zGsnilt{JPh5YFFeo~sijpR7*V%>x*ewjE9g!fegH)n|X@{PJ< zsdD_Kr&-FLJ$0{%&W;{^`&~Zkiu!bAT{nnz;!B#$y zXS!{+aqqmH%}s5{{LH6;61jn;)U9th?zOLkncHsTm=xms;-CYpKCY?itaDI4W*xBB0}XRZr3w;JcRV2o*J&@jc+-M;En5PRik&ZNJAzkPKu< zrgMTzCq!G|1$6w|$a{7ggo+maH33t>rxj187s68#VVYlChf~QXU%LlAcX|-`iO9T^sS-6QEBubmE{Pv1%^Gw`6^HyYOnkrnPm@GIBM{mLI16ug-n9TBW0oIh?nl-8Y2m`X=V>R!#$Sj+^c)*bmq?PymNExiEVgX{Xo)Bko zC=l{}q`PE_2ZI+H%4VnEKs^2Ht*So~J-JVW`;HkcNG4DUN9`I%r|wnQo8J5M;tJoN z&#JY_3zAS}&;+Ejhv)w~R0bkAVs?pGhMeva!k|$a0JemO#=q0qS3Kx8D;w6-Iy`?W z23;r#Y@15;-Ii%qsRPhd+$^BV2tK=s`~wvBFuuo;MF%`ooV7D1=E{qlBJn`a3Nm5i zxG=u51~hENLkm5YOQ`K2pP6VJq3U#YPW?2zb#)MD1*E$ixH-|=Wc8JzB1uHwCspUW zX(DyEZmD(h*ezmnrQ4Wtn*I=S)LX)c$9HmyzIgwl0;D~FJub9(AmxQ+KfHgmu0-6s z+_s%}vX#3z;QFU|-)TG2-ERkiEWfFCOqEERzd67U7%2@lCq`IxWT5Nyno|rJQGIp` z^P%7t=F48fY*pEg*!}D2`nj3PjCb=bGF>aJpomQ&HjLXI-yqYxo~hfId<}^x(O~~( zGeW=`rYJ`+b>steM+~f(-G)YHbWrEZ_>R6~Bfb>*c1R!I7|u@+oo!d4O$ne;C_AVx z4%nSg#r4%(&b&U#0lg*UG3fbst31ulO@WJpEU=Z^^nvLoGuZ6pTAxTd%Wz_5JALnI z^vX{jB~}8|sj8GZt#%61$I4q#Z~T>kbUI#h!+tY^CzD`G`^d)MNy=4`L$Jr@8kwOE zpg7LoQ)V-_xa4)wmau=wv2p-NQPuJ_E+1VMA`@38J9C4rNz*@Zpe^JLk0C+Dvl^8W zKRnFJk^3z5-E*zb7eHb6AQJ{1aIu=dt|UW+*g9 z2cj%GzDnQJYNP6+5qg$6Ni|mp;jxxl+i(-**w%e;)VdP6K$4;uin_!1PaRg)Iv2ZL z6V(Wc)PnHmerK|gzLZO;4=Ki9m5qr=Xp;5iMNJ_$fM`N$R&47`<11%oz#)Zcwu2*n zjU(owR*T>H;(gph4xG63udr@`}Liut#wAb#j+I z{?qVgS0~zY)u_KiHS-$D6x|}WD`*}04vsp}%`vy*3I)%~Yv8@__Vm~Pw5GRtoyBQ7 z<=Gh%K}oaWCS&XR9J_VNU2xg-Ctrui>}0v&HK6#e&+%kI7Q11Uh{(NgL?fXvfYKv= zhe|Y7ExZ>6HUid4aYoic-`_9WIa$Z0yw|SEh`9oE;B?1Y^kU2R-DfrLy-VY)RJeA{ zB_G94yG(C@$ESw?@MnLnIuSj(I&}ohMjAKt+Mc8yDoOQcU|_=qpQ&x8^dy%-0xyKO z1mAAvqO4k#^Qd1*Jlav6-F!SZgDov@RNI1#W)k)N&vjPdaE`C{?l>w%uz6?E&= zagTD71kAhS==jNpKQb*`_=U&DQPmdj!pWSo9|QvtzgX8BP_-VtXM2miJOQ#dOKx!ruJ@!Lo`y?P=j`x z@C{`xlt*pX;SgCkKm_!x5^m9eJ)>NG=G3_N^-8FET_+SOvsc%hpk&P)izU#LTy*l+%ceN_``X?X7yk8FUR z-g{#a*52t|s_1iQ*U)sActJ;^555u2sjw&8Rc$el{UwG|;4CcVGF^KlQ93PpcZ-71 z)g}-OGJP_5{v?rMVmW(FnUd-9StMwCykSc}j16z{Q3T*4ly)ih-la%u{srOtGv>a8 z^b{9J7;jf02uJ6^ZV?Vr;vxdi(H1~2~qub^mgn^%OPR@3*t+^yD!yh%wwAnP3b+ zrvy2&ZwV4E?XghU+s=U_yDE*!EpH*T=$VfhRR3h7fpF%>glfssuKGGFvADOf_L#jL zl@6u%+~iwChc9z(-W^h>pvCVer;Mo+D)*FhE*A{iTz0M0T8X==D!Cz#r3uaEeenrx zv$eL7#optu?w-VVTK89V9oWqp23VD2=)w#iGbjau5>|2vdX5edoIa+{cC2Aia-`o& zp|g+C7*E49xu+zie5D*nF?+=7UbusF7hw!Mo*gBt-R$C&=et0;@ zm}456ky^PFwCy?|xl4{Z1l#(d(e!mmUk~XU8#@l7a340WK>F)3w{-L2ddOK&@{p=j zX9#-^60X4QW)vLo?$unWECG@2$&szUDxu`1ujH*#)ZtZb2XHP)L?$Toh5FXKUQIFEz%XqS7ynfel zBNAJkWd>~;{HHL4UelQp+c53=ml`6Z_gEWch7E$QDq-!?Y@a~>n@GTUPjF10L4EX$ zK;RkHmE)}ryDgruX~WNQeGacJzNOiDpmE5h2#{tqlGt?%y(^(YWi}h{n%l+v+vRmn z`7db1p=BhTh+j#F>-AqQrau;9jDN^cEqu0kx9R-A1`=!T)2Gd9#vh6E;@B>D z{-)|=-4w}tE-)zX>x1tjqCUdbe{RiYT{%$^KbTg)d|8uFvNz8~{oX__`_m9FnBklrVfVk&K7PaHNuzG`cAIB~*Vb{t3-Wa<#SOECkp7f6 zu$_}Lmygj&;J$R+HiVv^Zn5(OEN|lj0^ce86pXodMr~|&?;eXgpuIwLc_qdB4i@zl z1a5sNqMLCsCf~33f9+^jCC2uGRdcLrKJqUPOsP(AOfkZ+>`{$6?74qvst>{G!oCaM zyVDFdDK}hgG3Y(MWSf5M%lr1Uv7-ERex=3kYS2PTw8lUh*MYn-hv)m|)6s_)4{UxZ zdZ1m}ogcG!wU#~qPyT5*J+@aCuP{NbGq1A)C)d)k_C1~c!4?O?aT1uUV7DxChuY}J zIVmdZz(KJsF07X#4RIAU?z7vIZga0_%W302V@h2W_A@g&yV?~R67l&Klcc`8RC_{6 zJN9@(M3>-&1a0&;D)TzoZXX%;w<(xLde!%ATXfR87W~NPX>e5f&H2u!s*x{|Q1N2R&zvcd zFO58llm{BhHi#wCgul6>q}QF?0EH_$+if}BP|@>;Xc)svEZ+6!T-C2vvj66(IB5?7 z?Akj~HcOBu{IctOz9|_KGC#&LUE;FQY&jy<^?q?AVT=(F0sdk8ge zc*5+sV5{hvk7H*tDMRoj)b047#9_J%{_OaRCr}rj5Kdx#y?@E);t$6drYK4^N8597 zp8@qwkC83(4hcpEj514=4+RzH?BRsWBkPfJ=6tCTzVI}F^4=354HQ_>8E>4?4#|<4 z&i@ss;WP>qJ?aC-m#z(O)TOMg1CfVFc=8p-@*O#Oi`Nz#KKy^d^a1EvUlhTHm|n%m zt*B(Aqc!Pl7vo`QuASt_pnQ9G@2*%kmoDEf>{y3HI1!oB;jcj)eE@;3??{bu>5df~ zeZ3lHbJ5eYX*s+Wo1%cGjl~2bW17+5Y!vrhz{M3v*T0YH%IsqCb&a7dzg!Kui|vNT zLht^Gn=zEzkQWWaFS~hBjpCcqU1aTH*G~Wu=6U3!&qa#S6@n9a=^)n9C@$OMYYqzm zc7tU3^n_W7dWe)Gr(V1l%cb<m29SNyKbL!yWpP~*# zeP{tUdt!&vXA}EkleRA3;Efpg#(x=89f3m8Z09S-07At@_Z*p|VcbHjwIy zY91#^9$~TkWL53cRo@SPWR6K|MJE6L{+O`zd#Ymfy{Q&Cdj|VA6NZ15}YL07y9 zcMfKb1sR96d!~)LboXRGuzDvN_?U{X=DrxrKD%17&>QUl0W+SAF#d`eYSK=a+Vc2PV1q74 z)_3Kk|EP$0N$XCmV$oBLp^{ns3y=KZY!q)VLwF-$rj$<;zER7vlPf=g*S#;`LmNTH^x>pw=y zwNJT#tcaSZ#_Q!yJw>e8LcRn31^wkGCLD^CrV;|`^(b1VHS1Rh0Z#g*LDYP%WyOat_RaRqd) ztEJmV{2YeZ^H&+^p)FuhLp}n>Dx<&uPzd~u&2?}YhhWuV-+On2X^x10*Y%ElU1Gfc zIZfX^B#WQYe@kcqThd0gV4$ZN6CH0Wb?N#NYSG>d8x1)S%h|)dPxHdOD%A>Qvcopt zFR)A3atKKMRB*&_n|EJtyI0Ql4qF&MCCN~5AjJ|p`qk`gWyv zvT_-U*xc0$xfYyDehV8-z&flxM+VozF~IB88Wa?ma-N$Ju=7;jPb~O*iad4qt7*s8 ztnlZW-G)~=MQwv(jaSTRYOC-3+2%zmM*HxppFCAXY4u5XEq|%{m{4;iw95aj=QI`x zISosp8Q1PyFGuJ?PUq8CXW)qWGoL{#<1O|GYN9Ib!*iV4B_Cnp$P72JpTKg^%K`|p z|L0Kp-C!|=X8Z=|h)z<{bId7a*n`tRKqDzj%-zt7prbg6^w+AyZ$67wDv5(ySA7h;JI2D8%Jx~2Pd6% z)e|nk)^(A--*DKoma=E6jnrCj!#?E9T}a&YqI7BV74t_6!sM#YzV_LyMekB&l(F=6 zsiFRR+1exRM4J9ceZS|`T?Fa&-ixfiSzaj*cdkCc%?z*WHcNKa>m*0Mm*#Nk8%D&# ztSv=3-IHx~JPcoOPjq|5C=Skw? zdXxS9Of!*=9#GcK(B{yVrr7$Kxk@>l_n{@L%yld(+`7yjSj~Ttq?w<5cp5$^OYd`O z%W+8IR@-c3HsJGoqY~@e5%E8n8nXzwHq@?Y!+iLm#_kDs$w4^YHsH`?jkVjm;2t0F z%6e8g%Gu698HdyfH``)Hi$gYRmQ$8z;|8Ds9i5S`8{Xv4^n$c^}%o*%nFcX?AXVTteSlkqbTSl=^lY|NCKzQJaA&=PRg`P#_`N3ozO_Q~g<0Lk4 zQS|oRe^%eOk~g>0{<5JU?Le4#rWRw9%L(?*D`Dn2JBA9y8e(Sc**UIr>Q@cHu(iBv`d;%XcR0ismY;Hx9#!kXRP3&6J_ggx*2jT(z)Y9}rZs?9=;#!*I&;!1 zd)K>fnPuxaZ`?}bZ8K17@?#wtn~M6O*r`8jb?YBg@6&28(cpDG#j9aTTBoObuz7$j zr!v?4#+9Oed|ksK$M2&Js9QMtg`l6WHt5DDPu}j$JVHTPAIFcB2Q_%+#91PF63)}9 z46Wjkbk`O7@O+e;t@d32F%2Q?{UHX5G8>xq`tI5cYX`3AY4c0YPeG5WWbl<(`iqCL zq2ix9e8ZWXd-deG3j^@|?VSwzPtNN$f(nNqr>DVfjr-b=qp*{8jbr&glhyD1VrzQ` zU!AjEyJ)*kib?IN>&G|veth`PC2Lfb~jB>bwBd1bu1Zlh?fmiO`aZScD0+!qE?ow6^b& z?>N5JS6!rM>-$f&p(wCjm5S}L8ffVNFIc-#yF+Wq{FrrqnL8f;!nchGTuyxNUq@@C z&BGnW6;B`zc%y$WjYfp0y>b&5W%DDyCB%{~kxo51pO02f_F_N%!%{Ir=9g0}C0Cme zMIgQsip}T)%Q(Ll#3{s#U2@&#N9H*YfskKgi}AN$`eSp{`%}yQ$3tseTLSg(Qmp#G zj>kFR$x8Z1_roUYnJ-<OLfNItjlwt;^Yh6x$iI9E!S53Wo zkbDr5!G=Q~!*cf~(b|Vc9g?&TUk91Wy`b_M%5h_>@OYp@bT9PZE-~~kcOHLvJts#= z0f*!Q^e+5bo{ISGp@*aOyCtP499%Y6bLdVry-l_FA$BhNAVNwrxROcwiZgNAg;4%& z{ar8k3(?9LHeeT)-dL6QQ5o;^s@xVH;Li5^zgh#lOw&oBU{^0P<;135kW8%Mm8@rjpj|)5G*xb zyoV07uHe=NQH`#sw>x|sry}u zz(*cB64i9_+nkTg+LB(J=4fy8a6aT2dt;4-pCsHM0zalpC7#2_gm+4#6<()FmWzq5&O`=9!_b{?1Z9J zp2sOSewZpL_SMz-u`ZY(F!Je(-TFe45$4hfm@TBzTYz4N@X9nXYi-I)IL!`##)p=F zK$>VH(SGN(N&iRDxi~Vt|9|{5n+>f|=`@*{Go7JMxg9o);WQ(SP&wt)M7jK=v2vNP z5tTDDw~}T!E~AU+R7h$PLuC$597d~6a|yX6Qs?*i{tfK&e!pL@=kxJ^y4+YF5IkBE zvbsBdEO)V~kv$~ASt4R5Wy+00SWr6BQ!mB%1aTiWVwP*V0g$GRvZ9;Ls-QFAz;IKa zdK5k5*>$oYY;;7hSDqKk;?87I0K_H%RTr$#dyV=t31H*xO;M-yb^!c*8yKwzRAd;a zLY68mATZ;XQ=Yf^%78q>4{b&{k%krlf`37MI~e5XmJZy70iJExruqGx;E(PMFeQ!8 za_ZM_I3kTDo4;kd#feCmg)DdB>~a(`?sHX5M{kEJeN_BYK5pX+fPK<$<^O=ki-#7w zKiJ$s^_+AB@$-~WQdifEWY%jK-EKuFWs)Ogc|~$}NSjoD^NU!ISBYS+AGOvS)6SBV zfi~|bzQ?)e`T1!_O=D(V7cX6QN#yHJcxxuV2s5NPZR?G=+w{~24AHGrL{D}_!O1@2 zhot+4d&+%LWHSxx-}FvVofP1A@032?yw|1)CAKa4eHfppNav6L2UPtSb>U*}%=cd$ zk-mv)exkuf?P!AmAh7E6@Hxgf0t+#W>GK~9z4-bicKJ;i>eZdmL@9$kFn~sCGh+Cx ztl<4W3wB&ngz2xyU?J$)&d9ZxD~S?h$Gsd>);fy@`vaQySc7aQ zdiW`HLt*kqmGYn3_K3amtsbw13mqX zx;XsoEoO6DCz%{ciDvaYLZmqO?Om)ieoXhdYcUVt7*!sA!mXT5?e3CAvbKguB!rxxfNCh(uFpz> z#yf%Y)iuWw{zs5NzTPhkMJmipXw}W9(ARb?O@WRqbP4tS_9iv>+1zi{6=d${a|XuR zZ<1dw8K?RBjN_gEt#Y|&a#k!#&+kmA{twVQJ!iFKyfkwl!`jT+r~<=g4gK;v%-AaT zei_OpC(?~?3N?x8CHHzLeP9h=%hEgJQ$=Qu$y&?ri?k%zo379$ah)?$CvzEGu|<6h z!dBplDH)fw*eR(wRhB#Nyn2>uyw6}R(z_Pd%5lIA z4eod1|3~<}ckx?fVAc+k<4%mcNZZ4E)Gk&4tJCK$txG#3w|k@2jPfF%+jMq)Sv`LJ z!&+Q@_q28uzFc|^l;!=XdPLiG+4Z{%sBNSXaU3?1zg+qvu%sfby}x+7YrCgNv1MEc z#tFKmhh&82GT;ZD6#q1)mdjn+dIQ{sB;;J`U9Xyp&u(PSiTleH4B%B-hdo$BtexjjM#6ZR<9q%?|1mgbg$jhCbDty>=AlnCbVT zZhX8n+bLA#A$Y;C1Vf<_CJoaa{8$h2e?SQdeiRobqDNX9w&*40xcX42dfOyK>YR)bDPZaXwolX)a^i=)H$6$ly zfx>XYhp!|d>Ixwr+%3c~Nc0WLz`vLOl*=6Y)P7Uj6RgFKlj`%I8OvqoDs65)G(l z+^%&SU|S;`azU@An7spG_{_Pf8q$b*Eexxz>e|QGo=gV))>^$j_Fsu1Y9@(cc%hEuK9isMiG(N;-9;}~B-uSamH5A1b?%H5+&X{*v?hGw5E{ zzfuuRPc&BfS)T6H;m+_QKx;)D%>QKEJDw0#GIi83pzqI{W3ObUiaHkQAOVZt@-)6 zX_mw&<+E^VPKS}g0;)?fa&nRsBa8lon z4@mepD<@?czJ_9ladRf<5`1-XDo8uF-S-9#&6lhMf1K@ zX-`qPy&mKQo1a#R|8NRa@;E;xC6*qtmVDkPOR9ypUI!PfGV`R(zKOt!a@{{%!{!nU3_X&jvW#I9R2rDR;Wq#A zmvw1-@%b=R8D4V*#%B9MS3^jrteHOS;1sGWw24qF zt%onF^Y**owpzPlAOTlH8v2AWeSH<$B5Gn~v^5}e23zsMP=0K}h6~7f3Yu%1TA8O& zU?Mdrw|qqPM5~AU>!V6qSaOj$s{L^+N?&IO(J%|-0ayivIf=+Muxg=Ea*h z6*{Gbn=zR&eX*&|kw^Sa;?u`k{CA;WLKl_7xXQjcJKrDn*y->v`CaPmSZK)n*W0$u9-JdOFv7y-LL_#~-i5MK6b{Vc?=L+%>>)@Ff*4h>)jFPo(0S;FDE zKB-e#DetXaEzlR7D@OY{_&g`%d6G(b*Z!prGv&ngm?2ESYi<|v@MA`7!iS>ct5E<6 z3N-?=ptg?L6q5Y-&)?<}XS~<$yWd)Vo;OC1P{G4Oo~wC$AD3^D=f;k}f>Zz4hzyjN znP^XgupWi)?FURERHy@IZol7dpzIf3);WAYQx+7Ps^baS_DDbPWg~PC9U`_nY6xCr zeb^qIN41td#uny>r`nWR=1Z{aGaQf#Sz};&BWq8iylZNu zg6Q~{C>BhEx_Cvj1&LUlh}8BePwmse=|XjcWG(sD^A|PxTdqNkGYs~?nP@e4<1cT` zKg=8*R%dbS^U7P&K1LkD)*L3#0%A7< zw5*ph#5vcQgOIC|C~R}5xm|bDI`*5SqIT^nM24Q3_jWJe{Lg)gVkaBQo740_gQ0Zh z56)wdkKsu0m8!?)oxkOVfun0+tXxq<>+wfN$)wk$Cb~_YHF=5!4i1LSxqEB%T-?}B zB7a?S4N|FHdWBNcG?Z1>>!05Lc14lj>v1yj2%z~WxCv4JAp_9xL}NnM2TZ&C)BhUc zmu5pAQLFg!PY2>{>!8P-1GSg7dKzY$zcPezn;SYKRJEFoTlk>St{^lX+5oLB=X8a1 zw09wT=yrUEklac0x!+uI3^krGp6g1YBq)UEHA>9d%Yr8AbsPKhhEL7CBn81t!n6)4Up5VR9dGazAmFt|&K*kI8rAJ3!M% zvkol%1g*tB#1swtrd5!^oF1nEb8oj$BlQ^SH}{+xxlPtJPUQU` z(7AjiN4io=LF@uc6}J@T{)G~po>k{T+MT1(2>RQTQ@;k<5`*C%XAyiKc8Fc9HZC6D zR3!-kalE-S=c5vxGVFIzfhCsNRYn5m?7J~$64Pk)AZXO7y6T^{V_}8{jXvZ1RF$9W zttk|^T#ak!oGS^3I<9TXvjKZgWy1l`?54HmDqI?E&BN#J4-5yJw;WHR^Pi%CEd!4% zoJ59mH4&Vmc?cauL*F9Z${|=geoHM^RkgV z2+i@n_SEZN3V2v+n_f~C3?mF#`;duQCdAj4g@d-_ZTYX+St2MoB%8y5 z-agAjStM+4Ks+ep;i%(iQ@xvsp;(f#6^A}i(&7u))T_39+-yQ{*@t)fP=MrZClGRr z{U{*CRh8rqfq#PZe4D?C1s&Jh=4WU`cYZ519Ko^TfB9U72r=&Gra3NANrpM^Ml!mm zCB*;&0PFhOq=27Fjq|5cz!_rF007IKpYp_o$PI4_bZ-K6f!`9U^&CW~q_2MA z@UEU2p6-p9A&?>zijTB9B^E9$Z`c3x$Q3kY;)?Pv4f;{FwcR*-|6HfHHPxrg6g&8j z(^f6;Xa7F;(_1U=i%+;~?=P7eJy}XmA05;w-!uT0NH!{UkDV+<7{_BU1C(J)>yy_= zlg*#S_#G#n%27`TB~Xo6Z9EZkzN$-tGmd8EfN4l89d>{6yMZ(@w{6`YVw0brr?t{) zL9(x>bNGSS<;vXe-FWdSN2uF&Q;e=J2=PJpDJW;N3kjg%tBp~aKb`6o?Wt7ZF+zWi zVW!8q6RZFZ3ndOWy=S{6zj4!Ge5L&L7zaU;B1Urm5*bFWDyyvbpD{ka)dmcng-dby zJmq+PTGH8>uIh$;db{N+7P!FL*=|^r7Py7Cyi(;|2pXD0qQ|Z1k~O}y=hQ*i?u*hi zxCPY(NN-Z}+kwF(S4JQQBtqv7tSN0@cKZ#3nTk+u09w|caUs2X^@++|Sx!{$=UsO4T)+wAn0(2V8E zi`G~YY1;hoRS?`fQ#!R@lF+7()?Te7)K|@NbEI$b8vtZTm6g^c8Y9%u`oP<6$h1sQ zd@}2TF`zlo%hrp>`LxQ9R@-|&RnZ8-&+zng0zx3Zw^ZqCz;QAy83Z50Wl{$uXcW5iQU*}-O=zG5A@hQb>tIkx}##_ z{sYdZdL5i})eKU_x^85EkN>1RUEnK2X**Vg5pMh|Jr)&E1fW!GGjZG)^Zhd=WJf=Y(q*=(rQ(R zkSmC_x11_=U+h6cyH!8T4lRjoW|>w3Er!;zda2f6o3x0Flqh)DrXBly4mNi=<@iSW z2G;eVI0JOESY!3e-#UetJOBak8blIl8!w|nU*T#f4~m#8Zg85gBTJfbecPN zkTvxuka-M~pnOTB*`_N2D4Hf$ZZkU0xy&@7k=AJQhv1U0mEt333_eu)KM`2})*wXP znD;~;DtRIBx}X+*4agdW963yywBZE=r}*dhEi{TB5}^`b9k5VpwazNRY<0E*jS0EHM!P) zRS_pK`Zi4gOxyt`!uTBpaqiV^DK6D}fO+Vu0VI+5-A!Qq*V^e}A}oD&CJSz{7JOAY zt}0#lEG8OWHFE8ix_Ym*=UGz0{HfObMh)W-Cjhn#b?N2o2v?bt5b1s&4~>##E7f~v z|D_KToz7QHbiP}athqWRN0jT_z}-@SgzDGG*wF)eKsPSF3cVW)c@<$wk43!*we;_r zL_{(i_J9A}$4)v^?0FcU(2d{^R~a5Bl$(ZrCTv7pVkp1xX`d^>pXcvo77G#=um9Uq zS?gEsGw%P*9Im@rL_2enxnw45B9qPAd2^-=b^e;4 zrb+rN!2kh1fKNYO3%AEdv#zb(cYbIW^X+3;!<0AV*HBnjm+7|t0)8y$O3IxAvv3gW z#j&H9G_rF+A6+L?ffe8DzgfC^bJI2D#?r5$VF2TTW5(e*6W?1LcJh9->4tQ{uZi2>(Nw`dtzobSrezaYEwNu@HzONUXZb%fU z(r@e&c7QcS4eJNW=H!*aE&24H`|`kU<(2Jdh?jblSiMg-O@0CUVD5;kq;2(^d0Xs6 z61zC}QiyreBdfumodD0NoO?3|_m6zkXdrv&&n2#T%I^AY+u5w$_-u&lwVmo!CYR@# zeQhRoqKN1*dbB6>-m}PXnB!kkr){7Cfr&3OKELh{-%jh=Jyz=;`?Q22`-zJ(U7hM% zaz}wG<0t)$cHSxrTCbu+kF+mD{Aw>NmNGgq)>$8YHLJ zl1A3;FKjkS0(EIVT_iF+9M6=QuEIGO>FzY0uUX-H+L^uNNyGYtHVj1c;JxMea9df3 z$E)%K;7cyT<4~H_a^-Y0Bo*7q@xZ9m{BXzy$cHmNw!iZuQiHVeKD+tsa8UYzMkp6V z>ge5=X1U@X9RRFmyx59Z-6|9EC##t(fFem_Qlxd}`kICZwj%Bl%BN`PcD^&*jYfROoimr5ofI3jf?+YHF8(0^bwXJUuT}~a>Vf82FSlmcJuqR} zvClD~jkxix7I{en6>BBe_1f;~jUpoW|Cl&>DNv5_)f^pbUaoMDrL zllyVm?M}$}{{Yi~2C#wWn8~!svfpiSRks0LGJmeNu8pO~L%{?mm=`*EV-z3moIRYn zUgNE4%Gmp^TlR`Ak`FXy;OmY*`_d2GiD?95AGlDbws%*}Hh*^GZMYkSp zBjK^nK!S7w(m@es_&8Pc5bvyUO{F$~X6=j7b&C&6V`ILV-w~%I1kb!3TCCayk_o$U z>jTZY-7uxdVL*Nq4K)XHdE2Crm&C{4}bbepm7qT#fg7Er{UBldT=W31Cwpn!V+1tNp}o>1)2LY&*_C9-vSf zNM~pZvvkD08Fvb<6LQ8dVRp*LXp!c;f{p)ymzE61#|MRa?TEpwaLvw%PUT?QL37nv z;wg|~_{+b4FhcT}WDj=CjDY;tL9JhVvRizNdkX4_PRRy!O6P8 zDd(h@VSPX5V*-O3OLwVqnE*Q`{FoWvY(*Y`vvbAYdj=vNo=;?I8GQ{Xzm%knHz00I zNrfT23#-+0yCeWN=fq{(FdQ@!gbp{Q9l;*)#C=xgx@jz=B}B7EiUWbfV3EtVc`t3v zCMQf7$djNUP)rt>E@kSNOY4%&6Lzt>WkF0*waEYHX6|bF@LuZhW&u=#Nt_u?KWJfT zSs~2v&dMh_7R({a5ILZxF9aDIlhGw}>HiCzrGHVLmS_YDX{W1gkQlr7#4$hWy$OZ1 z%lKGS`mOBSeIY{w+wB1P=mB#Cp_=5p{AMI@vm7fnAY>(Aw(-goarlPs585AGJ2Xkv zXZ2_L?#2aO12@k~Fv$BlO%grqv4Byrvyw0Z3T~h4Mz($QD_)$j6-G%m2QF>NxsC~$ z@irJieZ)*;Eqw8R1n*2r9{46-asE~#P}n7c331eZ+)gRfk?D|g-RbXbfJAs{biGZ4&)*cHV*IxT zBBA+j`v&k!4mNOtXa@qjED6d(;ITKv9uM=QCCy|+Dx0yEpQaC$%(>3^b#lyJMG-X< zt2wbbMS6kixzdHo@fWpgR|sGD4(kJfY2_X|3Fwt&@wJmJEzV6-0VeMnIzRFcLK4P% zT5j^v+p0|r@VLTm=nVaIKu{E@x4-x7p_L`cke?DVL{9Si0TQd&oT0-ZdfJCEg&j)$qq7M~34e2fbYG6An`NWPTk;8plb(kOZx2${& zH&tE6>DhpY{3HJXM@PlJ4uh%0Qy#8@{|S1Bs-fJVd(jEFh53!?t+`L`e5_#NKLBc@ zTi(E{H8fP5!tOWkRkdrB*?CN4l}PrV6KI+uW4JTYUu?6)v5E!)3H#s$UiNRNf=JPI z$vzPx*hoVCvK&NP+!=jRnqJWmSeX%r|ug#m{K1A)IUUpa& zbrX{%aGoD(B?9z;d0BKsO`z40pC^gsoR&@IP@*3VSSjxYH_W-6$x{cYKAU7G5?^lz<;PV-a^h6Z8xDs0KHfsjH@_dX`(ZDJ)&0$kbIam#Q#f-Qp6E0X>xoN#pD3$BYHy1%AmE+i zWcqJ#p(+kj8~9v-BzBY6>SvbYZ-{J7TS(sR|$?0LO!B1yeiX13TnBqM+I z18ALnC`#L`H)8K$3b<9AB$Yicy%(EsG?gVnu(>gsL&C;GHMjH3x(uE6-srh%mq2>>{hO+(IKa(1bke+|m=v zg@kk$Y8oYFzO#M`grp1*z7o0r-&Y46k z>QM{^3^R7Y$2r)ssTGLT(w02b_*kv})|<3wo1xZysn@}P=^LRnoLJ_5lw<^v`pnQ_ z7-X)<21L~8iwSkw%hgbOV*aDcY*~nO@DG-Vm5T zO#18H$b;z-hXhs|gkrxUGApOQ&^H7P#T$VV`B3iccnMbvK}WgHdO5EtfW#S^*MdN| zsZ8Yak~`bay+ViUD?kw06pfQFoQO^GT^kv0GY!js!xPxFOgN8C2WlyG>@X^27B5=+ zfl=9olZRHsWoJ~iFk~)Y{DxDN@*!~ryL^|~G|tyPZGgQ2PLWo8hrM@iX>5Y#7c&p# zXZj{gvXdi}m`0G;v?w4n{UvFeq!fB!mk%M zp0%tPM{7LLO#9riLDxk%G7_ z;MW#)G%o>L80B^r`Sm^xQDx@Dk~(c=_wUXO5*)2_ouzU36&B{-vUIhJEdoCN>ZL(&3(}Ylu8#1M&O4x-%g@n3Pol|($wM|XuVaSvR zd7*IIaf2$R?s^{WQTjrW4Rba^$3Via>QxFvRJ$O)Uo$~p?!QD`b+vPOR@{38@A z3=M1i;w#1R>J)59U;kfbXI!jKlsKjy+rK$TH#b1R(?}ZNziuLwcgccMh5c~ZZcsr9 zYKxbvvn!ZqcvPTBsDX>Ee~nj}*1p^#ux=Mnz_Dm82fvqUxhZV3P$Qi2Yn9huXLmnPN04UrdwH3+ z$2x?r{#o7r6WWS{sir%`y2yUn#^^-7OOxyD2h|rWDKvk6_Vph3FG&pEwvNNkB}Tt* z$xH+`Ab|7+&q#m^^}m z1)cqQegzFC`6qt6KCIkWt~w+c2~ai=ad99E^-^K4Jx{?OfAB{)WEh;*uJ@OdAVpi= z@)3RgXZ=PwhLlMJp}$C%2RBJucGC3%x$=nUMA_o&Um!*pAxh4oWdzKgat_MPeN($t zhtfvs>a~vG$@iiF{f(te(^?r(J>{L;aueXiPm@6$u-+Mi!%h&HS8O5K6Qtw_59Q`_ zi0GhITXV%$?Y5qV_m`|B>Hl0&*DRL@3Y98oIrc$%G?Qu7hP`Z?zDH|csVdymZ+in@ zKl{bsCfbd0@97k%(9dqR5{#IHjod^B6K@)YOu6vf9@FdEpbI4b5naT9Oik{wL@45H8;Rw+d(4x>fNN zI6F{!IKcSD6&GScQS%2&6Wj1S<-KFMkC7`Fp|7w8Z=i}9`2&!YmAi_-c+6ejp7x1h z1G?wgbaLd8HBTH=I*>)zo_zpfRcb@FBkZCtZrb9)&f%guo51C|WDfbBUD5|kfFk30X8aluKK&4cS2{vb6KCR-x<#hrnB z$K)X+wGi~rLMzhf5C$852D&SNr~BsmxvolHNZC)thdb%BuPVx?sDJJ}pg}^qN`c~l zU?~9>8f~Q83K%`P=3>^1@N$C&7pT$;l{uZ)Dt4Ws?GcmS(PoP2Pnv^;r9O*hMsQTW zQ2mf}AQK<1gKz@Bd39w!8D4|g8{n&*3wU1$nMe=kOyRI>%*eC4*+_S6I-$$f3XXnc zlct59^}~l5C|2K>cQf2WS^u!>62-sDV_$jBj$G=LS}vcv7$!24;2lXs)2zd5Pfwwe zlFe^7;W{nZVQc>NmmM`R7o|fF0p8Zw3YQm-Nxl@q2O~23Oa@e*KlJR~L4XlGLLoRY z{P`?!Q#MrxSFqBOr=&QJ?y+!hfNbrkobr;xO}Dz-y9*O;=>D0kwu~lsV_T{MbzhbajDzx`(MtPAt!cg+z=X$W+HOBFZomL1<)q zZ?ru_v5Vo*N@8dtkzhaPJZlvoNpNehDZ3v z(ufk-LtO?QDR~sg2;;sjj%DT1waLlmL?bQC>MR|NM;j1wylAJ`A}V`{LIOma_j*K= zma97tKMh`<>MnERw4p40p0Ok3<(}Q(N$86}?4{E^>MOgP7Oi@|+uoowk5HVJfw=X7 zNBKD?mirVadyOQn7X{Mr0M#__2GNeP$89{}zPTx^HjYQDP%9=sKiDoM&Kz_s*e3FD z7il8lm&mRpY^5UEynWEVsk*j%RA6|{mngft_wOdX*TPtfA}lQesEEvi;NT-3YpYf0acc^p z225S#wnSiyoG*h1;kG;)o@|rTTg;%XeSKoCbYdpg)=>NxCpg_Q|Jj4gK!z0pM1Oyq z+*R+TJQqCpE&OR2v9Tw>MLDqYxr*=BL+tb+&JU+rWE|fkPh)T4i`V@tO{gqz>npeu zxGOUS>@G+8Q7{X`-+#fJQ%WycDn6pT zt^4^exxXQcB@zqc*8M^tylcOgeKv|%Qww}fEDs{#Dd0VM-H%U0Jz1IQ>$_y9ENFuo z%y@tOcPy7X1bV91z{P~OQjA`ed0pDJilX?zb@5dPj%A~M12%C&gQea9Sx0$xOt{u` zV$DAuJ)@b&>(S-<(MW9>Ytp=0k{>${eES$9*V%#p!hwBqv52JVUz68J zGb#EnFmsZb0g(k*0t=+?FfjU-AdYTBS$kr(4f|Q<#9~x68`7!+gQpsPvew^Hdg9+| zRX(2z2KmClD(&eU5>W|0TRnoJd=V^n^uG>PlQy~XIE8Y&_zNPg10D3k$~>2juz0&0 zi-ITM`-{C6@lkd)vsDydLwU6>z9$|D-d;YvAtdHjWuj}j{y1A(?UiXm1dGHP4Lr?99 zHO<9dVLqq*JEyj-OLo_eaa@d^jFGK@IEdg33(Cc?fjYAbj;V1wBK(Ee&A}RPu8zgN9^KET(rXuy%3KH zMf&cB8$qe!`K{p9Xl5W@4_0)Vq*8+sFrkLf%-HAqLsK5@w9^kpT9V~5M9o^S_Gj{C z<+@+_^9(--CM_u`Acn7PaX7&V>tbj3*tce?JnOq3q-N$zqbg>WUy)sI}AkO~0NU&+gPtS=0?cQP^@ZmEVb*~+_? z+uO}_$38H6lKU0}EuS7nhB%$SrD4*{-PAqjEEYesYP|AKo3D*zZuonE+G5Ke zkBEffzXkNadlW{^@Bd=_WFG_ehE`r1TclaKi7LMrOe%GXpt*TW&)2%8jt0YQ#roe2 zJi#%h3-)ciB4??%Fz7m9{DkE4CO?8;$`w%^j3eC}9zFV4B3T-IpTXRj;J&Cv;4y!1 z1lf5E6(<pg$8hA!;#=2v-xTbnu64iQ^sTJMW}_)3 zpBcA|S*aEv=QI?1S@}MyiKPc2)kz;R3FT_o=h=h6WmC53Sx=4T2_Fk>MQNlUS+J-@{`c zXt-*!21wX~OLcv>c}Y8oJ-p4&+H)o-I+wOXTyZ%*y%~T<{u1Lnw&3QKD8S}#kXbQd zdW%z5V{E>%TnwAXj7dxC$DKkuhSeh) zm7cs4=+O1=KNhHv86?@UO`#&@@r;T;(*nQSYB6`Gd5~Y@nQSIVut4BGF@X=6zOLBT z7;m@yjF-u8BO{`^d3CzSNKlcsamJ6TLQ_nlbWEe>*z( zx3Dw_t1aFKMYl<9wf4UZwH%#wB`4xSNVb(KP-78cczN~8$E2MMlV16(VQaRQoxol< zY9-Qp{^EI~?kbW@PLfVc`GLc|Pk|~Sr1-Gxr7$nq46iK*N3MO=0jDX>qNXx$k{bMr z1mkjUWGY-*1_Ls<$|i+IYT+-9+Zvg~S&(Bz(N{dATpXHdz;NK^(k9$ChP#vomBXDS-xS0M#D-Ac)7o31)gRXPWyPd@-lzUBXxp& zhqUs>m_B9k0me3q(VI~GqU=rP;h=`-;g!lDtDa@(oN`0u?|SH38-|HU5&AWCEE%{9 zkz8)>e3maAa!S`=YKCTScIt(4;89A+lXQkGu`K2M?>ePjDp z=LBVpQ|LlzWC3xHN0An0TL3rLp=bz7JmKL|7cuSI=>h7M&CZ+|iM9C>HeO7faH>_7 zo@4{eksxzO>Xl@2cvQBW$4J(+hek8)lymF;kLw16xuENEXP_RP^nJcYoasxa{oI+n z|JTrc8P97cscc5SB|#@(J8afKmZCc$Q+mA%?#FCSCk%*uY&W;K64JY6z)rW8K#seK zgkV(LcC}rNhUFoSIdCS9j4o}K5}07L@YwHbArBA4NE_+q8B7N-Xh8n{#IFvD(SuA$ z@f+`J++SXHi$^6V?Ytrk+rx%(H>OUHW`=Z`B9+DHttDI|QZKpIuI)$4yCRgOM+`5( zuT)?u!GT2YGiQ{b#+Dp`F&WE)oQsB=+c~1*{G}C8-pX=^+1X~mNQ_})m!BW-d}4MQ zfzioxhJ?yvgi8aq`G6{nNF?jJdOkp)y_IiUbwXVq3FUW0e9M z*&9KVycry3AnuW;{Wop1sP!$U#|T)XwnK<$xUQ3)RmV^N0ie4!=yTPnwjxIjkEkWO z;!4}eJsT~)Nns0OMiWret>7&kyny-X^BRqa@oR?eNx*(%&H7oDW%%U!V7P<)2Q{01 zt#SY>3?$-v0WWlxdCdwmzizSxtzc-0%RME% zYhv4cDhknfEU?#k4*sS)ial`L%zD#VBLoHE{w07HrQ0>)AM>t0_4=29Tf+zIJlodO zzXT)&@b>nr)F0-O!w-%=N<+PEU5fP?7%07~WnkiH`g@ZKDO4|33ltff=D@yHF-zml z@E$0pp-VYMRWva2lJfaJV*M8uIYr%Ro*z>S$!>YhCxq#xOC7{d!$NJ*0s{TPfT z$_~tbgI6Q}9^$hE+TUC{ z%e%vZGokSYA4HJN!)cZf7d!GKrCUpGXNBjhF@BEG#>7MUIX*oVYn}g$@#XwyDu1Q1 z^FI^*LwTx8)raI3MU7hu5t#MVLq2Er7(Pn;UnDT14%h^S&lH~x z)C*-H1;Ia%{~b-MsCLoO#>YWH#sS%!KKATlNxP7L(BV`-8JRfMUv!DI_D86of@m=B z1B8yjSA&Y;}PNL;IDF-V< z@LxQBESBUvmWRQMHW$<>3?Q=cs0(7FUahk|!|zywN&acMC1o*v+lJoS$~SHubzJKP zi!-ugH-VcdPgB8-PQ%(+ABF~C&tY%r)}Q<|ED&NC%C&yLKJ1x$y6hcYV$0>7#osf2 zckuK(<|SGd;qy9mMPA58d)S zoWOPMh8kbKOa?2$+KISpd&(AO4-&{)!8yHL9w1THCHW~oz*4nmr)InXP_=jsz~r3l zEH2wi)je^!yo%~Q(Xt9%>%Sxio8g3e6CFD_CVMLjbvl}rE+t6f?v{Aa=JA;@JXj<# zALgZh|0x5JcnS{Qw3lwxUkNI;<&T1RFs>i`RUs_cRcgz7#mXxR7G@nLfo!t3-*1U3 z;IIjb|F?JJ9Jpl?sx0OF8$WFXht?bMAMn$A`{d->GIU4EX(R=~rDB(T(M z%|C*@6IbxdWoLDqo@{lVMDS9xamKwV?>S_Y+5TaQi@h;e=zR&{>&7Oys0KMI;dUKQ zazxoF-19}PLtU%l*jOeCb#!>ZCXEI=I}84UOGy&^+q!fy>W*ZtYAJV$ljfZtSQ(Bn{H&uMtnhh|D-?&Ewg zx4yCNe`t8OO)wKQyx^YE|8=?`t=iG2$zWw-wpu1nqGiVM1O2%r2vZRarpyVZRc_;P zAI5Myc4uTzi7-8ndw0zkK0)7-23(<)(IVlR8TdG4;)#D@g{keFFoR(6jU7 zMW{Cj5~lLK+jDGEKW zuEG%y33kL2^)F?Q#)bBksgYEN4~3m(Ql$Pj8w!ztQ$KRK{)XEW3?9EKvqRk^QiGiw+x_3^l333+hqF@c}?Q{oU?x)V;Y)?fvmh$O?R6%?A}O~I%;X0j1#bl21H&a>+_V*-AH#wl z!fh%oOvE?WoYqh=nG~|mvES@%&Kh#aG^c^>Pos=lJY3u&bjLx+3IloJ!*$nT!Mk)Y zGJRJ{Ha9&fP!lm>qaYQ6ro~!R2}2E&_cV0sH{SDN?tXX^kDfjV zgPW%5+3OgJC%mI-VGG?*GCS^D1jH=Lc#e-Sit$QeK&kSOd}(C1MvbwRQz&#WAXi|AMm^-L0VHL)T3MRP&QxsC}D(fxfp@aFEjeaW`UUwhDlUc`9d#XP<|zF z70TaGE>w>EYZ$n>ReKUrPW2V0b3sGd%jmVVT0$BEz4Dse^U*OAJS!f^u3K3C&gwFH znpT>|gmht_g8gOf`X5GxsMb{1S&xHN^uPJ-Wvk^4gSAod#xFmWU)kJ(mYzs(9t7lR z+Tp8PsamR1?|xfOX(=8S_Nfx!zPy-ThJRZZ(W`rns*A6)`U2jwYk_}%mpuP#g6R;p zSS3#!ack&IR26HvB%Jna*K7USud>>c;@jG4BZ>faZw)+m3MyQf{a?uAy5c_kM6CAI z(3>jcCC0|3^%Zbxiz-a20HR6@J+7dJPv!06M8+<}cHH+O>{Xk((wga+poT&MgIiuAeTm!)>2+dNcar9}QB8X*9?_O%~z zy~o3yxUz-{)3o^04f%^JVCKy*Mu*b1hb6@^QqF&SWoc=5jci8w1*!q6;};XA9a9S4 ze0^r-KdI}x`M@)?7u)z>Zq1Fx8b%n5EmtnXP%j>@g?*4f$vIJfTLWVnIj#Ay6K*XvZTn4G%zv)wbAx z`?>soaC=E_g}G^z*^g#Cv#;qB(^b!8cVXLu1&R3VG2Nj-x_38C zHB-lLOugQ_BgM`}qv9#t!z=d>K3&NJ55yW^Z%lU-5}9I~QF3({8iGc5I);pw7&?>) z*-Hcb0*N7Pn;>ps&Wi46U)y!0Gnq*~Xl;FeuRFA!U-`*FI?A#&B=EuJ^XA#0kDUztJW8m%ej|U7vX| zURF&X@e@vS7Ea` zM8a?iBLU z5R?e{419|Hub@T3YaDq@VLVpd;5!XhC_+ z22y=TNbe?dlEk?n3_?@7JZCFGuVdODIhLx>JhswF2R?U4D@vU&GPgHU8sH#pMjnyw z&FS$V0Wo(xTM}E2%afcD`4ExAs`E1)R0C~I&(Egc^*6wlI8tN%djSr3<>JNye-uML z{v0?>h6~G|_1^zdwIPY0lGUzO{45DI&3O;6b%YS!p1ZE;I_W{GWZ0jVVV?*hYCOhz zX-@eanL8|DU3Bk7s)SSc7*wkz#~6g73Sw2yz+XJLRby|2U7;8B*Jc_s=gaLkjQLdzohYaM@z{h+dp>u=Pi zdG3It*kF70SG=7r+uFtdjTg&LjoRadMybb>y`_(hC1_$#s*n3&ZpuITU}wgWg9NQM z3tyZZ$C>r9vH#+2ASzP@vR`vvL%f6-sTy1NYIsOPjq{u4=po-&a!kObG_$cGYB<#Mj}b?Py0x6nJ?sZv)}sY5A~Qfwgupo1t}jkX6~>O;=YpR z{TtiNhN-SEh#&avx%&yYbI!WO_GXaF-`l(@9jbNjTiW=3AItwzSr@;IQ9d#6aCZGu zT-_;Fx|>;P927ds=x`AA|2L3^^oZ$7>om=yb;uGsobod5=M;DD!|}v29S<$hIU@&F z^da{s_{X;Stffs>fWfd!IK=eb+mfee)_QEL6MvXbp=5@C&umOl_SxtRn!;;sbFz-! z`}xCdKfRc*uXk6Cc?NscQjMyJD6K zk_56DZL=U+7y%4>Ae5kN>{^M79I~cNQ9Ix*JHrSgWjce{sDw&H5Q7UOfeq?TlL4QR zp*+CI{^Y)Z7hil2uok3p3Z7Xz*&SIUCJ9-FzE!LgqkGn9-lea{SGT=uP|}!s`*UA{ zjjgRd(Z@dWJV%ytz;o+0V!?<5!rn3J$;n17D4|mAP76IDa6qa)!GmSQtUojP-j3F#fOp?d%Hql zb8>yJQ-8ZYC3bvfQe}bv`OmZEu!Nq^5#aLb|M1I9UWeC{)E{SydK-gI0Q9Fh;IY!B z{_-xrrXDp0Z>;o>z()~hWQa&zFs^{-$BAaBYO2fc(>}TGopE38Tx0ZTyPF~C6cO2F zb<(Fxqthh9pw%abJEZpxhtR$$X#Hac5&w~dA&FgmpWn1bTVB*^|A&{q$kd!Y{W%F( zu7LdtF;9L9DpT`A6#xL~=x>t?Q8)hlCOOuTQg5wal|mk$hnnQ4OJ&%svg0`i(tJkicv{?fi3n4h+r!i=(+@G0|2 z3FR(@tdFe*GQ;goT`siLaLHfv&~DA?MVu>F4|iD+fz|Kt2I4;mn%y+_M$;x1vNm*RWmPyQGZ(?qBpa%lweDvoGm?(} zYyK*sW(2_WKt7oPM0LuR^wj3@O7jzDDBSdNCBUi&v;_JF&d z1V)f8E$f+t8ocs=3?N;5%sKIW?(-l7P!V*cnORmlE`-|ksyP^j#A<`>&9Ox$O^USM z55s3716(gcFX?mxL_IM24h zvwYM*yVz#f`G9OsDo(*0V3&wWpL%^v?J)@zsc^9(J6ALdOXDSi5H90pjxJw!AlATqrg5RPC?QZ}cjNSU zVji2$3QxDsRRgzpmLHpf+^~k$f=FDl{p?ysoXBoewD@O{AW<3X6!;IA7eQk`TvV~C zIsIa52-Lu({wu;Zn*?Hsjs7LJ6MEwMXQ)lV`koWL#bw)Z<%jmVvkWg6pU;>Gii{|) zsvVv1QBHz2Xu>6-qDFsQ7#irl^SIIZ`2XN^Kbwo=Jx5e%guwu+^&o(J-{IAlH>v+` z!ImChRt{IoIQ$THFW!Y8bjfYao7j^`tRBeLfXxQ$yRCyaj{qtiT@Bwwaqfd`$Uk<- z#Wh5`%V&c9XmQ|5QkDK*gaglhPaFfXzbQ|Zer--c%|Qx=D8@9Z7I#5V|D#Di1hh+H zzs_Wan`#b+^y-dpn1AQR^W{}>?hx-D`gJpFX zaHhfLe9RIX`TAB`1rxIO#~VzO!Zm3B1quffT0Zs>v+GbJK=$f|UJaX~4<4OCqg|qb>6rHH;6yIG7!ksas&c(YPM5Xwp}ZvVnWesq z9TOr`!~D#fRJkzVAbf5Xw257V9D4;Jl5G#-w(*VpUuzy(L~09D%#8N-YQG!sXK30k zuC9V?;5E9VJnf)lO9s?XyxxCP|6lM|&Qd<(v5Oi5-0vz{!xAgYc8xdo8?THeCij_`Ycp-vbC)CbBSPsZWG8Nj@LH zJR4vgn%&N8K5ul-ZbL|SYSCsD2B3r1V(zx?T@;g0+%6lcQ?p_H-PiSz3u(FS!Uj~| z`yp+UYog5S3YDfVYgmNAdfhsWV&e;gh{Qey)NT#ZtQa~}!j7H4 zS(?9nc6@xXTHb9Qqzwj_g=8B77cw*Lqd3MybNHnm0fYkr1(LiVT?Ff{Q$n|az(MUg zInPy-E>dlZXy%?1gCM{H(O-|O*S4Gm?_XcR{%9C?YY!p6`|;(0RkHs2l2zoN?IqzSyBdvxtf>+8(?zaNrkn@zJrm@x3@u zgnKviH+zzF1!^2)=8S;O`Y^HJzXp;w0}3Klo=gyUMpUB3XlwuvA|)TD8*G-c?T*M? z|BB1)&fakb-Eq*&@~*YAHfahRWrsJZ>n%0&Qdaeoyw1ewWxSv{ zdfQ1;<Iih+Z}tdf$tkYe+D=`WTr03?t9#z$tSRl7f}fn>r>`Q zr0KCDZD3CS@W++SDDcbzH@vp`0OWm4(HT!;6$st+Vv4t)=rfKvCb%`mHpj zr+!@vrXFd+@%{_^ICbo}=0z1zoH+GM<)Re9By}olsxG#rg;&{2HgT$!zv_*AqLVP| z@`XxgHnKm%Wb?>C-Gk1kb50bIGb9M7!F^bDc(HA>{-uRb^ToDRhVKRb!}R$37`wL< z>{0H0-}}PKp9%7h(Co5hd5b!Q(V8p9n=DtAtNAuJRQdWv2lGD9nZlO9dJbY&>JFEu zhS8GrLwZtjvl5(A9~6b6I>{*!GeZUTsGh#W9-s~C+<*8Ar3=*I#Wi@93ZPJ=$ppj8 z6~{M!GmTHe@*IQMmx-h4UbKO?|L8{DPPTB9j?dY;;)_I6c?;#f9wbXw@q4i^SZ?;q_b5HU;cdNP@b%T{VmX4Ap$BrseO zc|$e<_DC4@VtmW50q)U=tEl3WeBXod#Sn>=fCU`y|5u-K#;Rl$9fO;76lWoHZ;3=2kq z$7-Ae7nPzeC5rEv?8_&Oy#|z1RLLT3mA>xPek&XdnL+U5io=v0YDKYHN^tg0&&~7erNN=@XORm=DD_s+arkTGt$+pAi z0ao8J+M9II6Z-k{ZwBDkDr5qUPALmRmwiEVq2B^=C;mET^XnTOTJYrqhOItlxng54 z8qFzi>Svc<(}V;p%M4e=_q7+@v&pFt#Oym#1>%o zv=%z6#LHJIBMNayr_yP6ZdgrdypkuV2c8yu7n%xNpnOA@d7&M9+v@dn(9~FxcCEc| zWu+W|G?#vm{^4m!8y(({g@QA!$~}u5v2*r8QXJQ?3=1Sx?X)?JmKgbSmW3;GU~4Rk zYo^VHV>5Ho@VHpmSF*V=CybRdEm(f<5+F_!ePX4cZV%rqCp-2B|Bl8g8IoZS2vY+` zP%N$cQQLN9^}8lK)=&Rp>Ef zTl;;SK<%VX-#GYSB)R0Xvx=hdVABn^Pw)wlGM)N1HcpQ)6X9#Uga~ZpS+e?6l8}Cw zCl)yRUFO9t|FET&%^Og#kmATedwxWJf3`Uan@c5jz-i0Ia$_1GMP0a;^XA{PW#JCv z-C5;xCo$nv(UE16;&zR56dWWZt5kbUY)pq9dn$YI$=Y_tM-i(@l}zVw!Cv&B>e#W8 zDT!ut1{JJc0XZGmS8+Y|?3Aj!x%9&@B;kj-4X6Kp@Au*uad<&Eq{E?i@UwAf0iLHu zOZEBH6p;{X5`}MgOe%O%Xr?YFk<^O0zpM2yB=RZ?$28MdD8(23DOO+zcPkiGHEcOa zZ}X%|R=+C229^;Uw><@7((C~>#|(+-9$pDATA8qgeG4i)%2IPV@jNeWIIDfb{Lnhc ziIrkmCvqvjfE<(+42XiVvsDd3xJl#;rCRoBlRHpxK8n)wJYw|0oH9mh#`>}}?#o}O%Kn<)ESt{hJ$t9S8 zM)o~*-V9MuJLfGS`?e6$i~jTM+Y!JyVoYFv-(!^)#})8D6swT%p2_W&fmLpD9%txg z+M{bCf$fxQr|`n}(p}fz!E-$Q2S7!%qe89Z7Q$DPm9TMX=aUcAm8rza6B0Od9IhJe za=J-lk;BtAU>@}LD4kFKthb`%iTboUU+E@xIBb{m;tqyl^zreuiH4<$5L4rbU|N~s z#fWktT~CzIRrvqQ#FgcZZ&ld6yHFV-7)!YkJR*+6({r`V%Ru{02!?&2l>6kb@~6dpu9PIET1Ti9ak>aG;ZyHLK|{MkT2F# zf@VJ_?CnA$l9Q9FBR;xVZ!4{-RHdodTqdr0-LKrC;$|F7B7ug5{!rac{9gz?c(MDp z%_*YDk_ZNfBuly8Yc!j<129YHF*PGBW9ZtaVK<{V?pf02v-*osaF_}US{(Ae-a>Za zJpiHxW&%LXBqi=p2|$s@}ji*$n;p}=Gv*rE0JRc(?bu?-vsUP6qh z+7llTk4P2N z|Gl&o`eY)P@Y-VDW-D5kBW9`Ts>R4QKuRW7+vmjW!$!0eYnZ?ExEyVg4$^%LY8rn` z>@hwr?y^tr=SW-Zsj;sz?ejPSN9~Rh!_Pdo@X>#@LHOt|8hEDlD2LO)KF?S|P333V zYBmkO8~9<4Gr(Cid!R^C=d6f>&B4|Wv8$b~FTIVy!>N)qq#-hRw0Yj&{wo3Wktj)W z!{x!9iIl~Gy_!2NNsm@~FL5X8)J2eggRH**Vv5)6cf_ev9+y}iy5p?>(ZXyUu^re8p!aqjc7OABAwBp7AL8quAnW1 zwc0Rn%7HgYPYg#Az73oV_GLQKZK$h1qC=RI=`~;~IG*&{3A7q4aEYKl7xnzb@hdoi zV_+I=UVB*hHkbbE?+U{L-@kG_2Zubt>)U-g+1!m@zDVe>?L8mxYXZP@m|a(}`fS2v zW-g6nHCA#`4fQ@K^P{I^Qrq))iH_reQUejiNabrgZ z2BJSGxNP{Wz}U#@W5A9xhPQ;Mt1qrymrQ~2v6I0EP^PgoP&(fK}Lk zOR!s!9~hi*J>y98v|J`b>av3F%=*@*#4dsAeVNYP=WZ=Y$_(d(>SBE1!LmC_Fm5vA z`x{Oz4EY(^a`JR0)3zrWyqO(lzuc0J3Nu&tLvH?45u0>cq+P@t=zIs^%@@@jOA~Oi zW_+_uR5_q2_KU^n2b|n8uHa_#`M^A8x_tp4NKT$+ zujH9RYtRb0FfL$sx(%AUj?5@KfcV@Q(Q71K?|+vV84S;w0GEXSfUTF~FoM*;?H3FI zKIBBFR6ub!Ku+9P55T5%svgePJ}P{h7ePHRtCbyM0B@>>udTK|umAd{_(CwK;EMLgWH(^E9l&R+B?njw$wf{JKNVDbYXOi7pAS2Av zcU&t6RM0s7A1{!2_{cx1^6AHnK2nj5;^qyvl|4hG2zA6^l7#aD)A`SRW9Drmp z`e(dwdHe{Ba=GHnO^mak5hE4$@x3)sR(;~~AJK=bAUu+v_7PuJXyhbajgaXsv~Uxd z@Jdpj=Tf}GT~>)GK&X1f@D_Fvj5=hEiD}|{o@}-lyZ)13Vq1VMSP39^5A$wR5@E`; zOj?2wh)ARk1u4e`shZlf__Q8%P+%!nzr)K!N4c8M_&@>&5psj`eT@EWM%t7aF%(c2 zpLr3^#;S{t@gNl#glIAgyn&-QWhU8P@C|din;av(hf@iLcfaFuC}AokEop72%V|%c zZTO%00IbjtWX7xDG_6bH1hf8$mLL#^MNfFiPWy$r?9cY;l@(#OPwdIE+_{1jcAsqSvC zP$Xbn>e(?}m28Z&Li_*BB!!*`Eyw4rly^s+lruWw1_E66^N;(+FjES&@||*pu-%b{ zEnfGmW^bhlv<>S=8;=LWBDkfMM017G0^VJ!%na9=SXfj+(p^iOJ`PKPRBfMAGWjH+ z-OPJm9{+C!0veW<2Nrh%cP`5RQeowZ#MR~W&bzeb7@hMGsQK(`vRDfnmzWfk7!q<) zCSbzP{9zAqQ>B>Pme+ku@6sn3rGrXcKdtvrPQ6TS3f3+fP)4(bSu>#W?ihle4C|u1 z1*W|;{mn$@P+AVybEkh2#=b;ntuHKBP6OO&SX8XkK!?JqPn6?*iy`0NPh>o(My-}}|m z>lGEuDG1l5sguu+c-jh*TVD)RUaNN1g$@!mPX;mYBRS#R!DluhACTGs37*RESi%JYv=(WDtktuTeeHBptcHQ@w9nnpNUL|w1#>AG zZ2Y;L65%5&DB*%!(5^9cm5aEgX{x(`l#8! zY&BOY%QruL)SD>n4Qfr^uM@N?_29KChyL*#Y9|fda4RgMUq-+8a&6G}_ee~>`>9xWKN-K7o;c-6s$x4Yj&QPQgF@){hd;SZ zm!_WbM4xFM7qATL*`C42r$r)hnCtqoOtew*4knA^^!7U#ri4J_)!;`rADf$=0hR{h zH_RZzygro9A%LIYQeQosB9ll{mu3!(ptcEU+R)NdNAq1hEdWJA8DOhwx`n?&CfeO} z8{Y7!GM7vWXdwwlY+oA(V@AaNJjY(>j;`Oi>4es~yndC^wh5PcwAkPOI5S>0D<@OH zDSG0r!_aHugk?~wMVggGR$G#jqcini^@N;swSr$bD?EUlm>%S<&8!c&2Yx&qIil^( z=mZx!v;^7PY7It8oQo|;D*v9o(1BJ#FQfcaJkeVd0JmLK11Fv2Q->q~T|+!NJ+NG@ z2-hn@Y+oU2&CdD+Z5^4z3OwUFmzOIDYbFU2@(xTTNsF@-m35P}XVB=>wYrVl575d1 z!&Fe1q=?Z>OiCy;uk`5T0S|-FJ9-w0L_{KHJ^r;fN)VIO`5QD=VW9rCQY#%eVH)ct z?7L+=G1BHU=W4HS_`Xb|A<_;Ig)MfNh2rs8PY&6B|1)n?8?YrU&x_U0ytSktw> z?GtsLNG~WL&kQ{~yh@!C-osz-w)cQ6u0tuB7?0CL92fE}pf)8~v6a&KN!8XcB32W_ z{zOi0F=st$uxuQ$Wk-*|t*kL9{=#bVlu@E`@^h+7X#xBd6P1pPllJBKOdb|EJ^{_1 z&=#k(oe#wgmPhNPXUcA2JS0SN1~OUe=a+*{OWcOOblT*W(dM|91mNK9LvqX31hV<- zr)DuZj~P-j`L?YDGCqm_DF3*;Vd013Q6ri;Gwy06M^z|K17Afp$6hGE(GV|7Sguk$ z%CK+?l)i5JS`m(Yn0KwcN%=(x+5^`vyKB33#Cby2q_l5SCj-15;G+r2Joim|D<%N$GN9W%WZ*(WHOlvjK#- z25dhH(hKMm8pI6*0-+#6O75I>&pf$ZpXRNIpBV_$;cij&Uu-BR8I~&EEZ%?`eSl{u zviw0%$#!>_Kn~wn3HhfYCVUW_rqLT&-VFumegrD z0KDyR*o&3r4Y2xh3Ok5!=lG52YB}x#+g$q2?t^~_Y>@^Sm6bt?_I|k(j%1o4nb0tR zG`pFSe=+N(rHIk#tR$N~p9A~MXQYpJ0M4N38~3h{PepX?H#11B{Kcy~105>M8MnLB zsGIAyvTRTdK|MHH>T*MB_hS&NXW?R*ZD>+41u=i8K-e`)7m>tZ1c&!63_zjWZjqPGG8 zzI>L5+ZYtfedGoO9UAf~$DA2oq9$OHGiQ4sj$3H#=|%+Mci$`$+mxomeZ>%TPQ4ZF zyn}~#I?!&|@`GHnE$;MgeomJX(EcMHFA7p82fjhos>JXt@Ty^J9Bz>S1~ z?z5(<593N%VGiIsFmWKEdy-x9cciw6X$%QyZtA-3nVUpj z5N#9Tb9}z5Y)^gBx4m=BmLsW95TIPX4B1%D{<&|1zir$|U_Qe}!n^t4Z@EpP^~N=| zKsMcTXp3$b^35u8&Cdiy9r3seJM&sQq!}OYm}>kjaOA#)OT^6d!47?6nu;7%gurp@ zj+WMRheeUZPt134_*ze8EM!acn#k1XyotQE52S-@BqYu$Zq3JbY|3)$TGYQ;i{!%Ia|_HpC$WR&GfPQ4>T`tB<`Kdf9!i-FDfFL@B_tv zL)e{D_JToiAf>m&6S^%=`YouEDFnByNtc#SHox}(z!Oima#}oFoFk?C3KuKukol8t zn%2a&xs=lT6I2=Ey6H)*Y!R#+vVdNSTT}~8feIMwfxq)S5Mc|V=`@P*0#Rai*icyd zBCwL)I|tg+j=SEUJcyyXp($!E!P1!ipx8gNxHXEjtfjG%*)p4b_$>uPL9(!gZ{Gv9 z75aDOo{yiWS|@f|jbKy4E1VMY7uT?$CVUn|ka-*%LDw!#C4%|F0X7#*-%q(p9}|KQ z@nGYM@@+|{6f211=X^H5r=$Bw>$d3rBS<#9+$glK>Q6TqUk=G2DVNJ{0v2UjPa%R5 z$G!;0Oy@`(mobz#q8f`Lz?KFCLhMh6SSsLAL*o-^=GR*>i3k+0XiAGLF;Ux`UN4S5 z1qxnu*Ce04Vp(r`G_#ph(6ZzsV^gW&;+BeaN5x(qu z;5W-xUCDG7l2{&Obi+Lg4NF+>S3rW;jIT5SauW|{e$&} z7wkK#EFe$+srQ^qzmv1_)sB6r*Sbd^I2P0z;M7Y`$Zc`V87OwIhL3LQFH0mY8QI1!Qa&g5 z`j%CB_bTpVq0QX>tfKHR^--?b6naHE>913y4?g$Xfs)qJ2@kX@-1IMd(8+b`!20C= z$k`6YfgtL;n1dJ`^!ZmYm_is;xv-5-X&@h5l+<|i=8Y&PwN*OAI}v0rkNPB1h!@awOfI3WXb}vBE1n zRlG(hL#(|=dx{*)EnH&G$$6kzt^+>5a~8jc*WAoBQ}K2?Q;_z_yKQFN=xs$nN=#0= zTG03Z0w9n?^xJXt2tjPxsxZI1gVC)pJf!4*ajjw;$UUg|SH(g515v@)wEM6HxW!)* zJY7F=bBPex5=;?^mN$cz`Zb$Fpy*F71yr=?F3^Ki^IB!l{_JWT^8Q4c_r~CzJiW!x zva*6PKmI@2nmo4PMulniTF>ZIED?!!IHzwhq!1SKb8vGf!%k%8ryRjwjzgLv@ z{LOA6b#GPHXp+`XT+bL4Sy17I15N1m3&Oh1{O7l#a0NY7gADUD$0bRRPc~_zhQ09u zVBX^;Rd+}3-gx$YiWa?qafuwU&&k&Qw%*?e&5a}m%YIDE`W7CzKL=K9Di_O0fvd<5 zbQ`nCPS~ua5b7)+V{di7uL^0Cn_~N~)4S$IOJj7RJIiig`_$+>H=lWEqdon+l0-h0 zyA4x_1K)4a_l{!rgtz|R7aBWk;xhkab4p&l?n#JPtfB@1lkd|yp9|u$7GC0ht&p#t z@|a{ixfqTvd0|B&b`U)B>T@+85U1Zwo#Y;SqFuD8(c{}!(w1w{jC5O;tX6OC8_i=w zy7!WlnMu#nw?x&PSeAwV!@TgdTT6xjD8!BE2b$_j1?>@-E}oEVu2UVRA=j67j}P=k zmLb|C@=5<(QD6bz3S#MtXUxod6L|PZ>8r{{6R@ti)Yj+*~`9HeSjNAvVGijXWP^`1}$A@A`C%kS1sc zXVBhty7XyMz??IuSc z!T5PYf~XAIu`tYCt=ft{6S^Jmdi0NkJ!w6T>Ex4;-=A~%wZ7Pt`l6T|zP*#?uh3k# zX{pQd(8F?I(|uIu+~T zMaVy!)sPyX=c=>~eQc5KY7s8K{Qb`0hx~cdxeN=(Jn-CA-8RC9N&_4<^J^sH?wmBv z=J^v`H7s8zsZ%x(whGkx!j>}aDNZJJetJ!xb~uOMxOBo44vPZOpyAiIbQ1t9)A8eV zP4}NSE*ZSmXJ5Rds+~<0!IlCLwcdZ0XW<4;-2?M(1`ct&4}8zST!&O$164cYKi$C6 z0R!`GBq>@3&P@HbQqNrHrVHo3_u0EF1jw`xB>dBky#d!My?-n-T5$<3XkiqmqKDJH ziIVkxH0W2PX(-~$s913E`+VH3O({H;8j9Fj5vE)pI9Q*p#{>zT8p5BQpHtdaRt)QZ zM*KEG*H9Xmw|OT0dFz?$J?rB+55@3WUsTz{`yn?7fj;7OW*yAU*g?$KMFmg@_+OP1Y;1PkpU$3XXbWX52(8qHJ9V-gn zjn`U$C!vWQGuNX5QlETE%4Bo+Y`E_qr{+i4dnH-4==a#YJt$5y*k(x4w`ysYZ zA0S4n=*7r)i_hGn-g(SRoDs-p{O%Yw4(S_RKU3)uMt&HH2vX{U&d#(9975-nZT**& zXZdZ5b5n8rj885Z1xwj_lp{sr*!J~ag18($X|SKA{eK1K&!iNVl3t@O2ab7##vK@H z)ZC)dUiRtf*NPXvcv)GyKM;q86{8~5?1Lf}bLM<2%`PV{IczgFQ8vv|xaqfE<)}m4 z1!ahjewwoq_%X?87OwsX)Ej5UiJCF#m1VQ~Fwax@{ z6TP7k#W~aRiXR`B(mkN{R*v8MXj?8^%;Oc2oa60A{|i`osmBd0a6DLP)|S=&U31We z3*q^79W-_EE7u#FK{o=_jm+i+DMyz3T#om+0jgsBm)kl&UT0UN`(hW(_nSv#-At!~ zWNkHLZ&OX0OW=B-e6$}>NeN#5g{nUCFz0c49Gjdf3b041YF(0aIASXC@n`1k8*t2-;!3ht zxIdw1hgRMt{7gsm{tFYlI36vv#{xb?5$&1j4a^ol{j4Pd+x_0qAMAAGtTK40^9dW# zufEeqy>QT#8UJ5XRr%np5Jd=l%R~sYRznpWUW>Tkv7H?{`!9Mn0kCiib5v8mD=U>p=(T zH#5yUp^VS0On|YL5)^E*DDJ!b+@b4fE=7Fw-Y<`q5PQQk48D+rg%b~%K}HVr` zfMX`Qj0xoA^eT&e$Mn#lKv|6#KeNAaqvbFL4Xs%ZKsiso590Kv zUD5X@r^};qj-Y9^e1MadQ@D2do@dq*`Df*%Q^MKr?ZqBDv?sF@aop@A>{98O&6eF; zX>NGjB~5yA9IaDPhvf@Mzv$aXhCmr`@XxF+gGIF1=87>h1O4sn7d42)Pl-O)SXN#~ zQX;_1+syaC>z4i{ek$q`Bk7k4m1EExm#S%A9RA|-nWekDS_g{Bt`r5q({>6w$El&Iq8SyNhH})u~}~< zV(wlW%wApWoX7nsCrxIN*8>qlXJ$MW_wOCsvdE1v1;6441B9>#>M7xFu7uf450xFS zjpn|T85Q$IoMxwx?8F|gdpjF?)ORt}ofnqNI;+KH0HS2P0C3(q?CI+)FWdO;7Xl@Y z`09IO`!T^Ibp|vy*Z#3W4~x^or3LKiwSK*;&|VUIwBFK1`l>kprqOjgwgp0NiN2^d0rc2ProFcr z6+O`aMg2DnZBd{|g3k-End>fxsUShp$eGn0I6e}@oL$o05mwoHMc{SnSU9B?z0hp3 zx)EJjlwM&q*Ze4({2Jk5=q3feN3>Ype06~b?uIL6YVL>lUj`M1EBK8H!?L)vjn@RG z+K9|3_Hu2iPk?$1`_Qro-L`B8GN!R)&)q(%qaZ6rMB_sk!n7hs*rjE7Sz zp5)A5_!fK;T6VBG!A!=;lhVv-hs=hW#IGO~R+mCp#240RUE1=7c}UP$ z#nu%uBOnq*))D0*s5EUIcA1IDjvHBw)=^=;m&|i@&VS6MXv5(6DtL=ZV};(q@+Lfg zxw1>1J0fsk1!zB`STd8{#B!>nEnEeoF*6bms{R{kiFnvvgSftm3n-_qf=-Zc8`A`v zn`~3aexwvtIoYb%FS3-ijvp#44{rDO{>|w@@2bJoUo7gZJR$IMJwzBJn-a>Ev6R2q zosW;*E%`)|h1Z%q@X$Nf!b=j7sTKLPdiiq}Ny?1{Y6`_~o1jVj2gNN0aS6x~aQbTM zw%SKDxs8Bo?iKKf`DMg>SNtPgk%70=hXGWj%&6GU$x%6X)bI)s3HEih2GZ4xYeNPZ z-UVM!X^y~hdbNw9NFQ?2vP;CUNbY&0`E4895;3-v7R?i-Ffw-MtUg#vb@TP})coSG zHKpLETr^lSD4tmFPeTWXvEszOtPq_@jv(Qz=)VAYIsvO1V876Fp4F!pwVUUS!=~i# zPk%a*0T2zAC|f{ewT(?2H#r)ArYNn6mbktiFtHyf%WL4LUfaUWO-QHdM|YwSc}dQD ziKZrBzizxF>@WLF{1F`yir^x!IXq4u+sy*$RXbPUu4)Q<5H7CXDfo7*d#hvVDfbr< zOC8a++3J>%HuMxYz;3p83(#=wDw-+OXKfRJqgUw$ehcVO`&t2l(Ah{&5?EKR4!P_~ z*zn#krx~S_K~;O;VqSBsZNFgoW(aemY%7g0#>R4~5Og*AH7R3@ErF!SJZTy|oHjd6 zJ0Tr2+Ixl(WGtLhkVx3`Kca`fNk$u{-8w@jiq3(1`hlqzI-b7wS?-`KUWM)nLc~4Q zErX6dE2-X-S8o+Jux)=oca|urZ0zNi-Uu?sBG30_`(mv{?X14oVA5J$*;ylHv9%2a z{?5SFLTz{QbM*j-9O`_&?^-iW!*oq^pQW{}APK!OE#vd^`myp#JL7Ur*zrh_TqQs1 z$(ZB!V%IBLFOXeojsX|CGukAQY4BDD>?6h;%L?S#`aop4o{q|QZ}aA{tu%G`J+qjN zdp(Q};y)tTUR;xigrDi-EGqRMmA)HF9}e26DCn%1OcZr6T?+tXzr%Y9$Z4}wPc_s9 z;kU~Res_JgK3H^I>WTJ<%;R&vkPlKdFMd(eHZ7B9M(E+rj*&Wu;uezj*xHrOHsbs& zMY;gt%1WmX=ya?Fdl=m;3uh_&t}_NdyM!y*te;F^_eT{gXxVxH%b(uE;tfJT+-`t% zn0K3m*o~l{Upj!iJuFc$xJxu#b_lNmEQEdRiPZ0v^GNWPpP_@tu2?8dcsDu?$FF(b z9vlg>sCmwLS5pHe9(M}iM=Ia_-x8(I<%D6dI;kalMD#Tsn~5v3Tt?ROq6!O#>zsyi zv2WSNLF$yVNDk-6%`8_5yBy?JEwp`3fcSW)->qsF@q+LUGTsn*SdjW7NNYUdq^6hQ z4ZF5nh^)qWHkJa<3xMWtepWq)Rl0DVMIYYP6mzT*bSltJF0N~hn?tjmzEaI!-alW zSfp<8*|3EM)$439%9k%F*UhR)MsySjXt!*=7U6O7(!=p1SlA zM9x|e|2E-tm-g^AMK)ic?UPu3-{Z;ZONQ`m8iGf^YiuROZAYx z%6mTUdIw|%-Tb-Da6uW{njo-#s<(X0QY}7XPlxS{)b87J!2ZjtMAFxCV}kz4uu=3` zxp0Ceakb$`IHw-%E3!TgoHelZ1s-8-kgTl91HYOu0fe`bybrSrAT!maDa++oJC77~ z@xHBAVc8IImDeAI0czndu8pvf`?j8roT&2>9!R|g) zMMqrRg*Gfb8t5DEblup?$T^efGH^3EU&co$1oDCY9ckSv6kJr5?EpCJ0r43s2X@_P zR(vIqZ~sogS~*~oM{<)tA)d)9aucHN<4Y%hgX8H#cSFb>NLI3~yP9X42iw{WHjCG1 zZw8}yz?j;hsDBoQodD6ZG6gnueLaxl-7v`zu%j@m(urSBHFZwW zZNaFLHotDC-OuAs9X7l`5^Y%SAfg!Ws_F=WVq9^jFl!QHyLqG?-}c zl6uJ`OZDAJ86v(+z5R|#f=cB#OAZk55Abr(+;T*|)*ltK9J=T-4YdHtEGH^pZ~#tH z@EM=Al@v$-bneeiYf)aWZg0f2@3GbHbj-8BC3>`1=Pf3ucPS^GSj}g9Sf-J1+cD5m zpJU8@5!tUQR2UNI8F@hMTT?R0lF?axrM+ZWN@_m~eK%H-XS_c$j^~Rpm~s!-bGO;D z!#N#39S}Ro#(`qxS|EY1%5(`&l%=HPn?dvoB^}m8`1ApfD{6ZxRHzt0&MOjHu*Y43 zLqHHI`IK$0HHFj`(f`D?lI-&+EKC*whGSei*!nw_X6mGs*_9Qc&#NNSoSA9bh}Y;5 zU`-nY)xPjr+)6aP4`#n^>UjD;uRr#;Zk~8qSTLfmj4|sZFZGvJ+E^j!9(!?l!*4GG z+&ks~md{KkfHk+O#vzlK(LsUje$;Va1h>22w3fBx|4=QiEusNfc2)keGp|4aIPtt( zM%M!4zux{Yu-Am?CKn`s^8C($md?pns^nGi+8+HzJ~2?>f$Pg@-a*$*R;=7qc=T;f zk?NL>Lmh866T#)B{}3vR;gm5F;hbVrsSh+gXVgb<1(b>uCf}BSyyc}mYsOYco6XQi3(fR<|09&kMVv?ge7GXgKxx&eeoaQJN{8ee)KfLSzL ze>&pY=nr$|u>Q%m4yI%Oix>^Gp|I6sU+oT6{i{H{q&?-FO+#mJBk6m^*BMZ}8*N8e zYtw@mrAtEx%egy=e7=J;{I+0LADNugt(E zHG3YC(c}74yp9rgCpIQ$2{`}LG2i?PqFQgfa}Lck?zj&(R~`S%98fTWq68@`xSzUy z@15&VpKQ)qo~PcWjsy`*9A1lEmDs?qv$5)yG^(u6k%_9MI$s-z(HTSWg^Jt?Y&P)&dq+31=YJHPdpwi<|HrS{n8O;CYRjDNt>(~O z4&7`Rqq`Z&VJLU0Fp_S>CWi?_RK7EF>@-6;ccK%Ln$m`xZrmlOrj3P=Q*y}fcisQ_ z!^6X_$FL9ss5b;l>az~?2AEe<^^#_!~zK-7}Vap_-2%99V>ry!rQ-w zfs!tkMGnLU4Z3qS2}7F)6^~X3e7?i&9rysUSIF6|+={~GP`luo!c*-X&YbPp;6YQ8 z)#Ve(2Ls>x4%WlyIAm&8_xCUP%o<4J_~a6Jjs_qs$Rk{Nw7PR5AflMCw(~t1Lr-DoN&s8Ich!sA4t5gB-_#cOk7B?OA!(<9E2m!yh;k441&LKhGZ8qf%W(im-sX=HQ zI^a3S|B|a!qaaX1x>|X(4T9OMOY$L$`s&hT|nZ zm<$U4z1hF9JY@J72HxQmK(V5krPzjvmnI6#VodaaIBZX^eq`obXw3}SCsI`%%VXX; z3dnBEFEGigRfnD*}`euI6m39nsmZF z@j_mp1TwRSy$6>BRH#7m6>ODKp}A5P%)4%%NM#%Qi@0!z$?n z3SrYi7#;y|@=0e`6?y8BdSm)*ifgQVxKHgK;z=;R_zSOj0ZT9Z6mCi#yS-n- zY`N%25RUC|ga$hb_g-}*0MfS9i3!_>(LkDlWt6#zA919SOSsz;^VO9^sziy0Eitn& zRy3$a@}?jwpn4XjAjuegssdhPon&=bj~_ay{yv96sygYeq(_JM1M0qI zL56&*j!@Ya@j$d1pblH_!? zbQGA8cITEx{{GB@uhg&cek`wp?(eX48w9l(@q#251@oC`lAo`&RLmjFaE~0?(wI(y5 zYynUWS{P<6W;nXv`-tU6Bpv9w9(5B@{Yjf_v-@w1B9PrZIkd6X3sEP^YGKgHY!@I* zD^9j?3YHA%045m*rAVwxiwwbhn#$ z+Oe}ftQEd~x8mc*O1b_+S4wmZCc;WJ+!00Zc6U4|Vb3oF+Yz*zk_vTB?+A=wsA%3d zwO}qBa9I?Ps;*XC5r*peN>-{)@}P*M7m?KCQGXVDyJk50f((x>h_o0Dd&86nH>Rsm z>uNv)zETdIbTfYW2thH6(RJPn1-SM$f#4|Z{4s?cD6C&|x36ru%09@wcZaS%^jzz^ zKU|epT^;eHEQLa27$v}!nc}9W%R2HWBIPgBqU(PLDt4ca?7gwmBCNduo61l9`0=%K z(wsxJpoEPe+g$_G%xHeISR=Qpxyj8Pd-TcB7nNe)#G)=iV>}*j&07SA)}@Bcs!c@n z*Z5oEs?|>vn(c?u<@}4q4o@WLBj&+4f2(*;pFAN7Q5puVaHf_9cs#yBawUjMR;qCO zydzB7N049&fn6FDRh%y*2yJwjbGP8IZ6+}+X>F;?^)|(nhogmVp}o8OURFyOM-qvp zrWt=R><%`Y`m0Y*55cTsj{-droZ{}l#t_hIM6P~a=TwqpZ0`( zg5ud00;{CuOu$LUVK$(vomKSZV2)z&c>W6w^S;3p6`DO3$4yw>%yaBg`u4~dTrxA} zjCMVAHRtv}Y8AIjb3$f}VbTfX+q z26%!;vXxj_t)71A&*uyD!f`Rv0`sG~EhnLMcs!UP9#K6+Zu=@G;wO(DQ~Rxi#xQS{ zE>>w@f#x^AzX%4)RqXUDPUZ^;n`a*2$g_ICHYD4udh3r3svL8Vb&p@mcA;|r7%?`k zbgvMAjKS}%wxJ1q=|hv7gz|dg>djY28$uI{oEcUH){L9u_9$#W?ZlQW9ul*E7eW7Z z(T7|2y|xS8z$sywv8ngUdbRmGis%mx)h84OO_!72S?JGFg+n<`t(rFtb}76k# zWI!&=NGyJW#B?`v z+J}fye@cBQ@_!O3x zbL_~|oY?8fX&Q7PP@dae`(wi>8<&P=5dA+^xShAM9K~$^SPb5;u$eX?QO~1+VZImc zzQtP@(>X1&$~xir`}*6Q9YrC_;-9oiNx4GSY}J$-%i+jxpgmdUsUbRMUE}R)&W{33 z`R%I-pWtxaG)2D7Nv0{NcG}2*nqxq-AE{pZyraL@mQtQ3V8$$ZaIiLd{YGooUrkoD zhZ6{|9V30Z^3m(}i=s?~#G$@Qn?4PBsD*aw_HIm~=0`naYdlWIk^Yuim(1reo`NR5 zN_fQZ+giI5!1fN{J8A|nTnosq*=1)iT?bxUti9fEkxtC))U4J%-X+jNoILsQBN#Au zg+a(m+r%u{ER)n1tBw=#$u$x`@R>t`jAFKDHFc3Dr>eD7ZwjXcg^NG?$OfxqK#s5N zUY&FP^!s~1!KZ2NoxI9Huw_R8N!vo;zc*0zAe_W}hpiUd%v=}XuKi=b`s$MeOUM>b zmN`&*QNIn~F@MhYvbVBog(%-}Xp=DzIiNnaH+Rc;N(;d89}OE*?~D9%RH$ zv1rNs2s6W%Gpb(6A0H{)P;2BJ+OIw)c0T+@iaAj6fcWDcC;Q{LG}+~__0KV;$noH1 z8|}B;mZ&+Z6B%%~zBqYwy;x!-#b>>_j!iVrEym?mjDHop*G>5`XkLE!?1Ldc+g!_zo$;8nq?@g9N5w7PM&Ne z#ebmJRNr?DY@Lb&X_O7ew9Pr&;Hb_&RXmDbs3*C|n@BjtA1Pw!L!!81?5GLm{{0P; zX0&vbX4{ecG#HI8)o-;Hk>&8*54q>5&M6V4!9z_5a)mWx$d%~MyyZ85+vgMlY$#F{ zBo_Y;653`-M=it8gd9#Z6=UM#dt*=*ltf=aeHSUDQYo?>P{DYv!WHeI96<%R1abgC z*}5AV4g<}|Q>D=QAb4_iRySDwIlr8-ZoD|-q;Kur2rveUYgHrbK!8z-QJSBhb3T(F zY$MG&ADZElG9>i>XcPQ^m{*|hfpo)?3^}L>)7H)Xf+YlV<1K7~+}b_n!Z8_qx5I6u z8~?qcpym8OT$1`9C}ZAKSyrVDh<$TW*?K$XJsXY(J(isJY!!O9x26)nCgUP`);%&~ zjOpjEtVFN5Vjq7!a}(4s0P7>4J;MX+CkGZezapK-f3PV|G}EFnu*I=`s$h9QYZn?6 z6hd01AzafnPUr}lkJy9r9ikkvX|D4NU$x6V;u}NOYfD*#7aO~1+nl1m< zskiUZ-oDz!ELK4F^=gD6mWa3cQL0)2aM+)(*Kc&{?b3s+WI$5X56vxu{Sf0nBF)$vHI*yF&$6PFS z0o=)_Mhnfh5MG~ZQAlbW2CeX#7`hP%=?~BI+xAm0-3HQEZpbeE9(@HDjwV6M8-s=b zq!Yq1@{kf<^&|k{f4{pik$uvL+QrPB;ZEcWte^PIPv-B(3yqY>VF|bdsLU3k{kx(cs$V$6 z%9DJ@mQhPxpaiqHmC%i}>tL{mXkz;KUVd z)#RN`d(iqH+>IWk`g|I&8ts7@AkvjRDtyPb4Q>x0jApN5Z(UX`jwH=06N zItoQ^>rN;+E7YFFw~r*}5kuEJyYFWR<$O!*_qlgwu+Yrb29k<3Hz6@^*$ld%P<*Bv)y>L0Spe*^8#eA6EPR>|%noJO2fwmA;gOvNliHYQGs$LTv=;39 zOZp?{b7KoJ^b6lt)_Uw$UB~!-m<1M18Z8Idz-sD6&26Lz0*tS7yzhC44?he|#LUmV z`vZj;PhMq=Bz0@DISIW^vbDr0VQ#F)Kl63D!?zOW`IkpQf!^BM*<#w;hO_wX|kasEc2Zs9$#FN zcA1knr%GrBRDGg(UK&U^SXt^{d%KOg#vID9M9f^8&uSErsvvryO2dw$Umc%0aCLmy z51GP|P81KR72ECkaU;XM0Um3VbUEwLVPQx@m!NXP2#Ytzf(MbZ% zFMD{Rk}Tm-3Hw-&lFk#{y$HGoz%Wso?v3#M5lBaR-A0B#!}W`~coh7&>gR!IltyPa z3MTMbl25y8-H8~h8CY*xymj8h$U#QuCWMq_?_wS}ls(W3nYv6*i4(Kli7355-$*vEL!Q?cd}uSC}7PyDfgWfs7`IdSWn9ou>IeQXpdbw=L#! zqk1?|KC%8Z%UHvjo+JKGQr>CIecQVKvQdusd3@j9{ga=>HF{5iNp@$- z?X0rxw`CW!PIrMYw{2$ku8g_bhj%Vjz?1fw)m{Q2iSK^f`$-|Qfru^YRw$E}oNBy+ zW8NygY<7^+HtYz++R(v?xwh;{I00_^TApD&18^{G_yzDYa+Zee;drhf?+0XjxV3^U z)=P=i+<8{m9J(yWta-*^G?X!1b8!>FN+#P1(oLlYTTF^&ceU%a$OLJVO=akY7^Fm1 zWm|j*@b+MSeE7v}p+axJnbK^c2S0LhsT6q2I|ceH#SY+6X6iO|Wq<597If0%4S@FN z76(RtxW3OzB7xSYe$-iN*>@v)K$9CgY+~1a@b+zl%7w_G!7IULtjez}$x3nU&@)H9 zsLA?&B6dN}AnsF~Yy!^~qTs(b!fogk@LT8WN160|zfQ#kWPfti` z1cU(NU=m;FA4HOahHqka9~&ImH36-w_(|J%cQQcfEcA8wMlae(3PqtvSDeqakKd$% ztEE>}mb&}yAxwRveuX%8q=sPO6~6P{@mFbD<3hrLp|2aK%zHF~oYp;;3qw1}VrgL>f3Uk8IeIKHP$#S;J8{} z?S>(CQ26jogRE+)oLw;?@`P=j?6fg8YBa4Y!B?)i-!PRR<>1o}J{Vz3j$P3XF=K&P zBwgQ?@+Y-$XbNOyhlB2K9FtaU10yr@p<>&o;UuKnBTY8QOonlPtxseEG$A4dj_xAf zz0eV-^ODo++#H>wJ_^P(SEy3v8>_k>fl)XQ3Vg?+=bh5KRAst-gZz^dll>RFH8TtE zhKSv5pPFXoLtti7?CcV{yt-~5O2ZLbta( zt7u%*l!`dgmDk{YgwC^CP_HVZ5ma5_1Wd4Icc;O6>w2Q`Nap>+6xL4f0p4#DgtYWwiD0prb6VD+%;l>O0Px$hHst zmQNYSLL7bR<*bbGum9U7yg-1H(vF}E^xeSBQoj7-Vg={P!!r}^k(6hxPEG=_g_ zy1`I_UtsOH);c&~cfd83G-a8KTCFkVk}|i>ZPSQdeHCs(n9ew^;H33CXU4c6;=)|H zZSA#v5j0*14AfsaT&v%{u=sJYd?!t^wLdsc65N|EWWC5S|6Jrh{gd`YzaxA&m;-he zM_Zmdx{|*dy1!QSTEcOa;OEJfRjZ!q-5#QZkRyiPXm@2aVGQHVihHwtnf2kYAcl$h zqos1E8s0AbCv6}pvqJP>g*ww;m*mVXLtd4<`u;xkpDS*MmMTm#sc<=oFyjJo7*}at zCh9sz1U0``fcsvoCPS`ikMhe{;ov}oHIW^i`+o*csBv*U!nA3t^BRv8&Edt-JhvgE42OFsTukCCy zRTz6NFB!>Q^=uuzO+C#}hU4{?HlOXjRBd99zX$mY#v;*kbDa76%^b;FZ1-*{Fi!1{ z&mhMIe8LlSE&ajWL#aod&1^GJutrmGSas*y0_deun(MeK0Cp5)Ut~*gxz+mFJ9u=! z|9<`3I`cK*tD5@c)}YVngf*RibxuOiR3bLtCczN>Lqb4@v$l~Ze=?oN>!Zwe4k!91 zd_yLw0+;;!6mf{CrGsYIwPHci_L@h1_1OB79AC9G)616{Iq)BI{J4$}N$1dKI+nrO}frPq%Z_Z$APt(04%G)8mJ;6%A7c+Skl$W+g}~MqHI<{dn~D<{#Rx z%Z_soAM^6F)Tt(ZHUBu6@7DD*$`45u6T!(dBp?X>yKpKAq&gy*{m|^zRkvr#s#S0O zEbTU5c-if>#AN3SW&cEOrJ}aAyGEFx83q*=-j=dpC=4-?q2!q6?Fi#UDdhaI>Jd>N z)Hbx@`k&`A>T;ejNCop-Ts^p9~?IVcCdfC`N2Vd)ZfVX#1d$}*9KDiN%{dw3S zQlJduY}_S@h#ONuM)s%K2Rc(fgF{IpfR&#a8|v?9UldBy`;_0FVn+QBIJ7rc?boPj z+XnMbmlJlkG$2Gz0ri_(lS1I_I6vWjlDbF6X{fP=Eq$m@bENfa*AsKb3zkserSGgz*tZsyR{YdTHRy9+orR+_{5e&AuvBB(9HS9>HUn>?E>v|Rz@U* z-U@bCplpHm-7MxYAFSK&*akdTg3%wc-MLqXuDtM^JWHy;HXKk(O9mA zt>)E0alrz}M0p#*FBXde?X!QRZ@&&NZ1}2NxzL!rFS2=>_R7h-i&UF)lrk{&Hp{>5 zN2xG}R6U$^8{O>>h7&hgYM7=LNR{sBf6BNAQx|MNvrfcofZ|QqI0*7sI;)C2Qb*@A zmnxLtAp5Er7bVX~?)E-as{W|uOpAib9Ca+ZX8i%5qu$f!)Jm{cK|zTicB(dM zUlp)*ac%1i_;*k%ut)8VXIv8uOE9lcDX4L`NGF~WmL^2Xb={_^9Hn7tqKX**T@y$F zD?)S@0sEZ1_ZE7XlQ}@|kwQ5+c1F1q$c6whani$iDiv~r0SyZ+x)krOoDBl@{W%Y3 ztz&i=N%tJm(46l+Q&C2_KfK=(7#I>`KL}b{omQQ?v8d)*Bc9oxW18vi!@(fX>VFEZ z$PakUkyTX+#74pT?5)Q47%^w(c-$I&wEBw<$`X!+*V+C42l+6{1$kp5#GP;AF-*s5 zRZ&CJuzcC}zWHLH)`Lg3se@O7ZNQ&N`HTl_lejk0+UCK_xoIff{fR}t&Y#=EH$_W9 zgj&zQwkT%(lDo;S-ZW@9gGkDfwr%EhHu4`L-P+?O1VR}=A*c;0v3CzY_hd&jI<-wY z-&9P6@XWMq1TS@abKDACDHLh{BK7h$WxwLA7ErAFkh!A7Ff*N=3b8*`9CtH-yiqAL z1QBZ--AB4zw;nvp2s&hla$yj_%@^wazQZ3*4Lyd#F$nnsn|zuQl{nWGvTKho(2_mL z?{(7qEMOz{JHozXviAVnSl`wAdu03W2}1?cxjCm+S2Ls;WNtIAf*Ku#Hn7Uh&QK!y z1T!s1bxpOKjJ$>5+5iq7+$9{-)f$u_2Er*y>MCk=R~i;jZNF5haJ!EGo@13ovlCs9 zReQNjxcE)cG|L5W^Id9vXARXSw_$V$)f${=aT`I3+KeK!;Y?s`;@tGw?%%W$&n8BG ze%%DAAqL@!PJ{3_$e#U@Gv# z(US`q0hi_)o(S%Ou7(U0ER++Sj^(D7Ia>po;Attkm(6A{i>7axl_a0}f?94XIj8W@ z2@eHFBSk0d{{dF73Q3uJCx&CYtRVfn6IIjp)BvkZ_2s`A9x>l{EytTJmU=Sm(b`rz z;%S$G<1hmdHGO9fd_P&9LaIEOE)~txTgMVs6BPf*(o*GQbAnUnT#2KAL`u{)v_1SD zABvz)A58&1wYDmfyNH@18;!^m)*8LZP_;#47a&>WHch@Z(4!RdS4u?&!<5+=Kbhci zpJs_So>5pYi>@%h2! zh|uOec5UBJSyV-|q%!O!vlA<^c;htG4N~B;M7h8*=H!GQCs|C;NMds`(-iH9!5&xR5ZF(7Vj>CpUb|A$z8Oab*tI*swOL@EX0bE zK#2v($TA40n}@7OQFr#XZUZ<=INGa{fJ-~T4xh9Ar(AQ`IDBfTRZ2?gKA4&LNvisC zQMd+Hz)SqG7!6hVd9K?t>#OXvm}80zr6XHcuJnBn+%RV@TAnVBkuHFBu?7OkJr;^iaLXW`_48ez6-+k5;mCCAr@%J_#?KisFPi-YpL8y|q$J}o46pL4 z3vhISgz3E*s2?GWf)3#~&WBq;lY0U$?${coicatSq^A>k2u2aYwIk}g=^WafDqqVk z6{z6KZ`pt4i@qpBZ9wjvO=8qdNNlb?2*VvMK6m!Rww{iX}3_v1}W4 zoqH1c^Gec#gTg2dWH7RQLH&Y@mq&O2qnS#w4903cRQBXm@u;M@8CO>n?6@59R=aX$n;Um-1P3%gHzm z$4nuDxm+L1{uez=hY3noDz@|BzU%Yi)pvkn)*L+&8bkb&8#j#f5tP*aGRzIPPQ7#w zq;>xvaOL3F+TZS_DVUkJ5#?2zPt%>yxB@Zpn-$9|C^{tq4#O;KPtJ6Ea+P|M3QZYz z&-uC4%Q)`Jx-cF4A8Kpy|LlIUa~}f^s85hq%R+XVsDS4WC`A9Jm4_yb$HYv&gKFhpU=M|4r_P9&fmVsM2o7#r$t=@G`4bh9M z>+wBMAz(=!0kz|Ya(i(QOWTfB8gC?Jcz>ZS==T&(Tytv(aB)4kNnlSpfd)WGgnaH z?6`;(&aBT(1N@|)%ML!-+U=k7CRriyxxL6dxw~C`an5y!v!%>S2SkQ!MuFLXdu;t; zas8Q`@bzIC{dHY08?y51VykC5wqdChI}V4YW+;t+SB(*jk8ni z<#sZ6C|0}?Kgqe;V5daFb z9+y!@?meU0nMrM8WZpQ$p~m;9&=`XD7D`8qDPg29JhtLF{mqpw!k&iZas>-SgtBaF zkti2N^x8&IGEFgUTVC@-yPDkhihxGjoj3+#>ahHjq;@CH1vYDCK{;SDAscm&&PofG zo>vkbC92@h-%|vQSj#`k?-_;{=UL}%U+XU}|F+*f3LG-off=sbDx3Wn#ffM6cWlP5 z!1b~}PP+}NED~u0gFEkrQ~g}cg<|-}RgaqOif^@lYR|7RLfmJ01(7KcyFP!MJesK_ zTe}{85SXb? zXifC>OCB1C_vAW4Ts0%q&j)07g3%;H%N2nogLm~^m00|BmM6qy^sI@`+IsXm;?+;h zq1%5hmp??W%xXFMg8^P#)60V<2_)0Q!feMa-^i*Vr4@M=wWo!2?M{S`2+(_I+LtXp zf3&?UW~<0K>xZLn547xy&7=2%2)LbZpCcZ^HH#C0(o9vT|Lbf2Lu%B$PaaN;;+AQp zLGihx={OsSqIEt&)ZMC1k{A~NUmT%^+eW5{Cgr z@;EpR%68g%s#z$+66cQ8SJHLNhj%|@L$2#{$?z1yK@ODw*Ar9>H4%9!CU;>7R)#|f zyV)DvtqH(e+r|>s6E%Zg+*trqqRgj4+N8)XWir&`GWi~wFzEFzoto7nX_1hnez$L~jXnaO42XZeh`$;%avDOaP%0ZCDr@f6_Hrtc2z4_;gAX}wEm3wwRK z=tKT<2{Aen&ALA;Veim68|a{+1dok zYDwQi=IW_h{bLlXq@ojE?uySJW{1W=(FSHJf^vuXXDfG1G^RegYa+@%4>%3$<_FPs8%^tGNYwVY0 zHjrFRBE_2Lp!LuL$$Tj(!jLoM!;6zi;&o3Xy0bxD>4F+ zZG-tmez>Uv`}^7JD?ghI#fXUdcFv;*%E^D39p^7sO}Xz>MVd9S%XBT<6B?GaU*+}Q z_X*bv?yEYe5vza251u4SHY3{abJUHu(Gh(9kpEb9_AG+*g1h9jUOuR~UGx`tY`K2I zZ2b(y+{(`WB?_xflALM3HL%a(i6SswyWv=7@u&W$+@G}t-I(Z&$*EHQ>k7b&<6Aid}co1Huah#!0&v1aZTl-GF8Zm=Pw6&YTCxs=SW%|1GvIe@hZ^ zDp4Y+jw4Z5=J_0}5sLr-x$Wm7O_Ni_3Wov@fNd;WI2_i|Xus-qY2}W@H4QPIt~E}2;iAxgLb~UenGR{&6&|ja@u1S5N9fZ|nkUr+p2o={@^VE!qWW#- z-4yj_dWyM4qv5DipDoP)D;M{XeQQ zPyHrFo^ifG(TB55{gBWmX|3`a)!V+Xm=U?^6}YuI#9ZJccCDBuLvXJkMBKdKE+*-O z$I7k?iZ4>)a0pDFE@K8Mp1{=T#Y?B(9l3%<%ELRh*P+^^U_DjxX{FmJ@+%o+l9h`j z7Am%@E8Xbw>-IRm`hAY=9HMwx^WiHG;+gB*U&sVfT(QzZi=y)St9d;7oo27fen6z8 z@S3=Chy9!PS^4-X8I2%{7v5RvC6rzinV1%_GIl6Y)cLbmkmvEM+Qo#ILIJcq8?fA? z(BHALU%g0Vti*HVW+dCR&dvqg>!&&Dd|MzxEBcx!>;F?0m-|Y`MM-P@%7r&q!faMOJR-yhN@!%<cpcZtUwSr z;4EI@IJ_vl3;n#2>vD*)YYxg8kCofjSF|(wK!(k{0%E;Iool&2z*R=%S^!)eIlB|1x?uxeBZPCai?(9kTM z?4+pB>Y+W`H*79$CKWpU#?QRj6~7jvd*Xk3hPZT{n_m+WpAI156GjmY-M9$1Lq{Xj z=27k@pWxa}hI70D-T3l^q_yRpZytP%&V(id0dwZwycYDy|sQy8WxC-22)4|_ULRrDkINNakT%aN2R zhjeI;8`?G>?M^uqj(x?7mVZcps7&)+c7H#d-F>>KaQ`U!#CQfqASHJySKR>5070Iu~ZAppK^j~n{i<_p87Ggmi#vWRr^2lYQ5IY zTQ2e{?0Bb|pKcS^_4^qj3O&7fl#&rUctx#wNVrA=!%Nu7{BR8YR@D6=2wu-r1jlah z-4$BMSB(}*T-}&6t_M>2*;6g?JpeuZ!VTT`;4wgjgjH+KiYc2HsSaB{g*)NLY1Z?9 zKCFkV9z#vHN;7g?au{YUer)qwet`P#RBw+uT#^73s>o*j$ex_7{0xP?K-U)%iyypH zMv&BmVr0@XJFK6AgX$w1=o-6vSdqL+Mv2H$UHPgfGe5|qKx8g(EF;E)a(y{Id8ypk z(p3$4^P3_2J2|W@zoy=UTVJ`hksAGTIadRAHjm#O;B}-0CaWjll23xj!>=>hTC7w4{t-q8UYE5NuO!yz4qy zvG0>FvVRh}$CC|d#Ubj)T^a~U}x}lUoI1O7JkxhCQZInRP7)TFiTZhSfbYT zb2gx2>wyWDNEbL4y)bM``9!j!mz#puN2yUqWpU9B21_Rot8hw=g{~h zD<*=keqB(}WZ@_c@8d)!e*^<#_S|5P5N(#;nYKfk72P_>w*Lo=xn7-pyPZdrKhn%N zq`zNCw=eJxh9$*Sv;e6ViqJsr$3xdlF29UD+ zn@57u73PIH%lh~b|26>0s=Y%|tte3AMwn+GGOpdiFK3X_NSCpEGetjTv~?q^kA89C z#_V8&$o^}{UhGe&3;z9CEJr_$s$np!Fg5G^?J4kq7^UoJUZoQ8-%Gs)+lLyAIl8V( zAG%Z#2OPlre!NSi+y1k_ph4-;rz=$C_2xDyzI!2$nnwc%|Mhp{q4K)-!n5O+6v50KE)*mU*lIY=v7 zJKsqUNnEY~F1^`7fk@>1KFUaGgEtORpX7}0Qh^~PfFpi>&0F8JQ{J^{SmMTHORj-$VT*3wk00gN z)C!9Yu{Mw%ZjrC2)cQDH>-n)sy88pg#Hu3m*%VmxLqQ@@YWl=V&PBV~9@iU_9X#GAVGwWVd&W>h+-e#x? z+Aul0FGO_m4nf*B!8Fx3)lRE*0J&M4Sd#B$0#wck-1_D#c*3v%w|0u7i*zI7n$}h} zM2|0h{cNvkgi5zZ){TC9^pO`0elmKb^sCWvoB>f@GX*r0Uad_BMiizF~xDB}pWo}(uYy{(r zk?3@IM^h_7L?~r0R96RXold>QGS%`57fuzgUtIIz&>y$Tl!Sz-*lC(mO$ygCDKQb=Z{Hp8-r7lcaQ$77y|yzW9@ZiiGcmz|IgpW2$Yv2&D?ZASl$Jw zF&0B7!dUam#jw*(XW@joj|UNjH$pMNg5jj)$$PB_YAOTbNNsbj5$Nw|WSlj~Io4$X zAtSHzM(-1c&HFe>Moy|q1Ak?t%VT`!J4tm1NQ>`vhQTrSwI4f;2K+foV@*c^OU8?h zwA)q3uyw^{Un~N$GljF>q+i#{-){uPtwxt?Vcc_CTZ)Xi%4gnweg+UMY!83NLij&K z2}wEzm3O8N`46Gh!0LK!$sLwrfd>i_4;f$7TVCtok~w!w+sDmbAHeekVoa}vbEC!B z(_k#0wjFb>(5HHls{}4Ox=#SLx_X+cK)^1$g22%Lqktg<*`=`9W_M-U#q7}@#!3I?nMs;Sz&A^O zK#X1NZaVzb7&F^NR2xi({)-Byy?ySO6zaL>lm5ahn)>fEokX7;0AR=AXenj2oUP4m zliVeMqq*0VO$GUr*?O z$T{nri~isZqP`n?rBn}>+lZDdEtP>(y{GdZF%l_y!>Nn|bauJ3zFYSyIPbTBisIT1 zBBed1oGNdIRT{~BdD{N0EUsuT(hKQ$uepzB{xd9JNqCWiQ)Zf`rMr zMDgj6vTF%%v9-$^)h0W9`R3*pKEXu%Lu-ih`pc#PRWo&xxXC!#7$koHJEfnwAw%L~ zBbB+KX^-0VhC#d0*`o%=eH_DXESDWQ^P#Y%4S+;W(21?xAOb*1_j3yT0rp0B2P1B^ z#_sy+%%6eCqBpTKYplL{B;K&Wb-qrY*;b~S6zyp!sHiV*r8r!{=s-|5Kkn*P4mN}7 z7jAU&J3j`Jw8nH9U0vlenAx19wdz9+_7|g?QCd&tJT4XclU23&s;Dc0JBc>S;4Ad* z)ctqS0tO(zbvp3}WC;ysM{FrvFd+~`@Fsn>sv0kIF=3-<-1(c$<5Q2tV15I7sY56gS#Y<-i8Rd22u|KTY`g-zb zo9$Gn1@rQB=F9#ZMUutR5GckfJGc`L&*pFC(5vo{h8LQwRF<+jebz=M2rsMyr()FUs$ z@YaXuIaZ#)l-flM^y7!T9r$#bxIDhE9zKGSr-9n=&1a5SL&#s=4I+prM3N$xwb{(~ zeJ?+l3a~Bd0%DaP)uO1eutg?eg4qR}x{h}Cc-H%cwO(_M0Z@sbE)u2u>~ghEc9w1x zcQBM`%+$gB=-Dl~h4sstywfytQjtjKEX0NB{tBVEov&U+h_?Do=hCCPS4IbIQV!H<9oxc>V@m{u%c>q=NI ze?IOVqMFJHGhPYFD!}oSL-Rp#hU*VCeJEoLyEDA*GQq1#>E>xCe@ zPq$*RvY8OTT;S(&WGqh>06x~3g7pDm&{T+Ktuac=QD#1R6GdxpMmj9SFLe?j%@@^p zFLhp@=`E0Gsd$Ta)Hp2iUQ1mwy)>#L$osS~+cWG7u-ZyQap>90!{&8}&uh$aB zNb(0&bS><6Z2et`utaRnU0rkyMLf|VLs$E>oz$AUU2>gj90Gxt&#e~X&=pFPzd)P8XbNRJgx!`HIoL!nM)*P;x%Jv#G zFg!gxp(QlxWB5dUGEY<*4r%`I82gwFw|)HDNT>y^I)Q`_vW+qIV< z(*}%#u6W^d1?hbEUFO-@DOR#2aC)$Hzx&lTc{JQ!1WGiW{Y4!J%uW#llxA>p>vvHO zCD+*qT0GIG7{|Ayksx>y*UEF3*2ln8M@+ye#3SuScf~7y9F@FsNkn6kYKB7)^w$aQ zWr6a>7OUfqQNyt-YlwKSr2SCp&0G$snBqG2g7%l|u*WHP@t=|&*qW#=kbSSBi>S)pUZ+ ztAEkaf4LW+Y4&O>R8Z*Ek?3ul{1KPv1-wzn2Xe>&l%Ms$*aTAgJI{JY8}^|=*bEZJ z)_4oQ&_RIf`c7nza2NldqB9R<`v2qjXEuh`oYj_LGC7kgZO)-w$u0V(8dK31ZC0+r z5JfX{rdmVpz9p4HIwmocBYY!Qt6|A)B2`0bU~_W{3dBz=>%DVQX-k4WURB`CVUcNlMzKyixj@Xt3_JwAVSu z9eJ;w(cm?}4(gprb86lG3a!Jq1Ip63ZBJ%CsT3}hMcCC)Xbip__xI*{&%IrzP(*^d za)N5>-Ou~yY(P}Q^cWo{GC1uTONmWxAvhv-+tkyMRHo%GP1h7$z(7q?w+-ljtJvRS zJ`7$dU_5}BZ4r1087cDloPYO?=hW*k_>irO`(9tt6pxL)!kh3UtDTLMYE!@DOwtZ$ z=laY}|M6OALmy;O1@%Y#7X{Um8VoA z{lQ=-C;2(m<<8r%qWhi0RqBk)4_@_t(VEd~1&9d8-}6UYN=-Yf4iqW>FRTZG19p=U3~LBlQ%Uc1&D35#!X0hA537q4Ih}bMn^bgJ_c-!Z-Td5<4%(t)m{N}EuPIGyW z)sBYj5bq9auB<2*%cn$G;(0|C_1DKSm!MG*Mj@cdQPhm2t$U_gUmZwptlHGRV?J0l zPIom|*a{A)|Mw`X=W8;Jq5?1x-#ZqEe$o1G4?wv2?exQeHrI1*Q@` zJ#TkO(hUQmR2;zZ0c&TIlet&qah>OK`3HIMm+`gS2&;Z0iZ76P5v{J(0f&*YzDeBd zznSH%Q2#L7e0}eUiBvG%ei1y-vRdL&{PD#^HW{209ox%P0Lb(cc}RQrgH`VJs8UhhJF%|ZO)Q*h4#|6A6^JQ@WmN49I92DpCFfzyW7 z>n$rGrG`qoa(9PIp@$s2mUr!sw{496{>J@vMjC5(j>+;{GR?++}U`?xE;m+T`I*ga-7ZlD{$8yYq!Q^$40wrT{8IYi%}iB zz(5s*Xt+X=X&^_5L>g6;solI2a{cOpS&~^$uQm`qniP$_Y(j6)4DY#$h+6qwBs)!q z1pG2|l(HIU&n*A$?qz#}kZdx?Fl)KIW{ry}?1ox+-AQ7?Ei=phQV>Jcw8JeO)_xZ+ zIO2Apo1l-?L4FkoZR98Dc)~}}nyRV6J9Zv*p*sa+b(yJ_VST{7Oiq13=6klHP}&;W zr&wuEL^z>Zc0(SSwkkb=GgcG}R8CqNcDo)o$I;rtDZ#KXq4+C#^K?5o$EE|xT&S{H zZ_W9xmDYcoY0D<9z)pG=r!-3Wxtm=Ih)qIpXv}7i`nj_KKjf#7id`hGJ%B535frgw z1-U6$q?2&yUiYZ~C3yadAjd|%=I}XRTvmOiOD~J*z26@bwedn}pM14CuwXA^HCU97 zD2{fy)&O>`4M#eYS;t~YNO1}4LI!PMe+tFSjK8|VdvWNQO%q{Tj{T!DtHb9QG^;;0 z-Db68yyh2PIJ{VX+dWR9TC)2un|w5o*hQS$jxM8SgUp)OOouNy89eJzOE}d-5Z=r> zWmz?xc?AwIkPmL9B%=0U5P6vJvLPsGv-2|;*8$P_<4MH-V6VaEP$*QlGYqXnY*K%T zZ|VlEz#vo}INtKi(lBRvwF<>p0g!a$Ma?efn!s;YD}+uN(ov8lv4=4zp$R6!_NluJ zy2X$__D2tC$S%B_?O77Jx`P?}`$t|Y-T<*93`;rHXIbUW&%-^PP8tRAiKBGI+24X; z=JMxH_g*g24dAgrgnXdq2W{+&q=a= za`7H;X{;ifnr&(5>|7iu2@M9azP&j_QI+Oqyau%u%PU}bD}-bdXk&3!HyUdnH}pX@510E z=7?0T$NsqY)S|aUb5e~NvwmUSvz4Ma$5qBp53&3TWcO%1P5k!u_&z%KJ{Q?=rfA&@ zK(&R+8;cO*li5b;6(}g@_1=FH)d>KY`9YnXcN)N6LBpZz{TGC7_|bY(YOC8tqLFc1 zdzbOR3tf6&;;Iw^4-?I%=lPjESZc;ZI9N7S4ktB)Rb<;oYxdoZV3QF_fuNq-Hn_;vw}O+^x+J$<>mx!_(?^0f^+tM&v(Ecw@q0MkbXg74erF4u(~IQ^%qWSPL8v~i^^N7q z;DbuAoR{QF3Cv%DWUpy8W7y4$_nv1$tTvV}0K9Qgrjk*{`GU zg2l-ajjwiu%i!HpSIk{i{X*9Wn~1FPwT|8mMNPHrQfSzbsHdq;0F_Vpw%;c1=DSfT z5yB9Flsr7JOG&;`=~{r<+zt_y(=QN(i|4ZWN#8CD@az3C2hjV8s;KV3cUu=>RuZ<% zuUAgg>CzrbEcUCQW**idkj{rQU$s5pj-hnvS zxH7JNRVn~QSLs2T5fiOlr7Vifn`66o8+^48YP`D8XF|_FA$hbBpD8hUzB<)sv8Xaos7%l+aeR!Ws_Y&U=RB!j@Wu;1S-3=lV zFumtuaC=rhCYZsrWjc~G8paX*hTk(gzFjTkO%LVWJP}?2#Z^wtuX&ZA{e`-`4g+y< zq_0xW#q5T5^*Y5GcCi%hngDMB?K~pX7^Y%h&Mb51J!Op)^j!NmW+F#c;1~%N))K9Z zqz&cr55w+PSW@87H`ak49+?Uw4LNT>ig_`C0I#$_2r;YWue#@HDj;#*W z3Ej>>?xG0T#dPY%SGHOzu}KO^!7(pwyZP>2-uJ)PgNJ2d9gOYXdG8c1 z3SJlcxA`S^*Ipw>^&6|8*jYTc!?ty8E#7ywO)%~34|8uJsxpo2wTl(y?-hXKC^%^T zc-yM$xDyrJd9tUoSpjyDPCGFc?&%yB| zXHJm^W!F8)NY1UoOT|SG3iCRGNaQ*bK{f;hqjJY{I#G~1*}-mq+Lr<;T_by0?F0W3 zK|)r=ZfmXKhCS@xn;~LFXLFOJV9;avk(b+Azk{3FKHz4?KlRDOeN(Rf1}c6QBF2R` z`@OY=2)FnfLwQ!7hV11bS5Q^+tAZlIC7kzZ0x{yzrOjkbHZ?i1@G-)-1d&+Cy-VyE zQ9Q2>%bce=0usZk60VNi>6KFV$S|E<5{8XQ@L12HEg=fH0K(eO`9?wn?*<<4hO{-_ zB(#E&%u{?us(1uEe)Lb}-9sJO+@Q@zS3$BgamWTYxAv6hG3z28MHn(>3pp}pa`z8- z`f=zh?VX0qFNklZ21aK8>GCImizSaXCanJi@-*kk z>Q7M9cip_|p|#^2PQSmcETH5)(a@r0u~`vmrXOv+{ZRTH3T6uC!hX58#IHk*ZXZ>< zMgR5a6lz>0{!H-43wNZ(G2k-tSPBo92M0%@v7Ud{B7(Z%=&5*9f z+rdp9eTO8EsE&Sb*wWsiOToyF)Tq~N*ZQBpd_^kh6E+RZduxV8B(az-kk<9e9dDl2 zjzKI)R_q?)3KDFx+638Fxd=&(8g7`tY7?wN*z8Mf)=&N-hk3e=A7HcMy8pPRybsfH zY~QG;wyJFjP`&>TT?*AyX4i(di0pO_%BTys`Gtgg&4hSA&l{#IX~gYxl>Xy!8xZ3v z)WKxVP7qt&@=JmhzwY_8b5MoTTxMc)UHoYh9J}ppYD9@9HMB;QdI~0q)LJ13lo{|S z8DAlTxH7>Dyh@a=EX7F1-0iVR3rW>@_FFwEjN1eq{&M$Q)Z|Eu_hxzw2*b+vc#ifF zP6($xjw@z=Xh-Rsl;$fWW(}yn0d5HYo<;kj4)E&8$IT0F1M+XjM&D>P*HTS;6ce+} z1dHXZrvi+sdt+tJ#%5*jmOPpHan3Af{8zdk73%~E~9!PrJ>?n-` zs(slR+6>Z*EtfwK6XibR_t%+m-};K zuXZx=B!VRaqaNMECynhDi=A9y}Y4i0-*s%zL~9|NWxa8fMIR}SsA+wZ24nxKQ~ zDa2pOi$7D!0j+c)TVpaO+FNB@&BzNC-%rcHGPqDS$Xa$OxT5EP71YJriLcd<&|2q= zlQa9COnGXdmC|t4L`$pMPpo&^DC`_z<8AGDvjel?C%gtUlipRp$vs6NGSp^HHkh=q zYAz4?f&#_G^b;8Ck0`wuKxpy-(9&J1R3`qOOjR4y6U%&MH3xqot%MF#;?%zH#3HKg zQ9&w)6H;`Qdv}i*CEUI!0gL0?$4PA~9B1u2c5?6=(gI&C+uWKpjy0 zx!@*kZ%B`o8!MII2PrUR)T=KN4u_Ex+2n<)pa@9lwb#js9?2YE^BbPgf^<}yUH$C< zb#@l7E|v%h6lNu^#_%k)yQ11`-@$?eZ!P0~23@wbjR3y8!D!vnj$~W01~hT&=46?# z(!I!@H?dbh7GBH4LV zZS<*&lVM36AClavqqi(Wl-g+TC}EF$u|m~@qAB8xF5ci}kB1E)`?X7wVEyIZB)xrO zX$|7IvmaE&_m;e3*-vZ5C>o9o%MkHXeTx4y1cB}7C*)_wg?0Dc8f(P%^CT3e{^y=@ z@MyJOKcPw3kz}OwAg52IVKPO--5yP`Il$pw={yXW-*NXzF*`Rn{ z(cmuNN)bF&{N)o(u$GXlylI$yEE|p$?=o)H{-y5q!Vj$URK8kxElkk4O&08}V8DM@ z$1)GS=i(e_(@&Xdj#*|6LcI#C?~xjuP)SGM77+y#yIKNBn+PetwA$nbBI@8 z#EP)@!7b^QNXFLeAa6V_^x+_=)Dcv|Hax>VrO$T#3sq0%g~oclUy1;=_wFH( zE_3||2asQK;@pHU6a!(#5Gub8gpaftSuM`Ulv$?E&|6%sPQUvr4L;ZYKj6eMGNIc) z@o1|xjq!E{Fp&HuLtg15+(g(TB~CFjW|uqd&_MQlwmorsp4{o|J+3w^y3Dh4gkv)V zZ7ytj9C(=S?|ZfTz-@;>iu3An<Z`w8K$GC%q1wv(L)5P7B9k1SL zD#HiLLyB{snWez8De!?qyZK1(Y!rpaUuSzrzDLyAI>N{%eG-0wjSkiatv34Jj6&^XxU(9mmKh?39zVPJ9 zMHl*JwyTjn9_W?-XNlR+WNE!uAKFH0akP9TI*!3qj>L(E?-B=_Y29ZM?(0)N%;AzE zjC*g<9c@mJXsa`#tP1}+tU^S8ylhD_y76TrfD7DthLz*{J` zYUyq8!XNQETDpS7d4vOArJ!siGRf+Ew}s%1fm|Z&pKJ$raOFuL@k<77WrfEqG z*}brc}nY;Pl2h(i_4cc%EnGznfB@=SULM@1|rJZv4TkV(!- zNYf3<>(3O$s`jwgu>x$LVnzyA349M???&TZnr4hp!Ej@^+zbF=EDP@vv6O&MaSI(z zZQ)>uNuCoA63LE`(c~1A-%tXSJbdRKGTE0~AoL6y81oLOSnh$2h^0pp`101>n7ils zs7g}o>UeLtpbsa1ib+^5y>b+q}d{88!0v5VgKRK-x>+6Q6sz+%NN^Y(DFxW4Xz>7lHFBrzB^z~0I~ z)*S%*CC^jJaM)Hb43YhslH2sVVuJ>~oBAz%?VyWZUbWV3f0PA&Gg$PTrSsKUCT%>9FG6R+BYggT2 zO^WT=dxBLB;QI=^>3;nEc;Qkh*B)(uP7}5jXQ|_jBwoWPB!YJSBhH=oc}lcRT+p`S zS7+JI?5mvN1nKyhHlvdAsM!7}9LB)YImtJqNl^DPn2Zt29sKW~e>PU`UO6pi^~RGw zfmsos%V*dJJ6okzH#6`sPdde0-1oIj zo^pO%rzW*A_*;?dpls9Sb`5-HKr18&+;^ZJ)52je7!ZplZ40`rw?~Z~VQsKEXeGLv z7~*f*gMu!B;O|~Q3;@Q-)kjS@5hJG7Z(0C+_2hU~D|Oz}p-_5c+?Q7e-idUlKtZe`Bl&*Z&*tYf+HuNT>jo_$#G|LN{lX$7L6OS2tM4-)}#)juot z$5_4rw%s{}E(_q^&C&*P-$}SJlDu40L~J^xE=_1wp^Ys5@zg>z)!3+Nk<2eVSz9g@ zw|x{`M#r&Em7#|dpL%Dph0qFcsYaJ<_t}|u_I91?YcB~HAxH0_)k61L*KvYkn2yA6 zE=dOcQ%CBUiEH=sj{%>bHOv{A%Q*tCNfK18_e-%eplb5FyGxMc$eks~iO^~!jc!EH zEIWB5D@c237gj5f*1b}Bp7l@lE;f`U2~{8N??e5Z3?6siU^=cP1(7*#?^FM{qZ%~h z`2?*Zg-p9SgOH~zvU-fUY(`17nP_c1b~5u$n~eN(e&JigE+cE3!pBh6SGJNm#Y}_8 zE7RRCj#8JfVKcvYM)E{Ws6{3i--)U5^&P1PbU22;Z02+h#!cZPd|7-{vKM8k09X<%)2AFz2K& zFZ+0aL!BndoX&jeLjeFadIzT5kE$#vk(z z)h8~!;^O3pjhkw(CbRq`2bT^*k{pEFaZ}?DGY_N}g^sI+mnYdIwe5-aPiE|z-!k*M zr9Tm>FtT$*M$~CvJ@fSnpJQ;9x^>aEeyAj;Ubr-4-5m=6V=bSOH5qweSZQgvyD*+O zW0(y3at>1+xGZJf_*om*qgJP&*<WQL=zbbm7B z7<<_JODD@r-UR|5j0j41T|)K*+5(uWYb zsF|Y8Dd~A10tS->fy65h zbEviuX*o14Cks?gdg?^benD+5xLIl6r>y7ZfMg5&@z5bepmc zJA9L`{7WK+ho3B`hc}H#7v3YGhN#S1Y%nEjygjT)fS(#FRid|F=F8kuw#w~&eMub? zVGgFx^pSJqHaCdfss`hc+n4>1Fe45}IE0Z*X?PdMX{8?*BugAd8CBZ+5Z8j z4UvJSP$m&3w_E~iXE5aYp01Q1t-}Me&?nazp7}!n;#9R8ngBY8TXHX*0OVGw$Mw+6 z6;kAiYyGk!*UdZ)WpNN{aiz%08|j8&2bK$PS&8Cl9VANJx|gK7H2&AyBCp*?HRr{U z@H5w!Hx1naDPnmrPIR|Qf4JK8N11!y@U7xI+X5!Vw-;L7EYkm$cO6MG--y$;BQ3YV z3Hu6=CvYj&A7qpbk9WDAV$vEdw+x*`;jJ^(4){rW6olS*HHT;I3{XFED$HXJVX+)l zkk*LkKb7`VtcK^B49>otkLA=}hF!-k!HZQM+}(i;h2h#HK4&Yfc^zJ8uVtu2#a;ER z!&a*A=qbGOro}M+e}KKPoDv&VMv=w5{EP;KIh)qoud=vp>T`t!b#(!2li+fN9%v@) zBUH2jxTlu&n9SzsyZX>XP+NwHb67S}L5?=ez$?~P%IzJmm}i37HiaY*?jC5Uyl*W2RkF&-TTk$3pNyrEydb#Kh94dZuzU%lNNH5~) z+B2k#h1_vZq7LK?zP&3x_YsQY>fnL|od)D{(L34f%ltku->#XA3OMe<@LgB*pa7JK zF(oUs+I8>0-u4dTJrQ<)q02>z>y^AjnxzNbuqJ5g8G&pY#cgOrqmv+Wp}ax6eo2v2 zPy|Ct9H#q%4)UheXY$3TCeg~;jgjAPM=ZqsDbcO7){Qz7>rGb-Qp>Y9ZWU}tms}0& z5aX}l$R=@%smf{R;8imYb&3Y(33%A%+i%;i-A&|;VF4L45=y~fOnJC#1ipKzsJvhN zm;_Wus&vOkRgY{*VY-XtF%_cj0E!14D@=0oQ37>9Rl{PN8@4Q~pYvHR{`nI&q2WVU zsgYT zaoQ%7?mEOs)qzMy(xc(%a$Gj-1f>G5rjXI_;J26$jzoVbwbG3*f9r&6H52MYcbYiv zRnx=)ViY&k?N=lpdH!yFznT-_60utj6=i#1H&Uf^NVRkZU}>J??62tg2rS{F(CwSr zH{FeA-S^;iWN7V^X&S>dOYVIAZ+2s>ueuj>x(4xlNKU%HKnHM-<~{l29Yamb_<&(t zDZ*z-@e_Fipa@zyh2%Q33dRfGJn4imf{%f^W$jN#gu?K9_JCr^+&B%c)&4za&Q}kmZUQ1c0EJE3A9Udq)&lTquXf zCZ%8*Y-Vzu!10r#MZ8rZD4{$tXwQ#jHk6wcqv4U!P}LOR<{6_~^jLsk#Vd?8Dn{)B zv6+2qD^-Ve<@e;|)W?D`GPtD$2yDE^FsmA(k;dl>aEo@V4^>>BOWW`M^j4lu21pAL z2|DCmC-m$`>k*xOAeiomt>eFc9rlttzyfK71mTj{9h#PV6ihv_uKGJ?tN_(%ov0#I za%V6&UKmnrdgul`|Cb->H+He`O}Aie!`+DR?E0f*%6YCjQzrhkH!MrXanhr;*Ab2v zJ|TbMSb$I;xmKTJhdp?nSB3Ci_K}zX>1!JlyZYvHH$+XFTBv`eCT=K|*sIGF-gyoZ zUY@lUr=oPlCSpeLRZ^c0u*HaHPT{;E5cw&MZI*;^r*EmW4WG+y`WXyt{=rZRx9!`*O;%Yx07D#NbLYZd0t`xu$snZ5TQ z&twCaR_V@sL=YWc%nH-#y_S|)SlkuUs%0y-0BH~Ge2(7K(LA8^kMZ{Mf-{1;yu1|x z(K;VGo+=DRG@#KK!9Zq5)@{RQxj2$mbG+KS?lLQd$sl9#QPH*Jyr!SD7K?va*Xkh8 z>52@MW~=)@#n6#QB*ThwL=e$prt7%KD>FAAjUqrT-^jc$RFq`)#57}KRgfW{Th(v! zCR4AFMq>|GTWX2zLS`SljfuE0ar#L=d0%?8hQMye&BUK$H#oqI;ZQnI;9Lx8?SZSs z6#te?dX@T1!d@_+DH_U_g6@tse(}7v28vDC9oy>?nZ3x8I^B31SGYK}-UDeQn~rTF z;=Wa_w(Q%Zc5}^_f}s$36_tnf>a=}7ed~K1tx+8iyflibnuW+!iKm^wvc7hQC#Vrq z{1fwRQbS4P{BHl=c5a8DKYMV;u+?BGOkCvfafuNwU@Rq=kpqvnGZL2?S`A`nd27=| zwQ2NNhc7$8o0@sXQd>Q&dINIl2Z=}McGa;zck)OITbRe?u5ah*k*eD}{|;s5Gg0D6fRznb)br7nCA$*+(J`a8M3N zeDFF_?Fzw%ja-#C^HMI5n|uJ&H~rjGW`FX;Iep>?!F2}cR-Dt7(Q#Xphrp6zIfcS$ zH_E+_`NMNEHdBtDwxmf&+8~2gNIg=_u}g(ccAt4IEulaE!#r*I3;?d-sH;ub$mR8a zV@k=5)iy)$(RQB4@iEk5w!KqC^zS06?K5zgij?I$9@`6YF0@e|oSUK*Wy_pl7{t!e zh3E<$5$}_k0;d*ee6BqLST)j;`_@4wL7RUz#dMss5M$DNO6^XB!62|68|#T}YbVzu zNZ?KQn|nlr;_(Re5#a5PWPZEMtiV91KqOht_~e}o}Rhjtrn^& zM-x3l)ER}>2|T{%+jF(MRM|nXy=gU%Ye6B$^$T!l|rt)uma<4}UmHnuhT}h3_LGmd+D1MM=-s6Zj;6<(>r&{9iO{>#HBR! zxyp*%WrWjkmsu3{isA#?53O!BaE6aRXbez zaw{c`0ufGNFRP==7aJ*X72XrYo8R^s2F7%|zDpr6WkN6PoaL~40BT*fE0SOtXI1+o z$^Ls5I|5|Otazbc)=2XSC`@lYE`A2oi}Nhp#e`I)=QEPi>69x?nv+0;1Jy{RZod!0_xHx?J0%gX8t@~A6AGr z?;2lO1?jzs0t$>x9sXsw9qSXvHPC?ya{&C+$;$)+@Hfvx65|(1C1v4f4=iYcaJ zpsZ79G!Q{pvC8fI*k7ZA*HoUG>3oNjM70q>PuH76Oh|KB+fUKXu*9?-@U*>oA6y z`|O~80lG~S6Ne0ueo8614vzAMwGTw zG`_rPW>*fR&2(AM6#}oBO!|(Fh85=Bv6r%<_lCn3iV!M;STOcx@6|9}QP??k3`il! z%2UdP(jPe<#dqqTO#IqJ7)P=*y9$)Q4qht>#>fp!Z^vmXR;IBt9!mIeM#g(lrYoSE zJdme)(53&iqT1&OUyfPUzfau_{?ovz2WiePj;ks#KvyLrzWb6%j6}__QYG&0)NPBRtw>7KjK0p zR(9O~<_fMyo*pU7`=AF^7^rNUO!9j=!5uQ?H1~khtro|CHdH&95G!N#PT(vtaE|N6 z04kvG#)GfTw)W+;qq*H>rbo}_h7B1R$N;fDVpRtl{O*^ON3XV(P}Q8rpN_Mld2jY@ zKJqh|qFaV^lqRJTX-QI`T2avo!tD-~>;J5a3Bq75d-U|vo=Oh8b#gtJ70l%&JMnYl zP;kvG3&~PJH%vHAJEHR56GnSzoNvOVifavHL>L(UxY4&OF;rpTrP=zn@=q~;Q4&w5 zzRBtb=Pc{+{x4`~INbShHr;5KG~5M}GyO+8Ivn0X;Z={Z6ILqgA33c)Z&E4vk@L5K zW^j0XXdRG{<|kGkU50YBV2+QoZN#bVBW|cE=lK^=s;nU7Db%|6 zKHG?n;j~rZV?=3YL8>QLf%7`SOu{_gFIAe0$(ovKF>+|NldI2SUnz}ySP!F1AQQUF z4hw&MFUZ~lkfG~8=s1!cCWg?#*P`R z-L{A`_j>7s<2vb5oNx?TT2Fdq68@uOV*XLA(My>#@3tQn=p@b9oGD{Qu3$D)YJq_} zrL3pNI|^e^P*6YK(^!yg&y~AP4OJ;wtaxZRgxT*4Go63cTn;`HcPg884CEyn1eRQ0 zUG;ImN!>!H+`UXn!!^QBkQC=|c1g$HXx87Y@ZLi@wbj+_-BRT(bC`GF;VV2Ga%BB- z>B&10**obkotZ`nU9_oQx}Lq=E;TYv%LPt;`lzJ z)aEd0@9G{rn6xv?iw)N3e-@^R#&0Wty#3KBh>kqxlu=SLOC4;)MBOiT!Md_Lh-sLW zR&!xtYr39zx%t`EYTK-&B8mf6>v!4B7-K^tL%rlWD90K!dbGb-g|IS~*n)ahfg>d2 z{@1MGs57+8iWh)Re&i4iS7UAHFXL%dyS5kKe@BB);tJF%TMd&{DAEKI9BlH!Yru70a%;eEH3}t?PwSheyJ;8eq%V|S#0Yq4!B_Our1O$cLkyp?l12u z0lv=rQ`FQ6QED+e`cx_`Tf~B{@9WI9w^yIUT~T?|4Tt(BX={zXFwyDS4VFyQu+2*h@m0G$$eB2 zX}oPx38*>$BWB+l)23;;9v2MhZfhE5V=Cb}Q-x)R4`ehJi1US{i zRI&?#+*TO`nU}z|XX3|aN+5?XY`hgLn7qFp-t9tK%*y;9;A0-uC8Y+&DKGz5(vWvF zL7pbp=Jf9cc2Owy%EUDq3rwZDMu&_JXM)7_6Z=2V=K@4Ki-cBV{k?C=Y-%o3Iw#;(p79)|MbAI z=iFSP%7^B^;cm%#Zk{_ufR;P_NRSSPIvNzTLa+-FW*f`9_DPP+$?FCrlJL?A1w~Rj z>T{oby4hhM#!oWrN+`ocXrGH!)>2HASU{TVF0^-E4LG z2<`a|b^wUo;&kZFhPaRvdxH(4rY8RVmi1qkZ@tL;#G#Y%E0e{Z5`H<1g;QDV1Rdan z(e4wcD?emQ654tAvV-b7o27}?O}ziKnXcllR@4+t23Z~aaEv82=nKvNNLCdP5vLm+ zq;0sDato=6fBF-1XLsg>H9j*ZKeq31dChc;);~$sj^XZaf}HhXwER8tVxZC zy;6DZy<1)29VON&eE7E%E9Gjb3;q}2Y?(5(uaggGEGhF$n~^QJSiy~~R6%eXHm8;F z_s;F3U_LKucwb!l>cSHy0`hWrc>Gt4%%6C0&lrU0*z^G?NI)4O*~ux#W1b6 ze1fhOW$?AadHah!UK)!GGO0?EpwRWNeeZ4mL7gL(3j353?&FLi^#l=1V>dFt+>SZ8 zlw=E@VSf>Gr>Ut;3hjCz$ig(Du9PXIX(%^qwfV1z6{G-nP-1?GDeWq+LGL6P4p;xi ze4}IP*A)6{{eC&eHlw&;d1_>1+glR#ROw$+eoFf^^H2Hxj*)i+A!;0?J$xS`#x?Op z$KxZb_vB>F$owUtOE2ZmB4P-_LT3#n=E!rvKJMtD5pgA7lsXnktdMne{1}RF2PMHU zMwqpgL|-?4Juc*9gHK&3umW7h^jqskZdPCrw6(r8y<-PIGNr7AU-Gz-^FKOR(W79B zF4b|u;Q{Nv7Ngh9zT;TXLCt>EgeQuI9#3yG;aDn&k*KWqOTe{lJu3RL#9{@9&o~jcm$mlRHU{06WZz(_he|{XTWA6>c+tuGqN|IT0bH zenoBB)z#W8T&Wl)sJ>bl3p4ev(zxS@;j8#qsYZ4ZslJv`=;JYb&2zhH5-|DUB|7`r;&t3UnbW`$hhn`dG7~tPf{s4o^57K|53hPP z$@+cP9oq&a+e!g+rFc;9T6RSZW_5PfqbBoGekt_dnu>wD`mnN%nQK~L3-M^{;3#lXgo?q>y{Mpf#t~0ytb_PB_iGVMwU(Y zM}~l1_~gaDS8>H{=g`=23&F7Jz!+WcvhBmN*u|}j28}`AY9#_hU=ZWFXMS_|AQ7rJ zD5$J3$(lutvS~}g{_G+W+KXg)-0!y#29^Z;miDhkSDHwsT4`Z3_@>xKE=e9t4tv+ju|c2? zV;3{0h;qBX18Z+@0JP0t2F)~sA%n=JqgIjLx3Dr*b2<`Q%C^9tX^v5>h^R2{v0n)B zW7=3GGZVHhcYe@mZMtPlogMMoqa#+eQ_H`6{*}3xNM!0v2U8@nz;AB*Zs4TOA*>4v z%Y!p|DwoE84QEoC!KcARr%m;vCIUic%TpQYrc&x(_mu!Kp$l;i;8^`w@&vt#t@_IB za=F2cPr3y>Ea|spSAx#pTG)JhQW48gUAv z!A|)oNrRbwc+h$7%s}TI-ru)cCy&ZDux>5KUjX%AuhUB|JxQ2KPdRpzOY%i{MR)Cb zMo{m24Co~ue$d8XKCH+Jq}H(06>`0_UakVGB@bLNBbZ(*8hOZa^H%&zm!JC6@{*`XXA|k3}$0-sO0FC z1FsHAtriF;ESC(&3MEgRTl#%Jqq*?4Rp|eK93s>r{;vnwdqM^s0M7jlQ6_IJ`*acg zoE-n!8&|`T4G~LwiH=&3%_c@!j4un8%8l0!DzS>lb7m7a-dVcCGjOll9;=Ou>*?3?+s>QskoT!07gh*} zw;&oSf%Z58Pc4-;`^Uqh>S%$>9g@UsRlmYuymD}nzJG{ffNZKp>LTZ41UT@Zh5{!~ z-Ugi!P)y>0=tn{4)4V21(T!0$^;i8gC)V>}o_SE96I!iahsv=G@e4Et##1lYW5q_u zPvGEhY-YGOd)y?kL0>8HCwyxAs72ltk`+)jw zpAbp?j^g+;pc%7oBD7th^lvp_PCd!+r{%i0yh5SI>w(iHb1DgKJmKBT9}EYx*)`!6 zsL;#5Eq_AJ*cM!R!~5jah6cBHUe%-5i>~0VHH?GX)~k`7zKs8ObS{oe{r?|7v)Nph zThwIkE7y;Y;iJuU$Tjy%RLW&UebJcQav35tvl&IrC3m_}3Lh0p<`zOxDB4&Exl{Q5 z&iD5Ru(R{tdB4x=`FcH{kCmi5moK!}$1|ys?+lJ2!)K+!D2GS(xXwy`7`s-rJ6=sfOmi@$ed9C zPu`ku0);MjN_kf?d?2Tt^|ZKosfo#8?vq_kMHGG^*|L4Lu+@Zk>4^6IiC5u`r@{w#7&hI9b*x7D} ze5ugcP=%8REtc%5jSYLfM}a?wH)>zd-L*`@3Rf220}_1wQvY&j206cKxa#2a6mqY( zodP$E+uEp%@_E$_u;gy${Q6Ff|1S_vHv{Ct-vQ#fcZAbA5Q;P>unmGy5jl#{?n)}M zE_PRp^u;!l$n$o+UmZCpWdQJ6GkM(z(YSr-i+S4MUo7!?_9tfFz)2}zK@D&Q->mTC zuNu4B{+kN&?H;9q$eTzU)JU$NRG{*b&+eri7dnLZ>z%EfjOJ0=%bZcSz+I216q{*& z<5&B&iUR?mRGrwt(VSk2w1TNpgxSTL)pj-=*`HrLlN0ERNVr)orD63X^|_#YG>bQU zxBrI34H%$5L{0{$*h>Y<^D7*Nk_QC%cZ?fK=3POgmf?-SI3i2rN-JM$p{I;M*IYOG z;QHuV71xJ(JrX82esGDRoL@dDtXq$e^OD8>PTH(HPh7igD`9&yMc_-c{7NEfu3+J* z_O91DvyoG6cA77}=PekM>5o`kAqeS6-@^E1t@og$2c0ffmHhixiFzSL;fYaGc&bC% z8Qg@XXYf>R9F0wzV+AN$&BAEy>w}Ia=@dS0ey1N{X_F^i;ZTH$G zxv}8BHQ2COamF*W!&8A97%R5{{Bq_$?!)ZZKymlg{tIZF&=Ca_!Ez2>nWIbc@)W97 z##9(fuDbP9t6?mzw@Ln_vMd7n9Qfz1@n<9y0N7LVcHUt*hngiSvb;saMKDU<&BfYdQR9{+ZKg?jef#k;W0Y!>ibHL0q_Ly7=$HkAB z?NRPfcl3$FN1!BR6(oco5l%62VXa~3hYlpYh5h}zAG%YS9r!QhsU;Q;R!Q2J8%>v_ zcde^G-D|m^V-EARP%)2X@BVg$`@g%;TLa^Y7$A`clE8jP@BORyfX0{w^7zQ8#;Ma* zttoV!ug&{vPoIS-noTuQI)mieN;a!aghHKN$j!PUM;8~sK#kLInZoEad3BNV%Hykc zCW-KAGij)-@w_)b@wo|c{YY354)^;zwa%6@5jy~^d@br!l_?Jq<1%UE((}a|HLuSf zF6w*{kuWG40=3k?$?~V8)Dn-8H z5yc6IPHNS%K-Sd zVXovxHRwe3bW$Z0W1dXCsjLubEU>X{I-HjH(9=ITH!hbv`e#(}8_6|GI5o93EPNEY zaS*vpu5XYQW~7-G0j9hT0xwFJ@wF^?YDmyUgfsY_7Biq4MMBgAVr-*7Zbuw`w#w!` z@lZBy1692f0;!r8GF33V=7pp#R;5Ks0o(DY=_4yg$yu;rwJgcdZS;x;02=a8O@5yF)|Xo{YcHW;CFtMRI*TC}r{9g{hDOwg0)V5cROUGE@kd@0 z?zgLM9XEh<9jt|~)Oats3?^bXtH8PInTF;R+;%mo!S@LE>7n;5ir~TDziI+Lx8_RH zqLNFVe4-w@@AWLeH#Z?>?jHRqpBITFC_RXV&Rf3etm~u4zd-eL84hb4fuh^t?5V;HI%2grB1D2X-?30P%7UCZ})rF6&9J zm6^jJH5gCHWV~(<0m7|=yFe`a@{@=tOR?D9go(^@5j}U&|L!p9ImoV!#7&` z!w0ggl(Wf$V6suN$eEswNdgB|#pmJ0poy5Xn1iUw0pOyeAS~4ddokG#CId2z~t%(t>+9EYRKclrp2j{;>#Uo_=#4dCupQIU+Jj`f^lwshv=YP7+&a24mNZ=ZzjcXoQnHx?;ezUGP0Pb1Sr?oiVP>Lr+JV+Pn9n z=qE))5XR~!_`PzotX;7~oJXg1_F7aZAVC2D4~RaJCw^POElT=iSYQCiFNT(|M@LQo zoeNfO`M4R%%5ZUIw@^u|^*|IYp`nCFkkADt!YSb_TFZQ@(_NkU=iXM;h&eQ*INW6| zS!vx-G7QFA-bAcRDJ3`F?m+yRygtNNFJKzoJRMOE0v-nl@iu&^tk54$7lRq8I^56; zJ7{vrqf^!^61H#>-|Z#p`dxs$3`y@V9yggxQujJt^rvZA8Q(tWSTaCqDA=lzvF$(^ z<%9*(^s=8)ZCnYiabW&9pUvmwL(hUaG{OJ5bQhc#+%(UI4*&zkb=u?TL%r7aBtzcb z?-9pvN*W@JD$5<+_((U6q&=dZ$yU zmJUQ(&8)yU%56~khuWib505B-yCJJ4Om6X_XzPG|YOrBFZqYT#3DeE~{67L#b)jf) zshHvQKiA#;?RzDUfE(T_P>dg5XmPTpeF5Jfg zxQhhD#^TOMPapIZML7+M22q0)^uxEB32WF9Su7Y$q{{(b#PSDp#VpxS)X-^=43)9@ zCHq5n##tJ2rM!hhQ1ey=U%|7sDn^_!D3}CtR8^L(itk-dr4`(dYHZEq)5dXFTey`2 zzI>ll1sEj}oN5e^E8c)8gzmo8LL9$GUHwuh9cWn8Ox$)N7{9W`S3grT5v}k zZgK3}m%IG~>^^l2bat|3W$a1qA^}-!&o_HC{LKtG%QlAhHtw5$b`3optZY=N)3QWq&{ft_5P3$P__t{zXplzMAOWia>ww7q}iDZ{8C} zwR7fnva3z~cJ(SW5!;%3#JU$h5PjXiH1eRa%fRaR4Z3MUvk|D(wq3F4)u;%NvpZPF zJVDD3ja-_jPhsE(J#dOno1DGx`Q?V`TMo^*;D4dXdkw51*cDReB@Zg=G0YL%HLBXrw^Xxac$isN^N06NAkMp6G>$kbJovs- zig@|x)ki0PZ9~S+pOLa_3b7O3b?Lw_gK1Dp4`2wuLU4G2@daIa(j%-7P%&%;z{K#< zrW_C)010Ty^Lhpu;@8+t05+>AR*vzntpwQ0Xj07ga{5#5n;m|;B}6`P_;!+xQ89d~ zG-Z<51ST=V>R)UKOw~X1tT7_*Y(4;x>Mv$57P`j#W_aA6&|)iNBL52nb7X5*^(YN6 z*nlnK_+TYpgVHl?t4IRdSjTDB70EAPSE~|?iHqjDf7vrQblg>+D+l>~-Hj7koBi%r ztRcygkMC#c5(2L<9UuaCn$J3G@JtLY+6$Q<*;C6k?ROjsAAm*}Mpn#3IQ8}#@G1dh zc??+hS2ra+GLH5YF_4Q3xSlBav1{g;O7LRw*EZg#@>u-aIRzavWufp92rN_xr?0j`c>VufiKPO7V5O=BBA(+w36Or z;S>vN#p6BQkT@a^|1)7e^qWlC879ev&cpoqv%Ocd?l=Y<@zsGwL21TUM7-)%&C^0s z*M1XKR!gH!$VA(;Ht7$MoceZh;)NJ!iE1cX-fYmwUA?o{W7yI0=MpD*LCsyFyblUX zT#4zp>cg(&JCWHN#+YQ%&nu9UT89gjQVrm_4hv58$|ImN!Tz#c$z1|pYHP$^MYKvW z+0j#2S_@blbR`o+0+Se?sf;1fa~?_e{4_=4c=cS-i%FH95f3CfL1V&WZ;5Dr`FDG@ zpV$5KU#t&3(E19I1`91`XrE3|T0spuV0kaLBBPwZIbn$xF}+DEpD6zN@fcT`siqM0 zmvRuAWUA>-?|T6cRD5xJ3Ve#6NCIsy<)Y43FuYj5O8#z=ZFQ4s0B*!)&!)Jy#*ZUl zEVqClKIf-^OIy?gNh*1M<D?*u%B;Bn-=AAFu>N?dxs$zoiDy6Ok!cIe?+ zzuW4QXt^R>wRf+MQDb~=_jMxe>!f?Q%}+O9dKv_Oj~E$$7G%sm0e5 z^~#(f>PwB&p(q>&y$+&}o`OgNuj$6%lY76jvVv*SVo)Y)IUo|HO~0{GPjqe18Jg%o9Qe zJ+_K4HgIk49olVnW8_bzf~R2?P#ARwqu|SzkJtMI%jnj+r%N|r&^D&lbhz+|AqC!; z%Ie?`wEzZOxWQQf**Q&K`AU%^h)DHmPh^9~es%S5UT&u>weyA9U{g|9zNG15W*4OI zZxz{?t;!%}lu)n0eBZT=QiP&Mm-O1V*!X_NzHytnu!c@`-<+HsmzCpGX^zgwICYBd zyL1iQ_r@w>(QhoIvNLzBB5Xl|;%cd2xMD!>1K;?!U|KO^bzjxF!;DkP0dsehW!OjXDDw8;4OcEz|rX4K0oH)J1l zng0HW4(Ms_+;K}g1hV+r^iEU$TugLKu=+ri0KjIMs_)Oor=?8w1<(n`>(&^uG?@h% z-x@Gh{rdhU5-&sZl$LAENzKpqWYW=VeV_z|mQ#gHFXte$*gI0qavN5*Op*$JCUFFT z+Jmb>pQ)Jy!Kf5$N`kT4y>_9eM|v(nd{8EB7ghPrV9Ukq3%N4|>tHY891C?DG8Vy; zRsk&mE@45`GSY%OmxcxR=D65!C5h@VtM8()>qD?dv-FIo**@+Fdt8sAxW z3Jwt!4pvW$i73y0^#{4HUvt(=g%73msj3q?24buFPtv1+xM}iOO&KAXf}utNoM<%J zE-C|srVx0wh(~~kh=9jLN?dqJ{DEHbEiqIihMJS8=9N9sw`~6M2%0zVunq|2N<0); z_;%fB2>Pd1s3L$Wr*k>$XA8eMeOkhL!T9nCm>N-OuXK5H8@E*z>c0@*<-&Y^9lak1 z?pc$<2z4)71;_YU-Rj666en>6tFcn&0G zTB7B><>hC6D$6$9s|dPi=|F$I4!z`0eTy#fc#eua3lxvy5?*Fdo{z#4HX0f&6#qkN>z{P4ZTF#Z^o zgT^iu)htYC7b$7pJl@%=eg_=HxpMID&)z(!w6sqWm zWkn>(571eBrB<=ix{;-V1@Kv$$thbD8!UxWdFCD&>dii_1Bk2f$0F(j{!}@(AXvjV zKQLisAp6@_iY#+`bXxR|Va%ZY&_w1JbE)MiGTkt#IIqz8=H&o~Z+~fQD#+(;;D3-} zC4rG1`HsdQl{8~3Q#Tu0-6Q(hXX(4)DTaxSQ~i?CQkgCt>_xNqP~rX@dMR&B52BPk zUBVoP><&k{zUwy5seWW-gF%?3_e@7mC)r&I>saeLPvz${y@J-KTPx?g_KMgQJs2b) z9;xg#_R`4B=zzab2aQ{6HlF^}=s-bUG@A46k<~q;L3RBzaloLdk%dw@|uM9B|}#pv^MhK=oO~wZ) zsC=3GCuq2?7s~w8m{gFak~a0JczIE9yl$Yg#f_2k3s>RG>+eq+-5(a{1|okCVee;Y zB>qZHZ775bKu3n4zn%N-YGR(rO(Ov2%0_jY7F_NhS<)=Y^gd=<^jt>WlL4L|Cd8p| zI%uSMaNZvN_)v$tJ50ihTf|m|B?e`A&mDIz@9V%k!SIZ8W*nk?io8w#YLWj_ZG1C? zY)4& zwX%1uJgU6}6LeL2(2ONw9q!UCm~Wo4I7ThnF=8b~3Z{=HG*mmAY%Sw?;22VcCcF#z z093)j0K+Ge=|_6d;BXO1HjX%NbK_YL7|Ln$|22tWM!2j+`nYKto;@<5=Vm3Oam1k< zcM%juAeMkPM$_uTeQ`F911ok^w@J6FXZ)KD4tO{UZr6-OQnJ&;?}^eXc)0n6>l^P3 zh4xspbh%~-IahF#qnC9&M4Qy6t)eb!NLXQC^*MN@W9|3KLaH5f4FO$o@=xaNsbV^H z@65N+EG{dk%_7V4rhiy0luxuD67u)1@%|6KK!*dO0``GgXi;7Ywku{(WwojglU2!i z!%J;WLHuc1CJ$F+Nd17~Jut=D%fbGqD(!7n(t7+xs7U!wbfol!VM=ee$+h|R`H@!| zRa4!L(R(|C$}su9N{bhIfxAuix7Y|~abnSeH4h?rO4~hJ1v4#jumPl1Sqb&gY#{9S z|7$(#iT|q0Z1QXG20(RawXWy6dpgY`MLP4MML3l>vG&d$nWY288y`g(A(LDPu$mN$ zM(da2ciIPMvLgK?Ld$)9EfQv$=W=l$Z#^^Ap2`(as9_U#N6h=g|CV{s-O?*MBW?N! zI0we~oC-7)AHVKeZrLbX+sJ)l1mNevA*+jMDJPa%AS#q?w9RflxTcrpd^MtgbZp6E-BnfWL4+jW7O+xps+E8w2uzJwx`GsRuA|*$v}8mQz+>o{?3$1R z$xh#g5$uCjx{^(Y(QqWrHml3^uvbNG-JPx$w;PTrr>>nJ=J5!doFxHjY+FZ z-@6a$qLXGap4Zj-{hEyeXu;#o|6{v??!v~BKr|kMvJ7> zd#KeeJtWKo><{c;aXaCai}$I+J4`5qB80 zeGeyl#h-9J8e^$$#TgISkjs~`QI7II@cNmW8@HO{bF~uxV*ib;Lwf-00iOZySIrqq z>RxwvYcLq_5+rYtx(FhbZW$`QQ^p=oH$SOdtV_!q>VL{qS7n+S9_jLtwQlm;s6s&O zP8QZT{q?z({3D_6jDLX8VG?yZwY`05v-Hfd2}$)>yB6n)>65QTV&?Lm{atWGis6w( zdC6PV8+vC0q9>LSP@@g@qN9YCz@-3s13*l%R+(=vh1lg~*$f!9<)2q(rLJ-IHfp#G zhR~xILbFz88Yw#AD_Ob5W&bc3=Yl5tCeXgDM7_F|S?uA4xAE^h>t$8Ng|#nK1#gG1 zNrIs@=B9V_mLA_R)%%Z3YyA7xWg24W@H~ zxAzPfkW7D%?i6NX>Gu#gSUe?3#QI!_BcWU9^z0k>1l@R_z>ymjc`IZv=LX}`?@_;L zc(cJ|r^4ANKMNl}@^`OGGL(c+R-xNU*B-;Ug`CG|5rKRTkaV;~_VPpdpYL|)DQ78Y ziOzsT<8V;cr>6|1$mu*--)mE^*s zabkq&tZQW^9{WJqmpRUFw7T@|Q;7=GV5ab#@i)B5RJ!pGKxFoUp#6$)3waXBircDI zviCB&Z_Y71y1WlwO3j6Ir3a%V2>aqU-j^b}%Xvk#$xJ;Dai8-XuvRKOAH3#4=PQ2sh& zgpYzjHWP2a=!VNGrQIvU&T(wwwCy_H5+T)=x z&B24cG^oUmA6bXx>y+m7g!vlR#+QlD{Hw6e19spr}~ZA~uiyv4h& zGcq~~5)Fgi0I=XRLpZEIjZc&&wOUIdsT0k3H>&Ko_kRHkr;H|{BcQ2uEoO1EOp^kl zU}K%(*i>*^etTt)-P>{X4wO~0aQPj`3;W_zx=TXXb4NUePEl89gsEsguqK|d$lgKG zDQ!tRahs-h<_QAUx8M4C1kLVr<2cISnk0EaaQhZjFulZLLUOpjH3iy%4hN0nXrmi1 zQ!h!1!BOPmGKz|;XWfdCe)x9tAiSIzPE@x+^I_At^4Mv;` zpF+yT1P-x^bxiYtb7zwk+W|DI1~jbT6iEHJkeq^52H0ge_xP#CDFev%GZw^^JX?Qe z5C+Cyb(DsRDFlT?>$t1}QF_vEhuVa|$0C#@#~|&?WKC z05{Vkn!(Jj3}?p=t9EAf*O-NtvqEK?R~+I0$XNX(s+NQAJ|{9Enus0-6^l*0WIfSi>1-vlHqATL}lOGVyDs-UvMFf@!w&8v$geJ7H0 zL;3Ub5&a@Rf1MxO7*xtYo8B(_#}b+78mm$=_R18T4+gT?)M+jJ;?AYJU`Qb>&~c{A zhWC3&QJAh>;ddUT!2D+V2vZ%Q){E4)HCmtFb)J3sH0iY=u{ih=Tp#(?7x0yP6?;$s zigMYsMDIFYZAhvM^O!bziC{K0kPz+=I0-#vG`K}h3E$kRA<}IKVA?1SBc8KmJv4OW zI8{{Jmlk235Vs#U`q(RU*Gw8ETzpjO+!TH9!?GKbxwx@+c_tuu=K>2fCPT)<4`NF- zO%tc**P0R0Dzn|jrXpbJdmBMEPz=Kx5g$A4Bkj^H&7z;Tp1rEd2bR&7W=k69dkAXztX-`3@D zlgCtZg7qiLVV+-0;{5b&Xim7(C7G#@y&R)!T?n5msfJb@aT6~#`Zly=wOT?5^gcjP ze$>=)2;nEb?Ngm@fH>W3@e`v%`MyTeaq{FQZm;%^97&U}`u2H+(0OWP72o;Ufw_=e zz%<7+AL8$DPnQ_(N@6I5yHcwAK2rbz<$3%SwPEV2J&gfrbn?5Nh2^6rFLtpP84ZdSUzI>x9JO zgHficaIWMFD0%W4XXtyu!$(?t&#>m*o+;MVyBm@UM~PO$h(4BtEne$oq{-+!rIYv` z1~U@#Vz5@7(Rrl%uOqAkaTD`7agh;i1wt=Qi*^1Nuuqf}`re(Zag)?L5q*?x$+kEZ z!LMo;a*JXM9r>N*ub+74&?}p_&~LS{lD^>rkKQy7C4$Xv(%>S&`%WC{PDJ)SLZGuj zabhEe!boGRc89irgyPtP=K??)5#_55ACCJipY*F*r4MB|zU*uZg~V}8F9t&PdFjVK^5R%*+ zOoN|{9X6f z!-LY&WmyJ7vjsC}ZZzQylX)Y84)jX*pvyZ+XXun@L7l+v`CL$E-HqN`K+PO}D}(KtJ03GI ztZOL=Ib1Jpi?y5~b;SHN^6GTro8weQYYaM4S{b^SrCP;jW0tS1u%@FO4u(B0I=l+v z`)BIU(-~>(7>l=2mZhol{tcMh*?rc6Pj{Q7gY~#iH_ffWzBuEX5GMlOyBiY7!C9K{ zHE^oS$tSMS#e7*BgkTR9w-pDMF(HA;E(N@0nzkX8{Cm_*(KEP0amTP;KONP>dEp@G z2JtuJg5bfYQf^JlDfpVux%~}BJ{N#Scj+EDfM4t}SF8eqIAKwrJGr^&Vr?K@peJOm zq}|aKfk2Fc9}dy84sD@}-sy8a-1L62__PF9 zr7RqIHdg{wi?m@oQovK8Nyh)4;?YRgvd1`SqviG$OG!luv9jZeX6w$~(Q7fV6EXg*uE9#~8#$A42}oIS4)kT9v`!~+3V_N~gu8yOv6#N@`=7xz`mDB`DF zLzqNpoA2Am4%~r(OgbQ&$Mo9|aNnXBV8`oU7W#VelKU1SG7j$Jcj^1R`P9qTsk)1`iE#U=Vl z`QY+hluFymDbV!Qic2~F_)2Kqo0A=YoTm|b6jCmSClX5Q=bbL7 z99uSg=Yu8S$!PD@;g+M;M0DwbCR10ihF0Z5CDG*Y(IDWuf0nBB<*pym5>`JGMyS5u z3zhVzX%ipw-MLZt_ma+hPmc6@-tdPHyt(O6)0%NSnTrJf0`jv%(jJ1_B{|iA2k*$Y zj8tC&SdoBm=2UEV}1KOdYF~bQAljV=vj_-_x^Q zZPjl9?*Jrl8=T+ZRbo^z@+a|wYf=I-85TMD4XkT(;0G;s>qxN4#kxb0?D@MHcE>_1 zO%~F@{Q5i>+e1Rkqj^^Dhkk_9zHtaL?%kcQk5b~I=Cah1#onr7NQZITdb@Xe9a8hD zhsx1$;O-+f`&|OsRHNKB_77jHQS!Dyt{^JxhHRq?;V>+l`k^duVyzZY1t)`jS%V0Z zrEd7qC~V0^)v{#KFMm3Mdh=mg26B0oMP+ZrOT3ecNmy`2|Kj|y{P!vLR@@dhE3MK; zOLvxb9#I?){*HoARsADQhf9)k?AMbWzQk8Le1_?RPZ{z*4>Ip;7YemzurGEd{oPAX zRZ6#*&6D0lfHSpe;5y5`e9&nwm8#U-J!^|`RX&RMVG>b;uMsXkg3BnUKD=vToFoa$ zFM6PI8j0v%UQAXkObXn$bVM7C&UbxObOgE#<|-)&ailMvdu=)(d9S9d#wNe%mS-P) z+SJo26QjejaPxPzgyTHf;SP`!ZzLVJ~zdSI1H0Yj9bz*vlJJ zMwkF}t;&$-ukZASx55HNw5>Io#*B>(z%xKcb=xqoMKxe+k(y*WaDVbxBr=&ktzI&N zU?n!X*jp5e-j*t8KwK$V&K{pmYu-&;JL_IG3mZ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/defaultData/httpTTS.json b/app/src/main/assets/defaultData/httpTTS.json new file mode 100644 index 0000000..a249a3b --- /dev/null +++ b/app/src/main/assets/defaultData/httpTTS.json @@ -0,0 +1,62 @@ +[ + { + "id": 1598233029304, + "name": "度小美", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=0&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029305, + "name": "度小宇", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=1&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029306, + "name": "度逍遥", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=5003&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029307, + "name": "度丫丫", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=4&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029308, + "name": "度小娇", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=5&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029309, + "name": "度米朵", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=103&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029310, + "name": "度博文", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=106&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029311, + "name": "度小童", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=110&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029312, + "name": "度小萌", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=111&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029313, + "name": "百度骚男", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=11&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029314, + "name": "百度评书", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=6&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + }, + { + "id": 1598233029315, + "name": "百度主持", + "url": "http://tts.baidu.com/text2audio,{\n \"method\": \"POST\",\n \"body\": \"tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{String((speakSpeed + 5) / 10 + 4)}}&per=9&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=1&vol=5&pit=5&_res_tag_=audio\"\n}" + } +] \ No newline at end of file diff --git a/app/src/main/assets/defaultData/readConfig.json b/app/src/main/assets/defaultData/readConfig.json new file mode 100644 index 0000000..32c8ea4 --- /dev/null +++ b/app/src/main/assets/defaultData/readConfig.json @@ -0,0 +1,52 @@ +[ + { + "bgStr": "#EFEFF7", + "bgStrNight": "#212021", + "textColor": "#383429", + "textColorNight": "#94969C", + "bgType": 0, + "bgTypeNight": 0, + "darkStatusIcon": true, + "darkStatusIconNight": false + }, + { + "bgStr": "#DDC090", + "bgStrNight": "#3C3F43", + "textColor": "#3E3422", + "textColorNight": "#DCDFE1", + "bgType": 0, + "bgTypeNight": 0, + "darkStatusIcon": true, + "darkStatusIconNight": false + }, + { + "bgStr": "#C2D8AA", + "bgStrNight": "#3C3F43", + "textColor": "#596C44", + "textColorNight": "#88C16F", + "bgType": 0, + "bgTypeNight": 0, + "darkStatusIcon": false, + "darkStatusIconNight": false + }, + { + "bgStr": "#DBB8E2", + "bgStrNight": "#3C3F43", + "textColor": "#68516C", + "textColorNight": "#F6AEAE", + "bgType": 0, + "bgTypeNight": 0, + "darkStatusIcon": false, + "darkStatusIconNight": false + }, + { + "bgStr": "#ABCEE0", + "bgStrNight": "#3C3F43", + "textColor": "#3D4C54", + "textColorNight": "#90BFF5", + "bgType": 0, + "bgTypeNight": 0, + "darkStatusIcon": false, + "darkStatusIconNight": false + } +] \ No newline at end of file diff --git a/app/src/main/assets/defaultData/themeConfig.json b/app/src/main/assets/defaultData/themeConfig.json new file mode 100644 index 0000000..a8826cf --- /dev/null +++ b/app/src/main/assets/defaultData/themeConfig.json @@ -0,0 +1,26 @@ +[ + { + "themeName": "典雅蓝", + "isNightTheme": false, + "primaryColor": "#03A9F4", + "accentColor": "#AD1457", + "backgroundColor": "#F5F5F5", + "bottomBackground": "#EEEEEE" + }, + { + "themeName": "黑白", + "isNightTheme": true, + "primaryColor": "#303030", + "accentColor": "#E0E0E0", + "backgroundColor": "#424242", + "bottomBackground": "#424242" + }, + { + "themeName": "A屏黑", + "isNightTheme": true, + "primaryColor": "#000000", + "accentColor": "#FFFFFF", + "backgroundColor": "#000000", + "bottomBackground": "#000000" + } +] \ No newline at end of file diff --git a/app/src/main/assets/defaultData/txtTocRule.json b/app/src/main/assets/defaultData/txtTocRule.json new file mode 100644 index 0000000..57cb4bf --- /dev/null +++ b/app/src/main/assets/defaultData/txtTocRule.json @@ -0,0 +1,128 @@ +[ + { + "id": -1, + "enable": true, + "name": "目录(去空白)", + "rule": "(?<=[ \\s])(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$", + "serialNumber": 0 + }, + { + "id": -2, + "enable": true, + "name": "目录", + "rule": "^[  \\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$", + "serialNumber": 1 + }, + { + "id": -3, + "enable": false, + "name": "目录(匹配简介)", + "rule": "(?<=[ \\s])(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|篇(?!张))).{0,30}$", + "serialNumber": 2 + }, + { + "id": -4, + "enable": false, + "name": "目录(古典、轻小说备用)", + "rule": "^[  \\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第?\\s{0,4}[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|回(?![合来事去])|场(?![和合比电是])|话|篇(?!张))).{0,30}$", + "serialNumber": 3 + }, + { + "id": -5, + "enable": false, + "name": "数字(纯数字标题)", + "rule": "(?<=[ \\s])\\d+\\.?[  \\t]{0,4}$", + "serialNumber": 4 + }, + { + "id": -6, + "enable": true, + "name": "数字 分隔符 标题名称", + "rule": "^[  \\t]{0,4}\\d{1,5}[::,., 、_—\\-].{1,30}$", + "serialNumber": 5 + }, + { + "id": -7, + "enable": true, + "name": "大写数字 分隔符 标题名称", + "rule": "^[  \\t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|[零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[ 、_—\\-].{1,30}$", + "serialNumber": 6 + }, + { + "id": -8, + "enable": true, + "name": "正文 标题/序号", + "rule": "^[  \\t]{0,4}正文[  ]{1,4}.{0,20}$", + "serialNumber": 7 + }, + { + "id": -9, + "enable": true, + "name": "Chapter/Section/Part/Episode 序号 标题", + "rule": "^[  \\t]{0,4}(?:[Cc]hapter|[Ss]ection|[Pp]art|PART|[Nn][oO]\\.|[Ee]pisode|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)\\s{0,4}\\d{1,4}.{0,30}$", + "serialNumber": 8 + }, + { + "id": -10, + "enable": false, + "name": "Chapter(去简介)", + "rule": "^[  \\t]{0,4}(?:[Cc]hapter|[Ss]ection|[Pp]art|PART|[Nn][Oo]\\.|[Ee]pisode)\\s{0,4}\\d{1,4}.{0,30}$", + "serialNumber": 9 + }, + { + "id": -11, + "enable": true, + "name": "特殊符号 序号 标题", + "rule": "(?<=[\\s ])[【〔〖「『〈[\\[](?:第|[Cc]hapter)[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,10}[章节].{0,20}$", + "serialNumber": 10 + }, + { + "id": -12, + "enable": false, + "name": "特殊符号 标题(成对)", + "rule": "(?<=[\\s ]{0,4})(?:[\\[〈「『〖〔《(【\\(].{1,30}[\\)】)》〕〗』」〉\\]]?|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)[  ]{0,4}$", + "serialNumber": 11 + }, + { + "id": -13, + "enable":true, + "name": "特殊符号 标题(单个)", + "rule": "(?<=[\\s ]{0,4})(?:[☆★✦✧].{1,30}|(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外)[  ]{0,4}$", + "serialNumber": 12 + }, + { + "id": -14, + "enable": true, + "name": "章/卷 序号 标题", + "rule": "^[ \\t ]{0,4}(?:(?:内容|文章)?简介|文案|前言|序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|[卷章][\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8})[  ]{0,4}.{0,30}$", + "serialNumber": 13 + }, + { + "id": -15, + "enable":false, + "name": "顶格标题", + "rule": "^\\S.{1,20}$", + "serialNumber": 14 + }, + { + "id": -16, + "enable":false, + "name": "双标题(前向)", + "rule": "(?m)(?<=[ \\t ]{0,4})第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$(?=[\\s ]{0,8}第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章)", + "serialNumber": 15 + }, + { + "id": -17, + "enable":false, + "name": "双标题(后向)", + "rule": "(?m)(?<=[ \\t ]{0,4}第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$[\\s ]{0,8})第[\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}章.{0,30}$", + "serialNumber": 16 + }, + { + "id":-18, + "enable": true, + "name": "标题 特殊符号 序号", + "rule": "^.{1,20}[((][\\d零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]{1,8}[))][  \t]{0,4}$", + "serialNumber": 17 + } +] \ No newline at end of file diff --git a/app/src/main/assets/font/number.ttf b/app/src/main/assets/font/number.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f2804dbe9c8edbb1c875138151c477593b2080c1 GIT binary patch literal 6000 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 - - - - + + - - - - - - - - - - - - - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/App.kt b/app/src/main/java/com/novel/read/App.kt new file mode 100644 index 0000000..4a8262a --- /dev/null +++ b/app/src/main/java/com/novel/read/App.kt @@ -0,0 +1,123 @@ +package com.novel.read + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.content.res.Configuration +import android.os.Build +import android.provider.Settings +import androidx.annotation.RequiresApi +import androidx.appcompat.app.AppCompatDelegate +import androidx.multidex.MultiDexApplication +import com.jeremyliao.liveeventbus.LiveEventBus +import com.novel.read.constant.AppConst.channelIdDownload +import com.novel.read.constant.AppConst.channelIdReadAloud +import com.novel.read.constant.EventBus +import com.novel.read.data.db.BookDatabase +import com.novel.read.help.ActivityHelp +import com.novel.read.help.AppConfig +import com.novel.read.help.ReadBookConfig +import com.novel.read.help.ThemeConfig +import com.novel.read.utils.LanguageUtils +import com.novel.read.utils.ext.postEvent +import org.litepal.LitePal + +@Suppress("DEPRECATION") +class App : MultiDexApplication() { + + companion object { + @JvmStatic + lateinit var INSTANCE: App + private set + + @JvmStatic + lateinit var db: BookDatabase + private set + + lateinit var androidId: String + var versionCode = 0 + var versionName = "" + } + + override fun onCreate() { + super.onCreate() + INSTANCE = this + androidId = Settings.System.getString(contentResolver, Settings.Secure.ANDROID_ID) + LanguageUtils.setConfiguration(this) + LitePal.initialize(this) + db = BookDatabase.get() + packageManager.getPackageInfo(packageName, 0)?.let { + versionCode = it.versionCode + versionName = it.versionName + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) createChannelId() + applyDayNight() + LiveEventBus + .config() + .lifecycleObserverAlwaysActive(true) + .autoClear(false) + registerActivityLifecycleCallbacks(ActivityHelp) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + when (newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK) { + Configuration.UI_MODE_NIGHT_YES, + Configuration.UI_MODE_NIGHT_NO -> applyDayNight() + } + } + + + fun applyDayNight() { + AppConfig.upEInkMode() + ReadBookConfig.upBg() + ThemeConfig.applyTheme(this) + initNightMode() + postEvent(EventBus.RECREATE, "") + } + + + private fun initNightMode() { + val targetMode = + if (AppConfig.isNightTheme) { + AppCompatDelegate.MODE_NIGHT_YES + } else { + AppCompatDelegate.MODE_NIGHT_NO + } + AppCompatDelegate.setDefaultNightMode(targetMode) + } + + /** + * 创建通知ID + */ + @RequiresApi(Build.VERSION_CODES.O) + private fun createChannelId() { + (getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager)?.let { + //用唯一的ID创建渠道对象 + val downloadChannel = NotificationChannel( + channelIdDownload, + getString(R.string.action_download), + NotificationManager.IMPORTANCE_LOW + ) + //初始化channel + downloadChannel.enableLights(false) + downloadChannel.enableVibration(false) + downloadChannel.setSound(null, null) + + //用唯一的ID创建渠道对象 + val readAloudChannel = NotificationChannel( + channelIdReadAloud, + getString(R.string.read_aloud), + NotificationManager.IMPORTANCE_LOW + ) + //初始化channel + readAloudChannel.enableLights(false) + readAloudChannel.enableVibration(false) + readAloudChannel.setSound(null, null) + + //向notification manager 提交channel + it.createNotificationChannels(listOf(downloadChannel, readAloudChannel)) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/Ext.kt b/app/src/main/java/com/novel/read/Ext.kt deleted file mode 100644 index 72e8070..0000000 --- a/app/src/main/java/com/novel/read/Ext.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.novel.read - -import android.content.Context -import android.widget.ImageView -import android.widget.Toast - -fun Context.showToast(msg:String){ - Toast.makeText(this,msg,Toast.LENGTH_SHORT).show() -} - -fun Context.getScreenContentWidth(): Int { - val displayMetrics = this.resources.displayMetrics - return displayMetrics.widthPixels -} - -fun Context.dp2px(dps: Int): Int { - return Math.round(dps.toFloat() * getDensityDpiScale(this)) -} - -fun getDensityDpiScale(context: Context): Float { - return context.resources.displayMetrics.xdpi / 160.0f -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/activity/NovelBookDetailActivity.kt b/app/src/main/java/com/novel/read/activity/NovelBookDetailActivity.kt deleted file mode 100644 index 86f1945..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelBookDetailActivity.kt +++ /dev/null @@ -1,205 +0,0 @@ -package com.novel.read.activity - -import android.annotation.SuppressLint -import android.app.ProgressDialog -import android.content.Intent -import android.util.Log -import android.view.View -import androidx.recyclerview.widget.LinearLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.adapter.LoveLyAdapter -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant -import com.novel.read.constants.Constant.RequestCode.Companion.REQUEST_READ -import com.novel.read.constants.Constant.ResultCode.Companion.RESULT_IS_COLLECTED -import com.novel.read.event.BookArticleEvent -import com.novel.read.event.GetBookDetailEvent -import com.novel.read.event.GetRecommendBookEvent -import com.novel.read.event.UpdateBookEvent -import com.novel.read.http.AccountManager -import com.novel.read.model.db.CollBookBean -import com.novel.read.model.db.dbManage.BookRepository -import com.novel.read.model.protocol.RecommendBookResp -import com.novel.read.showToast -import com.novel.read.utlis.DateUtli -import com.novel.read.utlis.GlideImageLoader -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.activity_book_detail.* -import org.litepal.LitePal -import java.util.* - -class NovelBookDetailActivity(override val layoutId: Int = R.layout.activity_book_detail) : NovelBaseActivity(), View.OnClickListener { - - private lateinit var mAdapter: LoveLyAdapter - private val mList = ArrayList() - private var mBookId: Int = 0 - private var isCollected = false - private var mCollBookBean: CollBookBean? = null - private lateinit var mProgressDialog: ProgressDialog - - override fun initView() { - mBookId = intent.getIntExtra(Constant.Bundle.BookId, 0) - rlv_lovely.layoutManager = LinearLayoutManager(this) - mAdapter = LoveLyAdapter(mList) - rlv_lovely.adapter = mAdapter - mProgressDialog = ProgressDialog(this) - } - - override fun initData() { - refresh.showLoading() - refresh.setOnReloadingListener { getData() } - getData() - toolbar.setNavigationOnClickListener { finish() } - tv_add_book.setOnClickListener(this) - tv_start_read.setOnClickListener(this) - } - - private fun getData() { - AccountManager.getInstance().getRecommendBook(mBookId.toString(), "10") - AccountManager.getInstance().getBookDetail(mBookId.toString()) - } - - override fun onClick(v: View?) { - when (v?.id) { - R.id.tv_add_book -> - //点击存储 - if (isCollected) { - //放弃点击 - BookRepository.getInstance().deleteCollBookInRx(mCollBookBean) - tv_add_book.text = resources.getString(R.string.add_book) - isCollected = false - } else { - mProgressDialog.setTitle("正在添加到书架中") - mProgressDialog.show() - AccountManager.getInstance().getBookArticle(mBookId.toString()) - - } - R.id.tv_start_read -> - startActivityForResult( - Intent(this, NovelReadActivity::class.java) - .putExtra(NovelReadActivity.EXTRA_IS_COLLECTED, isCollected) - .putExtra(NovelReadActivity.EXTRA_COLL_BOOK, mCollBookBean), REQUEST_READ - ) - } - } - - @SuppressLint("SetTextI18n") - @Subscribe - fun getBookDetail(event: GetBookDetailEvent) { - refresh.showFinish() - if (event.isFail) { - refresh.showError() - } else { - val bookBean = event.result!!.book - GlideImageLoader.displayCornerImage(this, bookBean.cover, iv_book) - tv_book_name.text = bookBean.title - - tv_book_author.text = bookBean.author + " | " - tv_book_length.text = getString(R.string.book_word, bookBean.words / 10000) - - if (event.result!!.last_article != null) { - tv_new_title.text = - getString(R.string.new_chapter, event.result!!.last_article.title) - tv_update_time.text = - DateUtli.dateConvert(event.result!!.last_article.create_time, 0) - } - - tv_human_num.text = bookBean.hot.toString() + "" - tv_love_look_num.text = bookBean.like - tv_Intro.text = bookBean.description - mCollBookBean = BookRepository.getInstance().getCollBook(bookBean.id.toString()) - //判断是否收藏 - if (mCollBookBean != null) { - isCollected = true - tv_add_book.text = resources.getString(R.string.already_add) - tv_start_read.text = resources.getString(R.string.go_read) - } else { - mCollBookBean = event.result!!.collBookBean - } - } - } - - @Subscribe - fun getRecommendBook(event: GetRecommendBookEvent) { - if (event.isFail) { - Log.e("getRecommendBook", event.er?.msg) - } else { - mList.clear() - mList.addAll(event.result!!.book) - mAdapter.notifyDataSetChanged() - } - } - - override fun onResume() { - super.onResume() - EventManager.instance.registerSubscriber(this) - } - - override fun onPause() { - super.onPause() - EventManager.instance.unregisterSubscriber(this) - } - - @Subscribe - fun getArticle(event: BookArticleEvent) { - if (event.isFail) { - dismiss() - showToast(getString(R.string.net_error)) - } else { - //存储收藏 - var success = false - if (mCollBookBean != null) { - success = mCollBookBean!!.saveOrUpdate("bookId=?", mCollBookBean!!.id) - } - if (success) { - val bookChapterBean = event.result!!.chapterBean - for (i in bookChapterBean.indices) { - bookChapterBean[i].collBookBean = mCollBookBean - } - LitePal.saveAllAsync(bookChapterBean).listen { success1 -> - if (success1) { - if (tv_add_book != null) { - tv_add_book.text = resources.getString(R.string.already_add) - } - isCollected = true - } else { - LitePal.deleteAll(CollBookBean::class.java, "bookId =?", mCollBookBean!!.id) - showToast(getString(R.string.net_error)) - } - dismiss() - } - } else { - showToast(getString(R.string.net_error)) - dismiss() - } - } - - } - - private fun dismiss() { - mProgressDialog.dismiss() - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - //如果进入阅读页面收藏了,页面结束的时候,就需要返回改变收藏按钮 - if (requestCode == REQUEST_READ) { - if (data == null) { - return - } - - isCollected = data.getBooleanExtra(RESULT_IS_COLLECTED, false) - - if (isCollected) { - tv_add_book.text = resources.getString(R.string.already_add) - tv_start_read.text = resources.getString(R.string.go_read) - } - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.postEvent(UpdateBookEvent()) - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelBookTypeListActivity.kt b/app/src/main/java/com/novel/read/activity/NovelBookTypeListActivity.kt deleted file mode 100644 index 4c755d6..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelBookTypeListActivity.kt +++ /dev/null @@ -1,89 +0,0 @@ -package com.novel.read.activity - -import androidx.recyclerview.widget.LinearLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.adapter.BookListAdapter -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant -import com.novel.read.constants.Constant.COMMENT_SIZE -import com.novel.read.event.SearchListEvent -import com.novel.read.http.AccountManager -import com.novel.read.inter.OnLoadMoreListener -import com.novel.read.model.protocol.SearchResp -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.activity_book_type_list.* -import java.util.* - -class NovelBookTypeListActivity(override val layoutId: Int = R.layout.activity_book_type_list) : NovelBaseActivity() { - - private var mList: MutableList = ArrayList() - private lateinit var mAdapter: BookListAdapter - private var mCategoryId: String? = null - private var mTitle: String? = null - private var page: Int = 1 - private var loadSize: Int = 0 - - override fun initView() { - EventManager.instance.registerSubscriber(this) - - mCategoryId = intent.getStringExtra(Constant.Bundle.CategoryId) - mTitle = intent.getStringExtra(Constant.Bundle.mTitle) - - rlv_type_list.layoutManager = LinearLayoutManager(this) - mAdapter = BookListAdapter(mList, rlv_type_list) - rlv_type_list.adapter = mAdapter - - mAdapter.setOnLoadMoreListener(object : OnLoadMoreListener { - override fun onLoadMore() { - if (mAdapter.isLoadingMore) { - rlv_type_list.stopScroll() - } else { - if (loadSize >= COMMENT_SIZE) { - mAdapter.isLoadingMore = true - mAdapter.notifyDataSetChanged() - page++ - getData() - } - } - } - }) - } - - override fun initData() { - refresh.showLoading() - refresh.setOnReloadingListener { this.getData() } - getData() - toolbar.title = mTitle - toolbar.setNavigationOnClickListener { finish() } - - } - - private fun getData() { - mCategoryId?.let { AccountManager.getInstance().getSearchBookList(it, "", page) } - } - - @Subscribe - fun getSearchList(event: SearchListEvent) { - refresh.showFinish() - if (event.isFail) { - refresh.showError() - } else { - loadSize = event.result!!.book.size - if (mAdapter.isLoadingMore) { - mAdapter.isLoadingMore = false - mList.addAll(event.result!!.book) - mAdapter.notifyDataSetChanged() - } else { - mList.clear() - mList.addAll(event.result!!.book) - mAdapter.notifyDataSetChanged() - } - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelMainActivity.kt b/app/src/main/java/com/novel/read/activity/NovelMainActivity.kt deleted file mode 100644 index 3d2d5e3..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelMainActivity.kt +++ /dev/null @@ -1,148 +0,0 @@ -package com.novel.read.activity - -import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.util.Log -import android.view.KeyEvent -import android.view.View -import androidx.fragment.app.Fragment -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant -import com.novel.read.event.* -import com.novel.read.fragment.BookFragment -import com.novel.read.fragment.MoreFragment -import com.novel.read.fragment.RecommendFragment -import com.novel.read.fragment.StackFragment -import com.novel.read.http.AccountManager -import com.novel.read.model.db.dbManage.BookRepository -import com.novel.read.showToast -import com.novel.read.utlis.SpUtil -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.activity_main.* - -class NovelMainActivity(override val layoutId: Int = R.layout.activity_main) : NovelBaseActivity() { - - private lateinit var mCurrentFrag: Fragment - private lateinit var mMainFragment: BookFragment - private lateinit var mRecommendFragment: RecommendFragment - private lateinit var mStackFragment: StackFragment - private lateinit var mMoreFragment: MoreFragment - - //记录用户首次点击返回键的时间 - private var firstTime: Long = 0 - - override fun initView() { - mCurrentFrag = Fragment() - mMainFragment = BookFragment.newInstance() - mRecommendFragment = RecommendFragment.newInstance() - mStackFragment = StackFragment.newInstance() - mMoreFragment = MoreFragment.newInstance() - AccountManager.getInstance().login(this) - } - - override fun initData() { - bottom_bar.setOnNavigationItemSelectedListener { menuItem -> - when (menuItem.itemId) { - R.id.tab_one -> { - switchFragment(mMainFragment) - return@setOnNavigationItemSelectedListener true - } - R.id.tab_two -> { - switchFragment(mRecommendFragment) - return@setOnNavigationItemSelectedListener true - } - R.id.tab_three -> { - switchFragment(mStackFragment) - return@setOnNavigationItemSelectedListener true - } - R.id.tab_four -> { - switchFragment(mMoreFragment) - return@setOnNavigationItemSelectedListener true - } - } - false - } - - if (BookRepository.getInstance().collBooks.size > 0) { - switchFragment(mMainFragment) - } else { - bottom_bar.selectedItemId = R.id.tab_two - } - } - - private fun switchFragment(targetFragment: Fragment) { - val transaction = supportFragmentManager.beginTransaction() - if (!targetFragment.isAdded) { - transaction.hide(mCurrentFrag) - transaction.add(R.id.fl_content, targetFragment, targetFragment.javaClass.name) - } else { - transaction.hide(mCurrentFrag).show(targetFragment) - } - mCurrentFrag = targetFragment - transaction.commit() - } - - override fun onResume() { - super.onResume() - EventManager.instance.registerSubscriber(this) - } - - override fun onPause() { - super.onPause() - EventManager.instance.unregisterSubscriber(this) - } - - @Subscribe - fun login(event: LoginEvent) { - if (event.isFail) { - Log.e("NovelMainActivity", "login: " + event.er!!.msg) - } else { - SpUtil.setStringValue(Constant.Uid, event.result!!.uid.toString()) - } - } - - override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) { - if (!isVisible(bottom_bar)) { - bottom_bar.visibility = View.VISIBLE - mMainFragment.updateBook(UpdateBookEvent()) - } else { - val secondTime = System.currentTimeMillis() - if (secondTime - firstTime > 1000) { - firstTime = secondTime - showToast("再次点击退出界面") - } else { - finish() - } - } - return true - } - return super.onKeyUp(keyCode, event) - } - - @Subscribe - fun setBottomBar(event: HideBottomBarEvent) { - if (event.result!!) { - bottom_bar.visibility = View.GONE - } else { - bottom_bar.visibility = View.VISIBLE - } - } - - @Subscribe - fun toRecommendFragment(event: SwitchFragmentEvent) { - bottom_bar.selectedItemId = R.id.tab_two - } - - companion object { - fun reStart(context: Context) { - val intent = Intent(context, NovelMainActivity::class.java) - intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK - context.startActivity(intent) - } - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelRankListActivity.kt b/app/src/main/java/com/novel/read/activity/NovelRankListActivity.kt deleted file mode 100644 index e6b5d1b..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelRankListActivity.kt +++ /dev/null @@ -1,91 +0,0 @@ -package com.novel.read.activity - -import androidx.recyclerview.widget.LinearLayoutManager -import com.novel.read.R -import com.novel.read.adapter.RankListAdapter -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant -import com.novel.read.constants.Constant.COMMENT_SIZE -import com.novel.read.http.AccountManager -import com.novel.read.inter.OnLoadMoreListener -import com.novel.read.model.protocol.RankByUpdateResp -import kotlinx.android.synthetic.main.activity_rank_list.* -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import java.util.* - -/** - * 推荐fragment中点击更多跳转来的。 - */ -class NovelRankListActivity(override val layoutId: Int= R.layout.activity_rank_list) : NovelBaseActivity() { - - private lateinit var mAdapter: RankListAdapter - private var mList: MutableList = ArrayList() - private var page = 1 - private var loadSize: Int = 0 - private var type: String = "" - private var sex: String = "" - - override fun initView() { - rlv_book_list.layoutManager = LinearLayoutManager(this) - mAdapter = RankListAdapter(mList, rlv_book_list) - rlv_book_list.adapter = mAdapter - sex = intent.getStringExtra(Constant.Sex) - type = intent.getStringExtra(Constant.Type) - when (type) { - Constant.ListType.Human -> toolbar.title = getString(R.string.popular_selection) - Constant.ListType.EditRecommend -> toolbar.title = getString(R.string.edit_recommend) - Constant.ListType.HotSearch -> toolbar.title = getString(R.string.hot_search) - } - getData() - } - - override fun initData() { - toolbar.setNavigationOnClickListener { finish() } - - mAdapter.setOnLoadMoreListener(object : OnLoadMoreListener { - override fun onLoadMore() { - if (mAdapter.isLoadingMore) { - - } else { - if (loadSize >= COMMENT_SIZE) { - mAdapter.isLoadingMore = true - mAdapter.notifyDataSetChanged() - page++ - getData() - } - } - } - }) - } - - private fun getData() { - AccountManager.getInstance().getRankList(type, sex, Constant.DateTyp.Week, page.toString(), RankCallBack()) - } - - private inner class RankCallBack : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful) { - if (response.body() != null) { - loadSize = response.body()!!.book.size - if (mAdapter.isLoadingMore) { - mAdapter.isLoadingMore = false - mList.addAll(response.body()!!.book) - mAdapter.notifyDataSetChanged() - } else { - mList.clear() - mList.addAll(response.body()!!.book) - mAdapter.notifyDataSetChanged() - } - - } - } - } - - override fun onFailure(call: Call, t: Throwable) { - - } - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelReadActivity.kt b/app/src/main/java/com/novel/read/activity/NovelReadActivity.kt deleted file mode 100644 index 1d754e8..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelReadActivity.kt +++ /dev/null @@ -1,655 +0,0 @@ -package com.novel.read.activity - -import android.annotation.SuppressLint -import android.app.Activity -import android.app.Service -import android.content.* -import android.os.Build -import android.os.Handler -import android.os.IBinder -import android.os.Message -import android.util.Log -import android.view.KeyEvent -import android.view.View.* -import android.view.WindowManager -import android.view.animation.Animation -import android.view.animation.AnimationUtils -import android.widget.SeekBar -import androidx.appcompat.app.AlertDialog -import androidx.core.content.ContextCompat -import androidx.core.view.GravityCompat -import androidx.drawerlayout.widget.DrawerLayout -import androidx.recyclerview.widget.LinearLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.adapter.CategoryAdapter -import com.novel.read.adapter.MarkAdapter -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant -import com.novel.read.constants.Constant.ResultCode.Companion.RESULT_IS_COLLECTED -import com.novel.read.event.BookArticleEvent -import com.novel.read.event.ErrorChapterEvent -import com.novel.read.event.FinishChapterEvent -import com.novel.read.event.RxBus -import com.novel.read.http.AccountManager -import com.novel.read.model.db.BookChapterBean -import com.novel.read.model.db.BookSignTable -import com.novel.read.model.db.CollBookBean -import com.novel.read.model.db.DownloadTaskBean -import com.novel.read.model.db.dbManage.BookRepository -import com.novel.read.service.DownloadMessage -import com.novel.read.service.DownloadService -import com.novel.read.showToast -import com.novel.read.utlis.BrightnessUtils -import com.novel.read.utlis.ScreenUtils -import com.novel.read.utlis.SpUtil -import com.novel.read.utlis.SystemBarUtils -import com.novel.read.widget.dialog.ReadSettingDialog -import com.novel.read.widget.page.PageLoader -import com.novel.read.widget.page.PageView -import com.novel.read.widget.page.ReadSettingManager -import com.novel.read.widget.page.TxtChapter -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.activity_read.* -import kotlinx.android.synthetic.main.layout_download.* -import kotlinx.android.synthetic.main.layout_light.* -import kotlinx.android.synthetic.main.layout_read_mark.* -import java.util.* - -/** - * 阅读页📕 - */ -class NovelReadActivity : NovelBaseActivity(), DownloadService.OnDownloadListener { - - private lateinit var mCategoryAdapter: CategoryAdapter - private val mChapters = ArrayList() - private lateinit var mCurrentChapter: TxtChapter //当前章节 - private var currentChapter = 0 - private lateinit var mMarkAdapter: MarkAdapter - private val mMarks = ArrayList() - private lateinit var mPageLoader: PageLoader - private var mTopInAnim: Animation? = null - private var mTopOutAnim: Animation? = null - private var mBottomInAnim: Animation? = null - private var mBottomOutAnim: Animation? = null - - private lateinit var mSettingDialog: ReadSettingDialog - private var isCollected = false // isFromSDCard - private var isNightMode = false - private var isFullScreen = false - private val isRegistered = false - - private lateinit var mCollBook: CollBookBean - private lateinit var mBookId: String - - @SuppressLint("HandlerLeak") - private val mHandler = object : Handler() { - override fun handleMessage(msg: Message) { - super.handleMessage(msg) - when (msg.what) { - WHAT_CATEGORY -> rlv_list.setSelection(mPageLoader.chapterPos) - WHAT_CHAPTER -> mPageLoader.openChapter() - } - } - } - - override val layoutId: Int get() = R.layout.activity_read - - // 接收电池信息和时间更新的广播 - private val mReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (Objects.requireNonNull(intent.action) == Intent.ACTION_BATTERY_CHANGED) { - val level = intent.getIntExtra("level", 0) - mPageLoader.updateBattery(level) - } else if (intent.action == Intent.ACTION_TIME_TICK) { - mPageLoader.updateTime() - }// 监听分钟的变化 - } - } - - private var mService: DownloadService.IDownloadManager? = null - private var mConn: ServiceConnection? = null - - override fun initView() { - EventManager.instance.registerSubscriber(this) - mCollBook = intent.getSerializableExtra(EXTRA_COLL_BOOK) as CollBookBean - isCollected = intent.getBooleanExtra(EXTRA_IS_COLLECTED, false) - mBookId = mCollBook.id - initService() - // 如果 API < 18 取消硬件加速 - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { - read_pv_page.setLayerType(LAYER_TYPE_SOFTWARE, null) - } - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - - //获取页面加载器 - mPageLoader = read_pv_page.getPageLoader(mCollBook) - - mSettingDialog = ReadSettingDialog(this, mPageLoader) - //禁止滑动展示DrawerLayout - read_dl_slide.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) - //侧边打开后,返回键能够起作用 - read_dl_slide.isFocusableInTouchMode = false - //半透明化StatusBar - SystemBarUtils.transparentStatusBar(this) - //隐藏StatusBar - read_pv_page.post { this.hideSystemBar() } - read_abl_top_menu.setPadding(0, ScreenUtils.statusBarHeight, 0, 0) - ll_download.setPadding(0, ScreenUtils.statusBarHeight, 0, ScreenUtils.dpToPx(15)) - - val lp = window.attributes - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - lp.layoutInDisplayCutoutMode = 1 - } - window.attributes = lp - - //设置当前Activity的Brightness - if (ReadSettingManager.getInstance().isBrightnessAuto) { - BrightnessUtils.setDefaultBrightness(this) - } else { - BrightnessUtils.setBrightness(this, ReadSettingManager.getInstance().brightness) - } - - //注册广播 - val intentFilter = IntentFilter() - intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED) - intentFilter.addAction(Intent.ACTION_TIME_TICK) - registerReceiver(mReceiver, intentFilter) - - if (!SpUtil.getBooleanValue(Constant.BookGuide, false)) { - iv_guide.visibility = VISIBLE - toggleMenu(false) - } - - if (isCollected) { - mPageLoader.collBook.bookChapters = BookRepository.getInstance().getBookChaptersInRx(mBookId) - // 刷新章节列表 - mPageLoader.refreshChapterList() - // 如果是网络小说并被标记更新的,则从网络下载目录 - if (mCollBook.isUpdate && !mCollBook.isLocal) { - AccountManager.getInstance().getBookArticle(mBookId) - } - } else { - AccountManager.getInstance().getBookArticle(mBookId) - } - - } - - override fun initData() { - tv_book_name.text = mCollBook.title - mCategoryAdapter = CategoryAdapter() - rlv_list.adapter = mCategoryAdapter - rlv_list.isFastScrollEnabled = true - rlv_mark.layoutManager = LinearLayoutManager(this) - mMarkAdapter = MarkAdapter(mMarks) - rlv_mark.adapter = mMarkAdapter - isNightMode = ReadSettingManager.getInstance().isNightMode - //夜间模式按钮的状态 - toggleNightMode() - isFullScreen = ReadSettingManager.getInstance().isFullScreen - toolbar.setNavigationOnClickListener { finish() } - read_setting_sb_brightness.progress = ReadSettingManager.getInstance().brightness - mPageLoader.setOnPageChangeListener( - object : PageLoader.OnPageChangeListener { - - override fun onChapterChange(pos: Int) { - var index: Int = pos - if (pos >= mChapters.size) { - index = mChapters.size - 1 - } - mCategoryAdapter.setChapter(index) - mCurrentChapter = mChapters[index] - currentChapter = index - } - - override fun requestChapters(requestChapters: List) { - AccountManager.getInstance().getBookArticleDetail(mBookId, requestChapters) - mHandler.sendEmptyMessage(WHAT_CATEGORY) - } - - override fun onCategoryFinish(chapters: List) { - mChapters.clear() - mChapters.addAll(chapters) - mCategoryAdapter.refreshItems(mChapters) - } - - override fun onPageCountChange(count: Int) {} - - override fun onPageChange(pos: Int) { - - } - } - ) - read_pv_page.setTouchListener(object : PageView.TouchListener { - override fun onTouch(): Boolean { - return !hideReadMenu() - } - - override fun center() { - toggleMenu(true) - } - - override fun prePage() {} - - override fun nextPage() {} - - override fun cancel() {} - }) - read_tv_category.setOnClickListener { - //移动到指定位置 - if (mCategoryAdapter.count > 0) { - rlv_list.setSelection(mPageLoader.chapterPos) - } - //切换菜单 - toggleMenu(true) - //打开侧滑动栏 - read_dl_slide.openDrawer(GravityCompat.START) - } - tv_light.setOnClickListener { - ll_light.visibility = GONE - rlReadMark.visibility = GONE - if (isVisible(ll_light)) { - ll_light.visibility = GONE - } else { - ll_light.visibility = VISIBLE - } - } - tv_setting.setOnClickListener { - ll_light.visibility = GONE - rlReadMark.visibility = GONE - toggleMenu(false) - mSettingDialog.show() - } - - read_setting_sb_brightness.setOnSeekBarChangeListener(object : - SeekBar.OnSeekBarChangeListener { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - - } - - override fun onStartTrackingTouch(seekBar: SeekBar) { - - } - - override fun onStopTrackingTouch(seekBar: SeekBar) { - val progress = seekBar.progress - //设置当前 Activity 的亮度 - BrightnessUtils.setBrightness(this@NovelReadActivity, progress) - //存储亮度的进度条 - ReadSettingManager.getInstance().brightness = progress - } - }) - - tvBookReadMode.setOnClickListener { - isNightMode = !isNightMode - mPageLoader.setNightMode(isNightMode) - toggleNightMode() - } - - read_tv_brief.setOnClickListener { - val intent = Intent(this, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, Integer.valueOf(mBookId)) - startActivity(intent) - } - - read_tv_community.setOnClickListener { - if (isVisible(read_ll_bottom_menu)) { - if (isVisible(rlReadMark)) { - gone(rlReadMark) - } else { - gone(ll_light) - updateMark() - visible(rlReadMark) - } - } - } - - tvAddMark.setOnClickListener { - mMarkAdapter.edit = false - if (BookRepository.getInstance().getSignById(mCurrentChapter.chapterId)) { - showToast(getString(R.string.sign_exist)) - return@setOnClickListener - } - BookRepository.getInstance().addSign(mBookId, mCurrentChapter.chapterId, mCurrentChapter.title) - updateMark() - } - - tvClear.setOnClickListener { - if (mMarkAdapter.edit) { - val sign = mMarkAdapter.selectList - if (sign != "") { - BookRepository.getInstance().deleteSign(sign) - updateMark() - } - mMarkAdapter.edit = false - } else { - mMarkAdapter.edit = true - } - } - - tv_cache.setOnClickListener { - if (!isCollected) { //没有收藏 先收藏 然后弹框 - //设置为已收藏 - isCollected = true - //设置阅读时间 - mCollBook.lastRead = System.currentTimeMillis().toString() - BookRepository.getInstance().saveCollBookWithAsync(mCollBook) - } - showDownLoadDialog() - - } - rlv_list.setOnItemClickListener { _, _, position, _ -> - read_dl_slide.closeDrawer(GravityCompat.START) - mPageLoader.skipToChapter(position) - } - iv_guide.setOnClickListener { - iv_guide.visibility = GONE - SpUtil.setBooleanValue(Constant.BookGuide, true) - } - } - - private fun showDownLoadDialog() { - val builder = AlertDialog.Builder(this) - builder.setTitle(getString(R.string.d_cache_num)) - .setItems( - arrayOf( - getString(R.string.d_cache_last_50), - getString(R.string.d_cache_last_all), - getString(R.string.d_cache_all) - ) - ) { _, which -> - when (which) { - 0 -> { - //50章 - val last = currentChapter + 50 - if (last > mCollBook.bookChapters.size) { - downLoadCache(mCollBook.bookChapters, mCollBook.bookChapters.size) - } else { - downLoadCache(mCollBook.bookChapters, last) - } - } - 1 -> { - //后面所有 - val lastBeans = ArrayList() - for (i in currentChapter until mCollBook.bookChapters.size) { - lastBeans.add(mCollBook.bookChapters[i]) - } - downLoadCache(lastBeans, mCollBook.bookChapters.size - currentChapter) - } - 2 -> downLoadCache(mCollBook.bookChapters, mCollBook.bookChapters.size) //所有 - else -> { - } - } - toggleMenu(true) - } - builder.show() - } - - private fun downLoadCache(beans: List, size: Int) { - val task = DownloadTaskBean() - task.taskName = mCollBook.title - task.bookId = mCollBook.id - task.bookChapters = beans //计算要缓存的章节 - task.currentChapter = currentChapter - task.lastChapter = size - - RxBus.getInstance().post(task) - startService(Intent(this, DownloadService::class.java)) - } - - private fun toggleNightMode() { - if (isNightMode) { - tvBookReadMode.text = resources.getString(R.string.book_read_mode_day) - val drawable = ContextCompat.getDrawable(this, R.drawable.ic_read_menu_moring) - tvBookReadMode.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null) - cl_layout.setBackgroundColor(ContextCompat.getColor(this, R.color.read_bg_night)) - } else { - tvBookReadMode.text = resources.getString(R.string.book_read_mode_day) - val drawable = ContextCompat.getDrawable(this, R.drawable.ic_read_menu_night) - tvBookReadMode.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null) - cl_layout.setBackgroundColor( - ContextCompat.getColor( - this, - ReadSettingManager.getInstance().pageStyle.bgColor - ) - ) - } - } - - /** - * 隐藏阅读界面的菜单显示 - * - * @return 是否隐藏成功 - */ - private fun hideReadMenu(): Boolean { - hideSystemBar() - if (read_abl_top_menu.visibility == VISIBLE) { - toggleMenu(true) - return true - } else if (mSettingDialog.isShowing) { - mSettingDialog.dismiss() - return true - } - return false - } - - private fun showSystemBar() { - //显示 - SystemBarUtils.showUnStableStatusBar(this) - if (isFullScreen) { - SystemBarUtils.showUnStableNavBar(this) - } - } - - private fun hideSystemBar() { - //隐藏 - SystemBarUtils.hideStableStatusBar(this) - if (isFullScreen) { - SystemBarUtils.hideStableNavBar(this) - } - } - - /** - * 切换菜单栏的可视状态 - * 默认是隐藏的 - */ - private fun toggleMenu(hideStatusBar: Boolean) { - initMenuAnim() - gone(ll_light, rlReadMark) - if (read_abl_top_menu.visibility == VISIBLE) { - //关闭 - read_abl_top_menu.startAnimation(mTopOutAnim) - read_ll_bottom_menu.startAnimation(mBottomOutAnim) - read_abl_top_menu.visibility = GONE - read_ll_bottom_menu.visibility = GONE - - if (hideStatusBar) { - hideSystemBar() - } - } else { - read_abl_top_menu.visibility = VISIBLE - read_ll_bottom_menu.visibility = VISIBLE - read_abl_top_menu.startAnimation(mTopInAnim) - read_ll_bottom_menu.startAnimation(mBottomInAnim) - - showSystemBar() - } - } - - //初始化菜单动画 - private fun 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!!.duration = 200 - mBottomOutAnim!!.duration = 200 - } - - @Subscribe - fun getBookArticle(event: BookArticleEvent) { - if (event.isFail) { - //获取章节失败处理 - Log.e(TAG, event.er!!.msg) - } else { - val chapterBeans = event.result!!.chapterBean - mPageLoader.collBook.bookChapters = chapterBeans - mPageLoader.refreshChapterList() - - // 如果是目录更新的情况,那么就需要存储更新数据 - if (mCollBook.isUpdate && isCollected) { - BookRepository.getInstance().saveBookChaptersWithAsync(chapterBeans, mCollBook) - } - } - } - - @Subscribe - fun finishChapter(event: FinishChapterEvent) { - if (mPageLoader.pageStatus == PageLoader.STATUS_LOADING) { - mHandler.sendEmptyMessage(WHAT_CHAPTER) - } - // 当完成章节的时候,刷新列表 - mCategoryAdapter.notifyDataSetChanged() - } - - @Subscribe - fun errorChapter(event: ErrorChapterEvent) { - if (mPageLoader.pageStatus == PageLoader.STATUS_LOADING) { - mPageLoader.chapterError() - } - } - - private fun updateMark() { - mMarks.clear() - mMarks.addAll(BookRepository.getInstance().getSign(mBookId)) - mMarkAdapter.notifyDataSetChanged() - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { - when (keyCode) { - KeyEvent.KEYCODE_VOLUME_UP -> return mPageLoader.skipToPrePage() - - KeyEvent.KEYCODE_VOLUME_DOWN -> return mPageLoader.skipToNextPage() - } - return super.onKeyDown(keyCode, event) - } - - override fun onBackPressed() { - if (read_abl_top_menu.visibility == VISIBLE) { - // 非全屏下才收缩,全屏下直接退出 - if (!ReadSettingManager.getInstance().isFullScreen) { - toggleMenu(true) - return - } - } else if (mSettingDialog.isShowing) { - mSettingDialog.dismiss() - return - } else if (read_dl_slide.isDrawerOpen(GravityCompat.START)) { - read_dl_slide.closeDrawer(GravityCompat.START) - return - } - Log.e(TAG, "onBackPressed: " + mCollBook.bookChapters.isEmpty()) - - if (!mCollBook.isLocal && !isCollected && mCollBook.bookChapters.isNotEmpty()) { - val alertDialog = AlertDialog.Builder(this) - .setTitle(getString(R.string.add_book)) - .setMessage(getString(R.string.like_book)) - .setPositiveButton(getString(R.string.sure)) { dialog, which -> - //设置为已收藏 - isCollected = true - //设置阅读时间 - mCollBook.lastRead = System.currentTimeMillis().toString() - - BookRepository.getInstance().saveCollBookWithAsync(mCollBook) - - exit() - } - .setNegativeButton(getString(R.string.cancel)) { dialog, which -> exit() }.create() - alertDialog.show() - } else { - exit() - } - } - - // 退出 - private fun exit() { - // 返回给BookDetail。 - val result = Intent() - result.putExtra(RESULT_IS_COLLECTED, isCollected) - setResult(Activity.RESULT_OK, result) - super.onBackPressed() - } - - override fun onPause() { - super.onPause() - if (isCollected) { - mPageLoader.saveRecord() - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - mPageLoader.closeBook() - unbindService(mConn) - unregisterReceiver(mReceiver) - } - - private fun initService() { - - mConn = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName, service: IBinder) { - mService = service as DownloadService.IDownloadManager - mService!!.setOnDownloadListener(this@NovelReadActivity) - } - - override fun onServiceDisconnected(name: ComponentName) {} - } - //绑定 - bindService(Intent(this, DownloadService::class.java), mConn, Service.BIND_AUTO_CREATE) - } - - override fun onDownloadChange(pos: Int, status: Int, msg: String) { - Log.e(TAG, "onDownloadChange: $pos $status $msg") - - if (msg == getString(R.string.download_success) || msg == getString(R.string.download_error)) { - //下载成功或失败后隐藏下载视图 - if (ll_download != null) { - ll_download.visibility = GONE - showToast(msg) - } - } else { - if (ll_download != null) { - ll_download.visibility = VISIBLE - tv_progress.text = getString( - R.string.download_loading, - mService!!.downloadTaskList[pos].currentChapter, - mService!!.downloadTaskList[pos].lastChapter - ) - pb_loading.max = mService!!.downloadTaskList[pos].lastChapter - pb_loading.progress = mService!!.downloadTaskList[pos].currentChapter - } - } - } - - - override fun onDownloadResponse(pos: Int, status: Int) { - Log.e(TAG, "onDownloadResponse: $pos $status") - } - - @Subscribe - fun onDownLoadEvent(message: DownloadMessage) { - showToast(message.message) - } - - companion object { - - private const val TAG = "NovelReadActivity" - const val EXTRA_COLL_BOOK = "extra_coll_book" - const val EXTRA_IS_COLLECTED = "extra_is_collected" - private const val WHAT_CATEGORY = 1 - private const val WHAT_CHAPTER = 2 - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelRecommendBookListActivity.kt b/app/src/main/java/com/novel/read/activity/NovelRecommendBookListActivity.kt deleted file mode 100644 index da0c2b4..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelRecommendBookListActivity.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.novel.read.activity - -import android.view.View -import androidx.fragment.app.Fragment -import androidx.viewpager.widget.ViewPager -import com.novel.read.R -import com.novel.read.adapter.ViewPageAdapter -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant -import com.novel.read.fragment.BookListFragment -import com.novel.read.widget.VpTabLayout -import kotlinx.android.synthetic.main.activity_recommend_book_list.* -import java.util.* - -class NovelRecommendBookListActivity(override val layoutId: Int= R.layout.activity_recommend_book_list) : NovelBaseActivity() { - - override fun initView() { - val fragmentList = ArrayList() - val sex = intent.getStringExtra(Constant.Sex) - val type = intent.getStringExtra(Constant.Type) - when (type) { - Constant.ListType.Human -> toolbar.title = getString(R.string.popular_selection) - Constant.ListType.EditRecommend -> toolbar.title = getString(R.string.edit_recommend) - Constant.ListType.HotSearch -> toolbar.title = getString(R.string.hot_search) - } - val generalFragment = BookListFragment.newInstance(type, Constant.DateTyp.General, sex) - val monthFragment = BookListFragment.newInstance(type, Constant.DateTyp.Month, sex) - val weekFragment = BookListFragment.newInstance(type, Constant.DateTyp.Week, sex) - fragmentList.add(generalFragment) - fragmentList.add(monthFragment) - fragmentList.add(weekFragment) - val pageAdapter = ViewPageAdapter(supportFragmentManager, fragmentList) - vp_recommend_type.adapter = pageAdapter - vp_recommend_type.offscreenPageLimit = 2 - vp_recommend_type.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { - - } - - override fun onPageSelected(position: Int) { - vp_tab.setAnim(position, vp_recommend_type) - } - - override fun onPageScrollStateChanged(state: Int) {} - }) - } - - override fun initData() { - toolbar!!.setNavigationOnClickListener { finish() } - - vp_tab.setOnTabBtnClickListener(object : VpTabLayout.OnTabClickListener { - override fun onTabBtnClick(var1: VpTabLayout.CommonTabBtn, var2: View) { - when (var1) { - VpTabLayout.CommonTabBtn.ONE -> vp_tab.setAnim(0, vp_recommend_type) - VpTabLayout.CommonTabBtn.TWO -> vp_tab.setAnim(1, vp_recommend_type) - VpTabLayout.CommonTabBtn.THREE -> vp_tab.setAnim(2, vp_recommend_type) - } - } - }) - - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelSearchActivity.kt b/app/src/main/java/com/novel/read/activity/NovelSearchActivity.kt deleted file mode 100644 index 52a935a..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelSearchActivity.kt +++ /dev/null @@ -1,255 +0,0 @@ -package com.novel.read.activity - -import android.content.DialogInterface -import android.text.Editable -import android.text.TextUtils -import android.text.TextWatcher -import android.view.KeyEvent -import android.view.View -import androidx.recyclerview.widget.LinearLayoutManager -import com.google.android.flexbox.AlignItems -import com.google.android.flexbox.FlexDirection -import com.google.android.flexbox.FlexWrap -import com.google.android.flexbox.FlexboxLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.adapter.HistoryAdapter -import com.novel.read.adapter.HotAdapter -import com.novel.read.adapter.SearchAdapter -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant.COMMENT_SIZE -import com.novel.read.event.HotSearchEvent -import com.novel.read.event.SearchListEvent -import com.novel.read.http.AccountManager -import com.novel.read.inter.OnLoadMoreListener -import com.novel.read.model.db.SearchListTable -import com.novel.read.model.protocol.SearchResp -import com.novel.read.utlis.DialogUtils -import com.spreada.utils.chinese.ZHConverter -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.activity_search.* -import kotlinx.android.synthetic.main.title_search.* -import org.litepal.LitePal -import java.util.* - -class NovelSearchActivity(override val layoutId: Int= R.layout.activity_search) : NovelBaseActivity() { - - private val mHotList = ArrayList() - private lateinit var mHotAdapter: HotAdapter - - private var mHisList: MutableList = ArrayList() - private lateinit var mHisAdapter: HistoryAdapter - - private val mSearchList = ArrayList() - private lateinit var mSearchAdapter: SearchAdapter - - private var page = 1 - private var loadSize: Int = 0 - - override fun initView() { - EventManager.instance.registerSubscriber(this) - - val manager = FlexboxLayoutManager(this) - //设置主轴排列方式 - manager.flexDirection = FlexDirection.ROW - //设置是否换行 - manager.flexWrap = FlexWrap.WRAP - manager.alignItems = AlignItems.STRETCH - rlv_hot.layoutManager = manager - mHotAdapter = HotAdapter(mHotList) - rlv_hot.adapter = mHotAdapter - - mHisList = LitePal.order("saveTime desc").limit(5).find(SearchListTable::class.java) - val manager2 = FlexboxLayoutManager(this) - //设置主轴排列方式 - manager2.flexDirection = FlexDirection.ROW - //设置是否换行 - manager2.flexWrap = FlexWrap.WRAP - manager2.alignItems = AlignItems.STRETCH - mHisAdapter = HistoryAdapter(mHisList) - rlv_history.layoutManager = manager2 - rlv_history.adapter = mHisAdapter - - rlv_search.layoutManager = LinearLayoutManager(this) - mSearchAdapter = SearchAdapter(mSearchList, rlv_search) - rlv_search.adapter = mSearchAdapter - - mSearchAdapter.setOnLoadMoreListener(object : OnLoadMoreListener { - override fun onLoadMore() { - if (mSearchAdapter.isLoadingMore) { - - } else { - if (loadSize >= COMMENT_SIZE) { - mSearchAdapter.isLoadingMore = true - mSearchAdapter.notifyDataSetChanged() - page++ - getData() - } - } - } - }) - - AccountManager.getInstance().getHotSearch() - } - - private fun getData() { - val str = convertCC(tv_search.text.toString().trim { it <= ' ' }) - AccountManager.getInstance().getSearchBookList("", str, page) - } - - //繁簡轉換 - fun convertCC(input: String): String { - return if (TextUtils.isEmpty(input) || input.isEmpty()) "" else ZHConverter.getInstance( - ZHConverter.SIMPLIFIED - ).convert(input) - } - - override fun initData() { - //输入框 - tv_search.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { - - } - - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - if (s.toString().trim { it <= ' ' } == "") { - refresh.visibility = View.GONE - head_hot.visibility = View.VISIBLE - head_history.visibility = View.VISIBLE - rlv_hot.visibility = View.VISIBLE - rlv_history.visibility = View.VISIBLE - } else { - refresh.visibility = View.VISIBLE - head_hot.visibility = View.GONE - head_history.visibility = View.GONE - rlv_hot.visibility = View.GONE - rlv_history.visibility = View.GONE - refresh.showLoading() - page = 1 - getData() - } - - } - - override fun afterTextChanged(s: Editable) { - - } - }) - - //键盘的搜索 - tv_search.setOnKeyListener { v, keyCode, event -> - //修改回车键功能 - if (keyCode == KeyEvent.KEYCODE_ENTER) { - mSearchAdapter.setHolderType(true) - saveKey() - return@setOnKeyListener true - } - false - } - - mHotAdapter.setOnItemClickListener(object :HotAdapter.OnItemClickListener{ - override fun onItemClick(view: View, pos: Int) { - mSearchAdapter.setHolderType(true) - refresh.visibility = View.VISIBLE - tv_search.setText(mHotList[pos]) - saveKey() - } - }) - - mHisAdapter.setOnItemClickListener(object :HistoryAdapter.OnItemClickListener{ - override fun onItemClick(view: View, pos: Int) { - mSearchAdapter.setHolderType(true) - refresh.visibility = View.VISIBLE - tv_search.setText(mHisList[pos].key) - saveKey() - } - }) - - mSearchAdapter.setOnItemClickListener(object :SearchAdapter.OnItemClickListener{ - override fun onItemClick(view: View, pos: Int) { - mSearchAdapter.setHolderType(true) - tv_search.setText(mSearchList[pos].title) - saveKey() - } - }) - - head_history.setOnClickListener { view -> - - DialogUtils.getInstance().showAlertDialog( - this, - getString(R.string.clear_search), - dialogListener = DialogInterface.OnClickListener { dialog, which -> - LitePal.deleteAll(SearchListTable::class.java) - mHisList.clear() - mHisList.addAll(LitePal.order("saveTime desc").limit(5).find(SearchListTable::class.java)) - mHisAdapter.notifyDataSetChanged() - }) - } - - tv_cancel.setOnClickListener { - onBackPressed() - } - - refresh.setOnReloadingListener { getData() } - - } - - private fun saveKey() { - if (tv_search.text.toString().trim { it <= ' ' } == "") { - return - } - val searchListTable = SearchListTable() - searchListTable.key = tv_search.text.toString().trim { it <= ' ' } - searchListTable.saveTime = System.currentTimeMillis() - searchListTable.saveOrUpdate("key=?", tv_search.text.toString().trim { it <= ' ' }) - mHisList.clear() - mHisList.addAll(LitePal.order("saveTime desc").limit(5).find(SearchListTable::class.java)) - mHisAdapter.notifyDataSetChanged() - } - - override fun onBackPressed() { - if (refresh.visibility == View.VISIBLE) { - tv_search.setText("") - mSearchAdapter.setHolderType(false) - page = 1 - } else { - super.onBackPressed() - overridePendingTransition(R.anim.message_fade_in, R.anim.message_fade_out) - } - } - - @Subscribe - fun getHotSearch(event: HotSearchEvent) { - if (event.isFail) { - - } else { - mHotList.clear() - mHotList.addAll(event.result!!.key) - mHotAdapter.notifyDataSetChanged() - } - } - - @Subscribe - fun getSearchList(event: SearchListEvent) { - refresh.showFinish() - if (event.isFail) { - refresh.showError() - } else { - loadSize = event.result!!.book.size - if (mSearchAdapter.isLoadingMore) { - mSearchAdapter.isLoadingMore = false - mSearchList.addAll(event.result!!.book) - mSearchAdapter.notifyDataSetChanged() - } else { - mSearchList.clear() - mSearchList.addAll(event.result!!.book) - mSearchAdapter.notifyDataSetChanged() - } - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelSettingActivity.kt b/app/src/main/java/com/novel/read/activity/NovelSettingActivity.kt deleted file mode 100644 index 33a1667..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelSettingActivity.kt +++ /dev/null @@ -1,152 +0,0 @@ -package com.novel.read.activity - -import android.annotation.SuppressLint -import android.app.AlertDialog -import android.text.TextUtils -import android.view.View -import com.allenliu.versionchecklib.v2.AllenVersionChecker -import com.allenliu.versionchecklib.v2.builder.UIData -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.base.NovelBaseActivity -import com.novel.read.constants.Constant -import com.novel.read.event.UpdateBookEvent -import com.novel.read.event.VersionEvent -import com.novel.read.http.AccountManager -import com.novel.read.model.protocol.VersionResp -import com.novel.read.utlis.CleanCacheUtils -import com.novel.read.utlis.LocalManageUtil -import com.novel.read.utlis.SpUtil -import com.novel.read.utlis.VersionUtil -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.activity_setting.* - -class NovelSettingActivity(override val layoutId: Int = R.layout.activity_setting) : NovelBaseActivity(), View.OnClickListener { - - private var resp: VersionResp? = null - - override fun initView() { - EventManager.instance.registerSubscriber(this) - } - - @SuppressLint("SetTextI18n") - override fun initData() { - tv_language.text = - resources.getStringArray(R.array.setting_dialog_language_choice)[SpUtil.getIntValue( - Constant.Language, - 1 - )] - tv_version.text = "V" + VersionUtil.getPackageName(this)!! - try { - val cacheSize = - CleanCacheUtils.getInstance().getTotalCacheSize(this@NovelSettingActivity) - tv_cache_num.text = cacheSize - } catch (e: Exception) { - e.printStackTrace() - } - toolbar.setNavigationOnClickListener { finish() } - AccountManager.getInstance().checkVersion(VersionUtil.getPackageCode(this)) - - ll_choose_language.setOnClickListener(this) - ll_clear_cache.setOnClickListener(this) - tv_check.setOnClickListener(this) - } - - override fun onClick(v: View?) { - when (v?.id) { - R.id.ll_choose_language -> showLanguageDialog() - R.id.ll_clear_cache -> { - //默认不勾选清空书架列表,防手抖!! - val selected = booleanArrayOf(true, false) - AlertDialog.Builder(this) - .setTitle(getString(R.string.clear_cache)) - .setCancelable(true) - .setMultiChoiceItems(arrayOf(getString(R.string.clear_cache), getString(R.string.clear_book)), selected) { _, which, isChecked -> selected[which] = isChecked } - .setPositiveButton(getString(R.string.sure)) { dialog, _ -> - Thread { - CleanCacheUtils.getInstance() - .clearCache(selected[0], selected[1], this@NovelSettingActivity) - var cacheSize = "" - try { - cacheSize = - CleanCacheUtils.getInstance() - .getTotalCacheSize(this@NovelSettingActivity) - } catch (e: Exception) { - e.printStackTrace() - } - val finalCacheSize = cacheSize - runOnUiThread { - EventManager.instance.postEvent(UpdateBookEvent()) - tv_cache_num.text = finalCacheSize - } - }.start() - dialog.dismiss() - } - .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> dialog.dismiss() } - .create().show() - } - R.id.tv_check -> - //版本大小不为空 去更新。 - updateApk(resp!!) - } - } - - private fun showLanguageDialog() { - AlertDialog.Builder(this) - .setTitle(getString(R.string.choose_language)) - .setSingleChoiceItems( - resources.getStringArray(R.array.setting_dialog_language_choice), - SpUtil.getIntValue(Constant.Language, 1) - ) { dialog, which -> - val language = - resources.getStringArray(R.array.setting_dialog_language_choice)[which] - tv_language.text = language - SpUtil.setIntValue(Constant.Language, which) - dialog.dismiss() - - if (which == 0) { - selectLanguage(0) - } else { - selectLanguage(1) - } - } - .create().show() - } - - private fun selectLanguage(select: Int) { - LocalManageUtil.saveSelectLanguage(this, select) - NovelMainActivity.reStart(this) - } - - @Subscribe - fun checkVersion(event: VersionEvent) { - if (event.isFail) { - - } else { - if (TextUtils.isEmpty(event.result!!.version.size)) { - return - } - resp = event.result - tv_check.visibility = View.VISIBLE - - } - } - - private fun updateApk(resp: VersionResp) { - val versionBean = resp.version - val builder = AllenVersionChecker - .getInstance() - .downloadOnly( - UIData.create() - .setTitle(getString(R.string.new_version, versionBean.version)) - .setContent(versionBean.content) - .setDownloadUrl(versionBean.download) - ) - builder.executeMission(this) - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } -} diff --git a/app/src/main/java/com/novel/read/activity/NovelSplashActivity.kt b/app/src/main/java/com/novel/read/activity/NovelSplashActivity.kt deleted file mode 100644 index ee7f81f..0000000 --- a/app/src/main/java/com/novel/read/activity/NovelSplashActivity.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.novel.read.activity - -import android.content.Intent -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.novel.read.R -import com.novel.read.utlis.PermissionUtil -import com.novel.read.utlis.StatusBarUtil -import kotlinx.android.synthetic.main.activity_splash.* - -class NovelSplashActivity : AppCompatActivity(), PermissionUtil.PermissionCallBack { - - private var flag = false - private var runnable: Runnable? = null - - private var mPermissionUtil: PermissionUtil = PermissionUtil.getInstance() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - StatusBarUtil.setBarsStyle(this, R.color.colorPrimary, true) - setContentView(R.layout.activity_splash) - mPermissionUtil.requestPermissions(this, PERMISSION_CODE, this) - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - mPermissionUtil.requestResult(this, permissions, grantResults, this) - } - - private fun init() { - runnable = Runnable { goHome() } - tvSkip.postDelayed(runnable, 2000) - tvSkip.setOnClickListener { goHome() } - } - - @Synchronized - private fun goHome() { - if (!flag) { - flag = true - startActivity(Intent(this, NovelMainActivity::class.java)) - finish() - } - } - - override fun onDestroy() { - super.onDestroy() - flag = true - tvSkip.removeCallbacks(runnable) - } - - override fun onPermissionSuccess() { - init() - } - - override fun onPermissionReject(strMessage: String) { - finish() - } - - override fun onPermissionFail() { - mPermissionUtil.requestPermissions(this, PERMISSION_CODE, this) - } - - companion object { - private val PERMISSION_CODE = 999 - } -} diff --git a/app/src/main/java/com/novel/read/adapter/BookAdapter.kt b/app/src/main/java/com/novel/read/adapter/BookAdapter.kt deleted file mode 100644 index 53694ca..0000000 --- a/app/src/main/java/com/novel/read/adapter/BookAdapter.kt +++ /dev/null @@ -1,163 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.activity.NovelReadActivity -import com.novel.read.model.db.CollBookBean -import com.novel.read.utlis.GlideImageLoader - -import java.util.ArrayList - -class BookAdapter(private val mList: List) : RecyclerView.Adapter() { - private lateinit var mContext: Context - - private var mClickListener: OnItemClickListener? = null - private var mEdit: Boolean = false - - val selectList: List - get() { - val collBookBeans = ArrayList() - for (i in mList.indices) { - if (mList[i].isSelect) { - collBookBeans.add(mList[i]) - } - } - return collBookBeans - } - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerView.ViewHolder { - mContext = viewGroup.context - val view: View - if (i == VALUE_ITEM) { - view = LayoutInflater.from(mContext).inflate(R.layout.rlv_item_book, viewGroup, false) - return ViewHolder(view) - } else if (i == EMPTY_ITEM) { - view = LayoutInflater.from(mContext).inflate(R.layout.rlv_empty_add_book, viewGroup, false) - return EmptyHolder(view) - } - throw IllegalArgumentException() - } - - override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) { - if (viewHolder is ViewHolder) { - if (mEdit) { //编辑模式 - viewHolder.mIvCheck.isSelected = mList[i].isSelect - viewHolder.mIvCheck.visibility = View.VISIBLE - viewHolder.mTvBookName.text = mList[i].title - viewHolder.mTvBookAuthor.text = mList[i].author - if (mList[i].isUpdate) { - viewHolder.mIvGeng.visibility = View.VISIBLE - } else { - viewHolder.mIvGeng.visibility = View.GONE - } - GlideImageLoader.displayCornerImage(mContext, mList[i].cover, viewHolder.mIvBook) - viewHolder.itemView.setOnClickListener { - viewHolder.mIvCheck.isSelected = !mList[i].isSelect - mList[i].isSelect = !mList[i].isSelect - } - } else { //正常模式 - viewHolder.mIvCheck.visibility = View.GONE - if (mList.size == i) { //最后的条目 - viewHolder.mTvBookName.text = "" - viewHolder.mTvBookAuthor.text = "" - viewHolder.mIvBook.setImageResource(R.drawable.ic_book_add) - viewHolder.mIvGeng.visibility = View.GONE - viewHolder.itemView.setOnClickListener { view -> - mClickListener!!.onItemClick( - view, - i - ) - } - } else { - viewHolder.mTvBookName.text = mList[i].title - viewHolder.mTvBookAuthor.text = mList[i].author - if (mList[i].isUpdate) { - viewHolder.mIvGeng.visibility = View.VISIBLE - } else { - viewHolder.mIvGeng.visibility = View.GONE - } - GlideImageLoader.displayCornerImage( - mContext, - mList[i].cover, - viewHolder.mIvBook - ) - viewHolder.itemView.setOnClickListener { - val intent = Intent(mContext, NovelReadActivity::class.java) - intent.putExtra(NovelReadActivity.EXTRA_IS_COLLECTED, true) - intent.putExtra(NovelReadActivity.EXTRA_COLL_BOOK, mList[i]) - mContext.startActivity(intent) - } - } - } - } else if (viewHolder is EmptyHolder) { //空条目 - viewHolder.mBtnAdd.setOnClickListener { view -> mClickListener!!.onItemClick(view, i) } - } - } - - override fun getItemCount(): Int { - if (mList.isEmpty()) { - return 1 - } - return if (mEdit) { - mList.size - } else { - mList.size + 1 - } - } - - override fun getItemViewType(position: Int): Int { - return if (mList.isEmpty()) { - EMPTY_ITEM - } else { - VALUE_ITEM - } - - } - - internal class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mIvBook: ImageView = itemView.findViewById(R.id.iv_book) - var mTvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var mTvBookAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - var mIvCheck: ImageView = itemView.findViewById(R.id.iv_check) - var mIvGeng: ImageView = itemView.findViewById(R.id.iv_geng) - - } - - internal class EmptyHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mBtnAdd: Button = itemView.findViewById(R.id.btn_add) - - } - - fun setOnItemClickListener(mListener: OnItemClickListener) { - this.mClickListener = mListener - } - - - interface OnItemClickListener { - fun onItemClick(view: View, pos: Int) - } - - fun setEdit(edit: Boolean) { //开启编辑模式 - mEdit = edit - notifyDataSetChanged() - } - - - companion object { - - private const val VALUE_ITEM = 100 //正常item - - private const val EMPTY_ITEM = 101 //空白item - - } - -} diff --git a/app/src/main/java/com/novel/read/adapter/BookListAdapter.kt b/app/src/main/java/com/novel/read/adapter/BookListAdapter.kt deleted file mode 100644 index 5c0ec4f..0000000 --- a/app/src/main/java/com/novel/read/adapter/BookListAdapter.kt +++ /dev/null @@ -1,126 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.novel.read.R -import com.novel.read.activity.NovelBookDetailActivity -import com.novel.read.adapter.holder.EmptyHolder -import com.novel.read.adapter.holder.MoreHolder -import com.novel.read.constants.Constant -import com.novel.read.constants.Constant.COMMENT_SIZE -import com.novel.read.inter.OnLoadMoreListener -import com.novel.read.model.protocol.SearchResp -import com.novel.read.utlis.GlideImageLoader - -class BookListAdapter(private val mList: List, recyclerView: RecyclerView) : RecyclerView.Adapter() { - private var mContext: Context? = null - - var isLoadingMore: Boolean = false - private var lastVisibleItem: Int = 0 - private var totalItemCount: Int = 0 - private val visibleThreshold = 1 - private var mOnLoadMoreListener: OnLoadMoreListener? = null - - init { - if (recyclerView.layoutManager is LinearLayoutManager) { - val manager = recyclerView.layoutManager as LinearLayoutManager? - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - totalItemCount = manager!!.itemCount - lastVisibleItem = manager.findLastVisibleItemPosition() - if (!isLoadingMore && totalItemCount == lastVisibleItem + visibleThreshold && totalItemCount >= COMMENT_SIZE) { - if (mOnLoadMoreListener != null) { - mOnLoadMoreListener!!.onLoadMore() - } - } - } - }) - - } - } - - fun setOnLoadMoreListener(listener: OnLoadMoreListener) { - this.mOnLoadMoreListener = listener - } - - override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view: View - return when (viewType) { - VALUE_ITEM -> { - view = LayoutInflater.from(mContext).inflate(R.layout.rlv_item_book_list, viewGroup, false) - ViewHolder(view) - } - EMPTY_ITEM -> { - view = LayoutInflater.from(mContext).inflate(R.layout.rlv_empty_view, viewGroup, false) - EmptyHolder(view) - } - PROCESS_ITEM -> { - view = LayoutInflater.from(mContext).inflate(R.layout.load_more_layout, viewGroup, false) - MoreHolder(view) - } - else -> throw IllegalArgumentException() - } - } - - override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) { - if (viewHolder is ViewHolder) { - val bookBean = mList[i] - viewHolder.tvBookName.text = bookBean.title - viewHolder.tvBookAuthor.text = bookBean.author - viewHolder.tvBookDescription.text = bookBean.description - GlideImageLoader.displayCornerImage(mContext!!, bookBean.cover!!, viewHolder.ivBook) - viewHolder.itemView.setOnClickListener { - val intent = Intent(mContext, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, bookBean.id) - mContext!!.startActivity(intent) - } - }else if (viewHolder is MoreHolder){ - viewHolder.bindModule(isLoadingMore) - } - } - - override fun getItemCount(): Int { - return if (mList.isEmpty()) { - 1 - } else mList.size + 1 - } - - override fun getItemViewType(position: Int): Int { - if (mList.isNotEmpty() &&position == itemCount - 1) { - return PROCESS_ITEM - } - return when { - mList.isEmpty() -> EMPTY_ITEM - else -> VALUE_ITEM - } - - } - - internal class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var ivBook: ImageView = itemView.findViewById(R.id.iv_book) - var tvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var tvBookAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - var tvBookDescription: TextView = itemView.findViewById(R.id.tv_book_description) - } - - companion object { - - private const val VALUE_ITEM = 100 //正常item - - private const val EMPTY_ITEM = 101 //空白item - - private const val PROCESS_ITEM = 102 - } - -} diff --git a/app/src/main/java/com/novel/read/adapter/CategoryAdapter.java b/app/src/main/java/com/novel/read/adapter/CategoryAdapter.java deleted file mode 100644 index 42f3b12..0000000 --- a/app/src/main/java/com/novel/read/adapter/CategoryAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.novel.read.adapter; - -import android.view.View; -import android.view.ViewGroup; - -import com.novel.read.adapter.holder.CategoryHolder; -import com.novel.read.widget.page.TxtChapter; - -public class CategoryAdapter extends EasyAdapter { - private int currentSelected = 0; - - @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; - } - - @Override - protected IViewHolder onCreateViewHolder(int viewType) { - return new CategoryHolder(); - } - - public void setChapter(int pos){ - currentSelected = pos; - notifyDataSetChanged(); - } - -} diff --git a/app/src/main/java/com/novel/read/adapter/EasyAdapter.java b/app/src/main/java/com/novel/read/adapter/EasyAdapter.java deleted file mode 100644 index 36a3bb5..0000000 --- a/app/src/main/java/com/novel/read/adapter/EasyAdapter.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.novel.read.adapter; - -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public abstract class EasyAdapter extends BaseAdapter { - - private List mList = new ArrayList(); - - @Override - public int getCount() { - return mList.size(); - } - - @Override - public T getItem(int position) { - return mList.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - public void addItem(T value){ - mList.add(value); - notifyDataSetChanged(); - } - - public void addItem(int index,T value){ - mList.add(index, value); - notifyDataSetChanged(); - } - - public void addItems(List values){ - mList.addAll(values); - notifyDataSetChanged(); - } - - public void removeItem(T value){ - mList.remove(value); - notifyDataSetChanged(); - } - - public List getItems(){ - return Collections.unmodifiableList(mList); - } - - public int getItemSize(){ - return mList.size(); - } - - public void refreshItems(List list){ - mList.clear(); - mList.addAll(list); - notifyDataSetChanged(); - } - - public void clear(){ - mList.clear(); - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - IViewHolder holder; - if (convertView == null){ - holder = onCreateViewHolder(getItemViewType(position)); - convertView = holder.createItemView(parent); - convertView.setTag(holder); - //初始化 - holder.initView(); - } - else { - holder = (IViewHolder)convertView.getTag(); - } - //执行绑定 - holder.onBind(getItem(position),position); - return convertView; - } - - protected abstract IViewHolder onCreateViewHolder(int viewType); -} diff --git a/app/src/main/java/com/novel/read/adapter/EditRecommendAdapter.kt b/app/src/main/java/com/novel/read/adapter/EditRecommendAdapter.kt deleted file mode 100644 index 7b41eb9..0000000 --- a/app/src/main/java/com/novel/read/adapter/EditRecommendAdapter.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.activity.NovelBookDetailActivity -import com.novel.read.constants.Constant -import com.novel.read.model.protocol.RecommendListResp -import com.novel.read.utlis.GlideImageLoader - -/** - * create by zlj on 2019/6/19 - * describe: - */ -class EditRecommendAdapter(private val mList: List) : RecyclerView.Adapter() { - - private var mContext: Context? = null - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view = LayoutInflater.from(mContext) - .inflate(R.layout.rlv_edit_recommend_item, viewGroup, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { - val listBean = mList[i] - viewHolder.mTvBookName.text = listBean.book_title - viewHolder.mTvAuthor.text = listBean.author - viewHolder.mTvDescription.text = listBean.description - viewHolder.mTvHumanNum.text = listBean.getHot() - viewHolder.mTvLoveNum.text = listBean.getLike() - GlideImageLoader.displayCornerImage(mContext!!, listBean.book_cover!!, viewHolder.mIvBook) - viewHolder.itemView.setOnClickListener { - val intent = Intent(mContext, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, listBean.book_id) - mContext!!.startActivity(intent) - } - } - - override fun getItemCount(): Int { - return mList.size - } - - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mIvBook: ImageView = itemView.findViewById(R.id.iv_book) - var mTvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var mTvAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - var mTvDescription: TextView = itemView.findViewById(R.id.tv_book_description) - var mTvHumanNum: TextView = itemView.findViewById(R.id.tv_human_num) - var mTvLoveNum: TextView = itemView.findViewById(R.id.tv_love_look_num) - } -} diff --git a/app/src/main/java/com/novel/read/adapter/HistoryAdapter.kt b/app/src/main/java/com/novel/read/adapter/HistoryAdapter.kt deleted file mode 100644 index b3fb85f..0000000 --- a/app/src/main/java/com/novel/read/adapter/HistoryAdapter.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.model.db.SearchListTable - -/** - * create by zlj on 2019/6/17 - * describe: - */ -class HistoryAdapter(private val mList: List) : - RecyclerView.Adapter() { - private var mContext: Context? = null - - private lateinit var mClickListener: OnItemClickListener - - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mTvLabel: TextView = itemView.findViewById(R.id.tv_label) - } - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view = LayoutInflater.from(mContext).inflate(R.layout.item_label, viewGroup, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { - viewHolder.mTvLabel.text = mList[i].key - viewHolder.itemView.setOnClickListener { view -> mClickListener.onItemClick(view, i) } - } - - - override fun getItemCount(): Int { - return mList.size - } - - - fun setOnItemClickListener(mListener: OnItemClickListener) { - this.mClickListener = mListener - } - - - interface OnItemClickListener { - fun onItemClick(view: View, pos: Int) - } -} diff --git a/app/src/main/java/com/novel/read/adapter/HotAdapter.kt b/app/src/main/java/com/novel/read/adapter/HotAdapter.kt deleted file mode 100644 index 43fe3fa..0000000 --- a/app/src/main/java/com/novel/read/adapter/HotAdapter.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.constants.Constant - -/** - * create by 赵利君 on 2019/6/17 - * describe: - */ -class HotAdapter(private val mList: List) : RecyclerView.Adapter() { - private var mContext: Context? = null - private lateinit var mClickListener: OnItemClickListener - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view = LayoutInflater.from(mContext).inflate(R.layout.item_label, viewGroup, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { - viewHolder.mTvLabel.text = mList[i] - viewHolder.mTvLabel.setBackgroundColor(Constant.tagColors[i]) - viewHolder.itemView.setOnClickListener { view -> mClickListener.onItemClick(view, i) } - - } - - override fun getItemCount(): Int { - return if (mList.size > 8) { - 8 - } else mList.size - } - - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mTvLabel: TextView = itemView.findViewById(R.id.tv_label) - } - - fun setOnItemClickListener(mListener: OnItemClickListener) { - this.mClickListener = mListener - } - - - interface OnItemClickListener { - fun onItemClick(view: View, pos: Int) - } -} diff --git a/app/src/main/java/com/novel/read/adapter/HumanAdapter.kt b/app/src/main/java/com/novel/read/adapter/HumanAdapter.kt deleted file mode 100644 index 94a744a..0000000 --- a/app/src/main/java/com/novel/read/adapter/HumanAdapter.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.activity.NovelBookDetailActivity -import com.novel.read.constants.Constant -import com.novel.read.dp2px -import com.novel.read.getScreenContentWidth -import com.novel.read.model.protocol.RecommendListResp -import com.novel.read.utlis.GlideImageLoader -import kotlinx.android.synthetic.main.rlv_human_item.view.* - -/** - * create by zlj on 2019/6/19 - * describe: - */ -class HumanAdapter(private val mList: List) : RecyclerView.Adapter() { - private lateinit var mContext: Context - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { - mContext = viewGroup.context - val view = LayoutInflater.from(mContext).inflate(R.layout.rlv_human_item, viewGroup, false) - val ivSize = (mContext.getScreenContentWidth() - mContext.dp2px(10) * 4) / 3 - view.cl_layout.layoutParams.width = ivSize - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { - viewHolder.mTvBookName.text = mList[i].book_title - viewHolder.mTvAuthor.text = mList[i].author - GlideImageLoader.displayCornerImage(mContext, mList[i].book_cover!!, viewHolder.mIvBook) - viewHolder.itemView.setOnClickListener { - val intent = Intent(mContext, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, mList[i].book_id) - mContext.startActivity(intent) - } - } - - override fun getItemCount(): Int { - return mList.size - } - - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mIvBook: ImageView = itemView.findViewById(R.id.iv_book) - var mTvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var mTvAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - - } -} diff --git a/app/src/main/java/com/novel/read/adapter/IViewHolder.kt b/app/src/main/java/com/novel/read/adapter/IViewHolder.kt deleted file mode 100644 index b69585e..0000000 --- a/app/src/main/java/com/novel/read/adapter/IViewHolder.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.adapter - -import android.view.View -import android.view.ViewGroup - -/** - * Created by zlj - */ - -interface IViewHolder { - fun createItemView(parent: ViewGroup): View - fun initView() - fun onBind(data: T, pos: Int) - fun onClick() -} diff --git a/app/src/main/java/com/novel/read/adapter/LoveLyAdapter.kt b/app/src/main/java/com/novel/read/adapter/LoveLyAdapter.kt deleted file mode 100644 index 6999f79..0000000 --- a/app/src/main/java/com/novel/read/adapter/LoveLyAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.activity.NovelBookDetailActivity -import com.novel.read.constants.Constant -import com.novel.read.model.protocol.RecommendBookResp -import com.novel.read.utlis.GlideImageLoader - -/** - * 猜你喜欢adapter - */ -class LoveLyAdapter(private val mList: List) : RecyclerView.Adapter() { - - private var mContext: Context? = null - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerView.ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view: View = LayoutInflater.from(mContext).inflate(R.layout.rlv_item_lovely, viewGroup, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) { - if (viewHolder is ViewHolder) { - val bookBean = mList[i] - GlideImageLoader.displayCornerImage(mContext!!, bookBean.cover!!, viewHolder.mIvBook) - viewHolder.mTvBookName.text = bookBean.title - viewHolder.mTvBookAuthor.text = - mContext!!.getString(R.string.author_zhu, bookBean.author) - viewHolder.mTvDescription.text = bookBean.description - viewHolder.itemView.setOnClickListener { - val intent = Intent(mContext, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, bookBean.id) - mContext!!.startActivity(intent) - } - } - } - - override fun getItemCount(): Int { - return mList.size - } - - internal class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mIvBook: ImageView = itemView.findViewById(R.id.iv_book) - var mTvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var mTvBookAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - var mTvDescription: TextView = itemView.findViewById(R.id.tv_book_description) - } -} diff --git a/app/src/main/java/com/novel/read/adapter/MarkAdapter.kt b/app/src/main/java/com/novel/read/adapter/MarkAdapter.kt deleted file mode 100644 index c1e176e..0000000 --- a/app/src/main/java/com/novel/read/adapter/MarkAdapter.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.CheckBox -import android.widget.CompoundButton -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.model.db.BookSignTable -import com.novel.read.model.protocol.MarkResp - -class MarkAdapter(private val mList: List) : RecyclerView.Adapter() { - - private var mContext: Context? = null - var edit: Boolean = false - set(edit) { - field = edit - notifyDataSetChanged() - } - - val selectList: String - get() { - val signs = StringBuilder() - for (i in mList.indices) { - if (mList[i].edit) { - if (signs.toString() == "") { - signs.append(mList[i].articleId) - } else { - signs.append(",").append(mList[i].articleId) - } - } - } - return signs.toString() - } - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerView.ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view: View = LayoutInflater.from(mContext).inflate(R.layout.rlv_item_mark, viewGroup, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) { - if (viewHolder is ViewHolder) { - if (this.edit) { - viewHolder.mCheck.visibility = View.VISIBLE - viewHolder.mCheck.setOnCheckedChangeListener { compoundButton, b -> - mList[i].edit = b - } - } else { - viewHolder.mCheck.visibility = View.GONE - } - viewHolder.mTvMark.text = mList[i].content - viewHolder.mCheck.isChecked = mList[i].edit - } - } - - override fun getItemCount(): Int { - return mList.size - } - - internal class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mTvMark: TextView = itemView.findViewById(R.id.tvMarkItem) - var mCheck: CheckBox = itemView.findViewById(R.id.checkbox) - } -} diff --git a/app/src/main/java/com/novel/read/adapter/PageStyleAdapter.kt b/app/src/main/java/com/novel/read/adapter/PageStyleAdapter.kt deleted file mode 100644 index 7c63254..0000000 --- a/app/src/main/java/com/novel/read/adapter/PageStyleAdapter.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.graphics.drawable.Drawable -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import androidx.recyclerview.widget.RecyclerView -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.widget.page.PageLoader -import com.novel.read.widget.page.PageStyle - -class PageStyleAdapter(val mList: List, private val mPageLoader: PageLoader) : - RecyclerView.Adapter() { - private var mContext: Context? = null - private var currentChecked: Int = 0 - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): PageHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view = LayoutInflater.from(mContext).inflate(R.layout.item_read_bg, viewGroup, false) - return PageHolder(view) - } - - override fun onBindViewHolder(pageHolder: PageHolder, i: Int) { - pageHolder.mReadBg.background = mList[i] - pageHolder.mIvChecked.visibility = View.GONE - if (currentChecked == i) { - pageHolder.mIvChecked.visibility = View.VISIBLE - } - pageHolder.itemView.setOnClickListener { - currentChecked = i - notifyDataSetChanged() - mPageLoader.setPageStyle(PageStyle.values()[i]) - } - } - - fun setPageStyleChecked(pageStyle: PageStyle) { - currentChecked = pageStyle.ordinal - } - - override fun getItemCount(): Int { - return mList.size - } - - class PageHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val mReadBg: View = itemView.findViewById(R.id.read_bg_view) - val mIvChecked: ImageView = itemView.findViewById(R.id.read_bg_iv_checked) - - } -} diff --git a/app/src/main/java/com/novel/read/adapter/RankAdapter.kt b/app/src/main/java/com/novel/read/adapter/RankAdapter.kt deleted file mode 100644 index 17dd482..0000000 --- a/app/src/main/java/com/novel/read/adapter/RankAdapter.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.activity.NovelBookDetailActivity -import com.novel.read.constants.Constant -import com.novel.read.dp2px -import com.novel.read.getScreenContentWidth -import com.novel.read.model.protocol.RecommendListResp -import com.novel.read.utlis.GlideImageLoader -import kotlinx.android.synthetic.main.rlv_human_item.view.* - -/** - * create by zlj on 2019/6/20 - * describe: - */ -class RankAdapter(private val mList: List) : - RecyclerView.Adapter() { - private lateinit var mContext: Context - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { - mContext = viewGroup.context - val view = LayoutInflater.from(mContext).inflate(R.layout.rlv_human_item, viewGroup, false) - val ivSize = (mContext.getScreenContentWidth() - mContext.dp2px(10) * 4) / 3 - view.cl_layout.layoutParams.width = ivSize - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { - viewHolder.mTvBookName.text = mList[i].book_title - viewHolder.mTvAuthor.text = mList[i].author - GlideImageLoader.displayCornerImage(mContext, mList[i].book_cover!!, viewHolder.mIvBook) - viewHolder.itemView.setOnClickListener { - val intent = Intent(mContext, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, mList[i].book_id) - mContext.startActivity(intent) - } - } - - override fun getItemCount(): Int { - return mList.size - } - - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mIvBook: ImageView = itemView.findViewById(R.id.iv_book) - var mTvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var mTvAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - - } -} diff --git a/app/src/main/java/com/novel/read/adapter/RankListAdapter.kt b/app/src/main/java/com/novel/read/adapter/RankListAdapter.kt deleted file mode 100644 index eddf490..0000000 --- a/app/src/main/java/com/novel/read/adapter/RankListAdapter.kt +++ /dev/null @@ -1,125 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.activity.NovelBookDetailActivity -import com.novel.read.adapter.holder.EmptyHolder -import com.novel.read.adapter.holder.MoreHolder -import com.novel.read.constants.Constant -import com.novel.read.inter.OnLoadMoreListener -import com.novel.read.model.protocol.RankByUpdateResp -import com.novel.read.utlis.GlideImageLoader -import com.novel.read.constants.Constant.COMMENT_SIZE - -class RankListAdapter( val mList: List, recyclerView: RecyclerView) : RecyclerView.Adapter() { - - private lateinit var mContext: Context - var isLoadingMore: Boolean = false - private var lastVisibleItem: Int = 0 - private var totalItemCount: Int = 0 - private val visibleThreshold = 1 - private var mOnLoadMoreListener: OnLoadMoreListener? = null - - init { - if (recyclerView.layoutManager is LinearLayoutManager) { - val manager = recyclerView.layoutManager as LinearLayoutManager? - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - totalItemCount = manager!!.itemCount - lastVisibleItem = manager.findLastVisibleItemPosition() - if (!isLoadingMore && totalItemCount == lastVisibleItem + visibleThreshold && totalItemCount >= COMMENT_SIZE) { - if (mOnLoadMoreListener != null) { - mOnLoadMoreListener!!.onLoadMore() - } - } - } - }) - } - } - - fun setOnLoadMoreListener(listener: OnLoadMoreListener) { - this.mOnLoadMoreListener = listener - } - - override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - mContext = viewGroup.context - - val view: View - when (viewType) { - VALUE_ITEM -> { - view = LayoutInflater.from(mContext).inflate(R.layout.rlv_item_book_list, viewGroup, false) - return ViewHolder(view) - } - EMPTY_ITEM -> { - view = LayoutInflater.from(mContext).inflate(R.layout.rlv_empty_view, viewGroup, false) - return EmptyHolder(view) - } - PROCESS_ITEM -> { - view = LayoutInflater.from(mContext).inflate(R.layout.load_more_layout, viewGroup, false) - return MoreHolder(view) - } - } - throw IllegalArgumentException() - } - - override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) { - if (viewHolder is ViewHolder) { - val bookBean = mList[i] - viewHolder.tvBookName.text = bookBean.title - viewHolder.tvBookAuthor.text = bookBean.author - viewHolder.tvBookDescription.text = bookBean.description - GlideImageLoader.displayCornerImage(mContext, bookBean.cover, viewHolder.ivBook) - viewHolder.itemView.setOnClickListener { - val intent = Intent(mContext, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, bookBean.id) - mContext.startActivity(intent) - } - }else if (viewHolder is MoreHolder){ - viewHolder.bindModule(isLoadingMore) - } - } - - override fun getItemCount(): Int { - return if (mList.isEmpty()) { - 1 - } else mList.size + 1 - } - - override fun getItemViewType(position: Int): Int { - if (mList.isNotEmpty() && position == itemCount - 1) { - return PROCESS_ITEM - } - return when { - mList.isEmpty() -> EMPTY_ITEM - else -> VALUE_ITEM - } - } - - internal class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var ivBook: ImageView = itemView.findViewById(R.id.iv_book) - var tvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var tvBookAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - var tvBookDescription: TextView = itemView.findViewById(R.id.tv_book_description) - - } - - companion object { - - private const val VALUE_ITEM = 100 //正常item - - private const val EMPTY_ITEM = 101 //空白item - - private const val PROCESS_ITEM = 102 - } - -} diff --git a/app/src/main/java/com/novel/read/adapter/SearchAdapter.kt b/app/src/main/java/com/novel/read/adapter/SearchAdapter.kt deleted file mode 100644 index 3802822..0000000 --- a/app/src/main/java/com/novel/read/adapter/SearchAdapter.kt +++ /dev/null @@ -1,173 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.novel.read.R -import com.novel.read.activity.NovelBookDetailActivity -import com.novel.read.adapter.holder.EmptyHolder -import com.novel.read.adapter.holder.MoreHolder -import com.novel.read.constants.Constant -import com.novel.read.constants.Constant.COMMENT_SIZE -import com.novel.read.inter.OnLoadMoreListener -import com.novel.read.model.protocol.SearchResp -import com.novel.read.utlis.GlideImageLoader - -class SearchAdapter(private val mList: List, recyclerView: RecyclerView) : - RecyclerView.Adapter() { - - private var mContext: Context? = null - - private var book = false - private var mClickListener: OnItemClickListener? = null - - var isLoadingMore: Boolean = false - private var lastVisibleItem: Int = 0 - private var totalItemCount: Int = 0 - private val visibleThreshold = 1 - private var mOnLoadMoreListener: OnLoadMoreListener? = null - - init { - if (recyclerView.layoutManager is LinearLayoutManager) { - val manager = recyclerView.layoutManager as LinearLayoutManager? - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - totalItemCount = manager!!.itemCount - lastVisibleItem = manager.findLastVisibleItemPosition() - if (!isLoadingMore && totalItemCount == lastVisibleItem + visibleThreshold && totalItemCount >= COMMENT_SIZE) { - if (mOnLoadMoreListener != null) { - mOnLoadMoreListener!!.onLoadMore() - } - } - } - }) - - } - } - - fun setOnLoadMoreListener(listener: OnLoadMoreListener) { - this.mOnLoadMoreListener = listener - } - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerView.ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view: View - when (i) { - VALUE_ITEM -> { - view = LayoutInflater.from(mContext) - .inflate(R.layout.rlv_item_search, viewGroup, false) - return ViewHolder(view) - } - BOOK_ITEM -> { - view = LayoutInflater.from(mContext) - .inflate(R.layout.rlv_item_book_list_search, viewGroup, false) - return BookHolder(view) - } - EMPTY_ITEM -> { - view = - LayoutInflater.from(mContext).inflate(R.layout.rlv_empty_view, viewGroup, false) - return EmptyHolder(view) - } - PROCESS_ITEM -> { - view = LayoutInflater.from(mContext) - .inflate(R.layout.load_more_layout, viewGroup, false) - return MoreHolder(view) - } - else -> throw IllegalArgumentException() - } - } - - override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) { - when (viewHolder) { - is ViewHolder -> { - val bookBean = mList[i] - viewHolder.mTvBookName.text = bookBean.title - viewHolder.itemView.setOnClickListener { view -> - mClickListener!!.onItemClick(view, i) - } - } - is BookHolder -> { - val bookBean = mList[i] - viewHolder.tvBookName.text = bookBean.title - viewHolder.tvBookAuthor.text = bookBean.author - viewHolder.tvBookDescription.text = bookBean.description - GlideImageLoader.displayCornerImage(mContext!!, bookBean.cover!!, viewHolder.ivBook) - viewHolder.itemView.setOnClickListener { view -> - val intent = Intent(mContext, NovelBookDetailActivity::class.java) - intent.putExtra(Constant.Bundle.BookId, bookBean.id) - mContext!!.startActivity(intent) - } - } - is MoreHolder -> viewHolder.bindModule(isLoadingMore) - } - } - - override fun getItemCount(): Int { - return if (mList.isEmpty()) { - 1 - } else mList.size + 1 - } - - override fun getItemViewType(position: Int): Int { - if (mList.isNotEmpty() && position == itemCount - 1) { - return PROCESS_ITEM - } - - return if (mList.isEmpty()) { - EMPTY_ITEM - } else { - if (book) { - BOOK_ITEM - } else { - VALUE_ITEM - } - } - } - - fun setHolderType(book: Boolean) { - this.book = book - notifyDataSetChanged() - } - - internal class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mTvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - - } - - internal class BookHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var ivBook: ImageView = itemView.findViewById(R.id.iv_book) - var tvBookName: TextView = itemView.findViewById(R.id.tv_book_name) - var tvBookAuthor: TextView = itemView.findViewById(R.id.tv_book_author) - var tvBookDescription: TextView = itemView.findViewById(R.id.tv_book_description) - - } - - fun setOnItemClickListener(mListener: OnItemClickListener) { - this.mClickListener = mListener - } - - interface OnItemClickListener { - fun onItemClick(view: View, pos: Int) - } - - companion object { - - private const val VALUE_ITEM = 100 //正常item - - private const val EMPTY_ITEM = 101 //空白item - - private const val BOOK_ITEM = 102 //书本item - - private const val PROCESS_ITEM = 103 - } - -} diff --git a/app/src/main/java/com/novel/read/adapter/StackAdapter.kt b/app/src/main/java/com/novel/read/adapter/StackAdapter.kt deleted file mode 100644 index a729319..0000000 --- a/app/src/main/java/com/novel/read/adapter/StackAdapter.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.novel.read.adapter - -import android.content.Context -import android.content.Intent -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R -import com.novel.read.activity.NovelBookTypeListActivity -import com.novel.read.constants.Constant -import com.novel.read.model.protocol.CategoryTypeResp -import com.novel.read.utlis.GlideImageLoader - -class StackAdapter(private val mList: List) : RecyclerView.Adapter() { - - private var mContext: Context? = null - - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerView.ViewHolder { - if (mContext == null) { - mContext = viewGroup.context - } - val view: View = LayoutInflater.from(mContext).inflate(R.layout.rlv_item_book_type, viewGroup, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) { - if (viewHolder is ViewHolder) { - - var input = mList[i].title - val regex = "(.{2})" - input = input.replace(regex.toRegex(), "$1\n") - viewHolder.mTvType.text = input - viewHolder.itemView.setOnClickListener { view -> - val intent = Intent(mContext, NovelBookTypeListActivity::class.java) - intent.putExtra(Constant.Bundle.CategoryId, mList[i].id.toString()) - intent.putExtra(Constant.Bundle.mTitle, mList[i].title) - mContext!!.startActivity(intent) - } - GlideImageLoader.displayCornerImage( - mContext!!, - mList[i].cover, - viewHolder.mIvType, - R.drawable.ic_type_default - ) - } - } - - override fun getItemCount(): Int { - return mList.size - } - - internal class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var mIvType: ImageView = itemView.findViewById(R.id.iv_book) - var mTvType: TextView = itemView.findViewById(R.id.tv_book_name) - - } -} diff --git a/app/src/main/java/com/novel/read/adapter/ViewHolderImpl.java b/app/src/main/java/com/novel/read/adapter/ViewHolderImpl.java deleted file mode 100644 index 5ba4f86..0000000 --- a/app/src/main/java/com/novel/read/adapter/ViewHolderImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.novel.read.adapter; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.jetbrains.annotations.NotNull; - -public abstract class ViewHolderImpl implements IViewHolder { - private View view; - private Context context; - - protected abstract int getItemLayoutId(); - - @NotNull - @Override - public View createItemView(ViewGroup parent) { - view = LayoutInflater.from(parent.getContext()) - .inflate(getItemLayoutId(), parent, false); - context = parent.getContext(); - return view; - } - - protected V findById(int id){ - return (V) view.findViewById(id); - } - - protected Context getContext(){ - return context; - } - - protected View getItemView(){ - return view; - } - - @Override - public void onClick() { - } -} diff --git a/app/src/main/java/com/novel/read/adapter/ViewPageAdapter.kt b/app/src/main/java/com/novel/read/adapter/ViewPageAdapter.kt deleted file mode 100644 index dd4d2f7..0000000 --- a/app/src/main/java/com/novel/read/adapter/ViewPageAdapter.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.novel.read.adapter - -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentPagerAdapter - -/** - * Created by Administrator on 2017/2/24. - */ - -class ViewPageAdapter(fm: FragmentManager, private val fragmentList: List) : - FragmentPagerAdapter(fm) { - - override fun getItem(position: Int): Fragment { - return fragmentList[position] - } - - override fun getCount(): Int { - return fragmentList.size - } - -} diff --git a/app/src/main/java/com/novel/read/adapter/holder/CategoryHolder.java b/app/src/main/java/com/novel/read/adapter/holder/CategoryHolder.java deleted file mode 100644 index 5dce728..0000000 --- a/app/src/main/java/com/novel/read/adapter/holder/CategoryHolder.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.novel.read.adapter.holder; - -import android.graphics.drawable.Drawable; -import android.widget.TextView; - -import androidx.core.content.ContextCompat; - -import com.novel.read.R; -import com.novel.read.adapter.ViewHolderImpl; -import com.novel.read.model.db.dbManage.BookManager; -import com.novel.read.utlis.StringUtils; -import com.novel.read.widget.page.TxtChapter; - -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; - 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.colorTitle)); - mTvChapter.setCompoundDrawablesWithIntrinsicBounds(drawable,null,null,null); - mTvChapter.setText(StringUtils.INSTANCE.convertCC(value.getTitle())); - - } - - @Override - protected int getItemLayoutId() { - return R.layout.rlv_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/novel/read/adapter/holder/EmptyHolder.kt b/app/src/main/java/com/novel/read/adapter/holder/EmptyHolder.kt deleted file mode 100644 index 20736cf..0000000 --- a/app/src/main/java/com/novel/read/adapter/holder/EmptyHolder.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.novel.read.adapter.holder - -import android.view.View -import androidx.recyclerview.widget.RecyclerView - -class EmptyHolder(itemView: View) : RecyclerView.ViewHolder(itemView) diff --git a/app/src/main/java/com/novel/read/adapter/holder/MoreHolder.kt b/app/src/main/java/com/novel/read/adapter/holder/MoreHolder.kt deleted file mode 100644 index 2e171be..0000000 --- a/app/src/main/java/com/novel/read/adapter/holder/MoreHolder.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.novel.read.adapter.holder - -import android.view.View -import android.widget.ProgressBar -import android.widget.TextView - -import androidx.recyclerview.widget.RecyclerView - -import com.novel.read.R - -/** - * @author: LiJun 390057892@qq.com - * @date: 2018/4/4 9:28 - */ - -class MoreHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - - private val mProgressBar: ProgressBar = itemView.findViewById(R.id.progressBar) - private val mTvName: TextView = itemView.findViewById(R.id.tv_name) - private val mTvEnd: TextView = itemView.findViewById(R.id.tv_end) - - fun bindModule(loadMore: Boolean) { - if (loadMore) { - mTvName.visibility = View.VISIBLE - mProgressBar.visibility = View.VISIBLE - mTvEnd.visibility = View.GONE - } else { - mTvName.visibility = View.GONE - mProgressBar.visibility = View.GONE - mTvEnd.visibility = View.VISIBLE - } - } - -} diff --git a/app/src/main/java/com/novel/read/base/BaseActivity.kt b/app/src/main/java/com/novel/read/base/BaseActivity.kt new file mode 100644 index 0000000..557a224 --- /dev/null +++ b/app/src/main/java/com/novel/read/base/BaseActivity.kt @@ -0,0 +1,174 @@ +package com.novel.read.base + +import android.content.Context +import android.content.res.Configuration +import android.os.Bundle +import android.util.AttributeSet +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.WindowManager +import android.widget.FrameLayout +import androidx.appcompat.app.AppCompatActivity +import com.novel.read.R +import com.novel.read.constant.AppConst +import com.novel.read.constant.Theme +import com.novel.read.lib.* +import com.novel.read.ui.widget.TitleBar +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.LanguageUtils +import com.novel.read.utils.ext.disableAutoFill +import com.novel.read.utils.ext.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel + +abstract class BaseActivity( + private val layoutID: Int, + val fullScreen: Boolean = true, + private val theme: Theme = Theme.Auto, + private val toolBarTheme: Theme = Theme.Auto, + private val transparent: Boolean = false +) : AppCompatActivity(), + CoroutineScope by MainScope() { + + val isInMultiWindow: Boolean + get() { + return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + isInMultiWindowMode + } else { + false + } + } + + override fun attachBaseContext(newBase: Context) { + super.attachBaseContext(LanguageUtils.setConfiguration(newBase)) + } + + override fun onCreateView( + parent: View?, + name: String, + context: Context, + attrs: AttributeSet + ): View? { + if (AppConst.menuViewNames.contains(name) && parent?.parent is FrameLayout) { + (parent.parent as View).setBackgroundColor(backgroundColor) + } + return super.onCreateView(parent, name, context, attrs) + } + + override fun onCreate(savedInstanceState: Bundle?) { + window.decorView.disableAutoFill() + initTheme() + setupSystemBar() + super.onCreate(savedInstanceState) + setContentView(layoutID) + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + findViewById(R.id.title_bar) + ?.onMultiWindowModeChanged(isInMultiWindowMode, fullScreen) + } + onActivityCreated(savedInstanceState) + observeLiveBus() + } + + override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean, newConfig: Configuration?) { + super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig) + findViewById(R.id.title_bar) + ?.onMultiWindowModeChanged(isInMultiWindowMode, fullScreen) + setupSystemBar() + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + findViewById(R.id.title_bar) + ?.onMultiWindowModeChanged(isInMultiWindow, fullScreen) + setupSystemBar() + } + + override fun onDestroy() { + super.onDestroy() + cancel() + } + + abstract fun onActivityCreated(savedInstanceState: Bundle?) + + final override fun onCreateOptionsMenu(menu: Menu?): Boolean { + return menu?.let { + val bool = onCompatCreateOptionsMenu(it) + it.applyTint(this, toolBarTheme) + bool + } ?: super.onCreateOptionsMenu(menu) + } + + override fun onMenuOpened(featureId: Int, menu: Menu): Boolean { + menu.applyOpenTint(this) + return super.onMenuOpened(featureId, menu) + } + + open fun onCompatCreateOptionsMenu(menu: Menu) = super.onCreateOptionsMenu(menu) + + final override fun onOptionsItemSelected(item: MenuItem): Boolean { + item.let { + if (it.itemId == android.R.id.home) { + supportFinishAfterTransition() + return true + } + } + return onCompatOptionsItemSelected(item) + } + + open fun onCompatOptionsItemSelected(item: MenuItem) = super.onOptionsItemSelected(item) + + private fun initTheme() { + when (theme) { + Theme.Transparent -> setTheme(R.style.AppTheme_Transparent) + Theme.Dark -> { + setTheme(R.style.AppTheme_Dark) + ATH.applyBackgroundTint(window.decorView) + } + Theme.Light -> { + setTheme(R.style.AppTheme_Light) + ATH.applyBackgroundTint(window.decorView) + } + else -> { + if (ColorUtils.isColorLight(primaryColor)) { + setTheme(R.style.AppTheme_Light) + } else { + setTheme(R.style.AppTheme_Dark) + } + ATH.applyBackgroundTint(window.decorView) + } + } + } + + private fun setupSystemBar() { + if (fullScreen && !isInMultiWindow) { + window.clearFlags( + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS + or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION + ) + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE + } + ATH.setStatusBarColorAuto(this, fullScreen) + if (toolBarTheme == Theme.Dark) { + ATH.setLightStatusBar(window, false) + } else if (toolBarTheme == Theme.Light) { + ATH.setLightStatusBar(window, true) + } + upNavigationBarColor() + } + + open fun upNavigationBarColor() { + ATH.setNavigationBarColorAuto(this) + } + + open fun observeLiveBus() { + } + + override fun finish() { + currentFocus?.hideSoftInput() + super.finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/base/BaseDialogFragment.kt b/app/src/main/java/com/novel/read/base/BaseDialogFragment.kt new file mode 100644 index 0000000..8cdb006 --- /dev/null +++ b/app/src/main/java/com/novel/read/base/BaseDialogFragment.kt @@ -0,0 +1,58 @@ +package com.novel.read.base + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager +import com.novel.read.lib.ThemeStore +import com.novel.read.help.coroutine.Coroutine +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlin.coroutines.CoroutineContext + + +abstract class BaseDialogFragment : DialogFragment(), CoroutineScope { + override val coroutineContext: CoroutineContext + get() = job + Dispatchers.Main + private lateinit var job: Job + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + job = Job() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + view.setBackgroundColor(ThemeStore.backgroundColor()) + onFragmentCreated(view, savedInstanceState) + observeLiveBus() + } + + abstract fun onFragmentCreated(view: View, savedInstanceState: Bundle?) + + override fun show(manager: FragmentManager, tag: String?) { + try { + //在每个add事务前增加一个remove事务,防止连续的add + manager.beginTransaction().remove(this).commit() + super.show(manager, tag) + } catch (e: Exception) { + //同一实例使用不同的tag会异常,这里捕获一下 + e.printStackTrace() + } + } + + override fun onDestroy() { + super.onDestroy() + job.cancel() + } + + fun execute( + scope: CoroutineScope = this, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> T + ) = Coroutine.async(scope, context) { block() } + + open fun observeLiveBus() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/base/BaseFragment.kt b/app/src/main/java/com/novel/read/base/BaseFragment.kt new file mode 100644 index 0000000..feaacf5 --- /dev/null +++ b/app/src/main/java/com/novel/read/base/BaseFragment.kt @@ -0,0 +1,96 @@ +package com.novel.read.base + +import android.annotation.SuppressLint +import android.content.res.Configuration +import android.os.Bundle +import android.view.* +import androidx.appcompat.view.SupportMenuInflater +import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.Fragment +import com.novel.read.R +import com.novel.read.ui.widget.TitleBar +import com.novel.read.utils.ext.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlin.coroutines.CoroutineContext + +@Suppress("MemberVisibilityCanBePrivate") +abstract class BaseFragment(layoutID: Int) : Fragment(layoutID), + CoroutineScope { + lateinit var job: Job + var supportToolbar: Toolbar? = null + private set + + val menuInflater: MenuInflater + @SuppressLint("RestrictedApi") + get() = SupportMenuInflater(requireContext()) + + override val coroutineContext: CoroutineContext + get() = job + Dispatchers.Main + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + job = Job() + return super.onCreateView(inflater, container, savedInstanceState) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + onMultiWindowModeChanged() + onFragmentCreated(view, savedInstanceState) + observeLiveBus() + } + + abstract fun onFragmentCreated(view: View, savedInstanceState: Bundle?) + + override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean) { + super.onMultiWindowModeChanged(isInMultiWindowMode) + onMultiWindowModeChanged() + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + onMultiWindowModeChanged() + } + + private fun onMultiWindowModeChanged() { + (activity as? BaseActivity)?.let { + view?.findViewById(R.id.title_bar) + ?.onMultiWindowModeChanged(it.isInMultiWindow, it.fullScreen) + } + } + + override fun onDestroy() { + super.onDestroy() + job.cancel() + } + + fun setSupportToolbar(toolbar: Toolbar) { + supportToolbar = toolbar + supportToolbar?.let { + it.menu.apply { + onCompatCreateOptionsMenu(this) + applyTint(requireContext()) + } + + it.setOnMenuItemClickListener { item -> + onCompatOptionsItemSelected(item) + true + } + } + } + + open fun observeLiveBus() { + } + + open fun onCompatCreateOptionsMenu(menu: Menu) { + } + + open fun onCompatOptionsItemSelected(item: MenuItem) { + } + +} diff --git a/app/src/main/java/com/novel/read/base/BasePreferenceFragment.kt b/app/src/main/java/com/novel/read/base/BasePreferenceFragment.kt new file mode 100644 index 0000000..e10fb01 --- /dev/null +++ b/app/src/main/java/com/novel/read/base/BasePreferenceFragment.kt @@ -0,0 +1,60 @@ +package com.novel.read.base + +import android.annotation.SuppressLint +import androidx.fragment.app.DialogFragment +import androidx.preference.* +import com.novel.read.ui.widget.prefs.EditTextPreferenceDialog +import com.novel.read.ui.widget.prefs.ListPreferenceDialog +import com.novel.read.ui.widget.prefs.MultiSelectListPreferenceDialog + +abstract class BasePreferenceFragment : PreferenceFragmentCompat() { + + private val dialogFragmentTag = "androidx.preference.PreferenceFragment.DIALOG" + + @SuppressLint("RestrictedApi") + override fun onDisplayPreferenceDialog(preference: Preference) { + + var handled = false + if (callbackFragment is OnPreferenceDisplayDialogCallback) { + handled = + (callbackFragment as OnPreferenceDisplayDialogCallback) + .onPreferenceDisplayDialog(this, preference) + } + if (!handled && activity is OnPreferenceDisplayDialogCallback) { + handled = (activity as OnPreferenceDisplayDialogCallback) + .onPreferenceDisplayDialog(this, preference) + } + + if (handled) { + return + } + + // check if dialog is already showing + if (parentFragmentManager.findFragmentByTag(dialogFragmentTag) != null) { + return + } + + val f: DialogFragment = when (preference) { + is EditTextPreference -> { + EditTextPreferenceDialog.newInstance(preference.getKey()) + } + is ListPreference -> { + ListPreferenceDialog.newInstance(preference.getKey()) + } + is MultiSelectListPreference -> { + MultiSelectListPreferenceDialog.newInstance(preference.getKey()) + } + else -> { + throw IllegalArgumentException( + "Cannot display dialog for an unknown Preference type: " + + preference.javaClass.simpleName + + ". Make sure to implement onPreferenceDisplayDialog() to handle " + + "displaying a custom dialog for this Preference." + ) + } + } + f.setTargetFragment(this, 0) + f.show(parentFragmentManager, dialogFragmentTag) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/base/BaseService.kt b/app/src/main/java/com/novel/read/base/BaseService.kt index 1a20fc6..d179802 100644 --- a/app/src/main/java/com/novel/read/base/BaseService.kt +++ b/app/src/main/java/com/novel/read/base/BaseService.kt @@ -1,25 +1,26 @@ package com.novel.read.base import android.app.Service +import android.content.Intent +import com.novel.read.help.coroutine.Coroutine +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import kotlin.coroutines.CoroutineContext -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.disposables.Disposable +abstract class BaseService : Service(), CoroutineScope by MainScope() { -abstract class BaseService : Service() { + fun execute( + scope: CoroutineScope = this, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> T + ) = Coroutine.async(scope, context) { block() } - private var mDisposable: CompositeDisposable? = null - - protected fun addDisposable(disposable: Disposable) { - if (mDisposable == null) { - mDisposable = CompositeDisposable() - } - mDisposable!!.add(disposable) - } + override fun onBind(intent: Intent?) = null override fun onDestroy() { super.onDestroy() - if (mDisposable != null) { - mDisposable!!.dispose() - } + cancel() } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/base/BaseViewModel.kt b/app/src/main/java/com/novel/read/base/BaseViewModel.kt new file mode 100644 index 0000000..d0e99f7 --- /dev/null +++ b/app/src/main/java/com/novel/read/base/BaseViewModel.kt @@ -0,0 +1,154 @@ +package com.novel.read.base + +import android.app.Application +import android.content.Context +import androidx.annotation.CallSuper +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import com.novel.read.App +import com.novel.read.R +import com.novel.read.network.api.ApiException +import com.novel.read.help.coroutine.Coroutine +import kotlinx.coroutines.* +import org.jetbrains.anko.AnkoLogger +import org.jetbrains.anko.toast +import retrofit2.HttpException +import java.net.ConnectException +import java.net.SocketTimeoutException +import java.net.UnknownHostException +import kotlin.coroutines.CoroutineContext + +typealias Block = suspend (CoroutineScope) -> T +typealias Error = suspend (Exception) -> Unit +typealias Cancel = suspend (Exception) -> Unit + +open class BaseViewModel(application: Application) : AndroidViewModel(application), + CoroutineScope by MainScope(), + AnkoLogger { + + val context: Context by lazy { this.getApplication() } + + fun execute( + scope: CoroutineScope = this, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> T + ): Coroutine { + return Coroutine.async(scope, context) { block() } + } + + fun submit( + scope: CoroutineScope = this, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> Deferred + ): Coroutine { + return Coroutine.async(scope, context) { block().await() } + } + + @CallSuper + override fun onCleared() { + super.onCleared() + cancel() + } + + open fun toast(message: Int) { + launch { + context.toast(message) + } + } + + open fun toast(message: CharSequence?) { + launch { + context.toast(message ?: toString()) + } + } + + open fun longToast(message: Int) { + launch { + context.toast(message) + } + } + + open fun longToast(message: CharSequence?) { + launch { + context.toast(message ?: toString()) + } + } + + /** + * 创建并执行协程 + * @param block 协程中执行 + * @param error 错误时执行 + * @param cancel 取消时只需 + * @param showErrorToast 是否弹出错误吐司 + * @return Job + */ + protected fun launch( + block: Block, + error: Error? = null, + cancel: Cancel? = null, + showErrorToast: Boolean = true + ): Job { + return viewModelScope.launch { + try { + block.invoke(this) + } catch (e: Exception) { + when (e) { + is CancellationException -> { + cancel?.invoke(e) + } + else -> { + onError(e, showErrorToast) + error?.invoke(e) + } + } + } + } + } + + /** + * 创建并执行协程 + * @param block 协程中执行 + * @return Deferred + */ + protected fun async(block: Block): Deferred { + return viewModelScope.async { block.invoke(this) } + } + + /** + * 取消协程 + * @param job 协程job + */ + protected fun cancelJob(job: Job?) { + if (job != null && job.isActive && !job.isCompleted && !job.isCancelled) { + job.cancel() + } + } + + /** + * 统一处理错误 + * @param e 异常 + * @param showErrorToast 是否显示错误吐司 + */ + private fun onError(e: Exception, showErrorToast: Boolean) { + when (e) { + is ApiException -> { + when (e.code) { + -1001 -> { + // 登录失效,清除用户信息、清除cookie/token + } + // 其他api错误 + -1 -> if (showErrorToast) toast(e.message) + // 其他错误 + else -> if (showErrorToast) toast(e.message) + } + } + // 网络请求失败 + is ConnectException, is SocketTimeoutException, is UnknownHostException, is HttpException -> + if (showErrorToast) toast(R.string.network_request_failed) + // 其他错误 + else -> + if (showErrorToast) toast(e.message ?: return) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/base/MyApp.kt b/app/src/main/java/com/novel/read/base/MyApp.kt deleted file mode 100644 index c7fd6c7..0000000 --- a/app/src/main/java/com/novel/read/base/MyApp.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.novel.read.base - -import android.app.Application - -import android.content.Context -import android.content.Intent -import android.content.res.Configuration -import android.util.Log - - -import androidx.appcompat.app.AppCompatDelegate - -import com.novel.read.constants.Constant -import com.novel.read.service.DownloadService -import com.novel.read.utlis.LocalManageUtil -import com.novel.read.utlis.SpUtil - - -import org.litepal.LitePal -import kotlin.properties.Delegates - -/** - * create by zlj on 2019/6/10 - */ -class MyApp : Application() { - - override fun onCreate() { - super.onCreate() - context = applicationContext - LitePal.initialize(this) - setNight() - LocalManageUtil.setApplicationLanguage(this) - startService(Intent(context, DownloadService::class.java)) - } - - private fun setNight() { - if (SpUtil.getBooleanValue(Constant.NIGHT, false)) { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - } else { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - } - } - - - override fun attachBaseContext(base: Context) { - SpUtil.init(base) - //保存系统选择语言 - LocalManageUtil.saveSystemCurrentLanguage(base) - super.attachBaseContext(LocalManageUtil.setLocal(base)) - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - //保存系统选择语言 - LocalManageUtil.onConfigurationChanged(applicationContext) - } - - companion object { - var context: Context by Delegates.notNull() - private set - } - -} diff --git a/app/src/main/java/com/novel/read/base/NovelBaseActivity.kt b/app/src/main/java/com/novel/read/base/NovelBaseActivity.kt deleted file mode 100644 index f78b3a3..0000000 --- a/app/src/main/java/com/novel/read/base/NovelBaseActivity.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.novel.read.base - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.view.View -import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AppCompatDelegate -import com.novel.read.R -import com.novel.read.constants.Constant -import com.novel.read.utlis.LocalManageUtil -import com.novel.read.utlis.SpUtil -import com.novel.read.utlis.StatusBarUtil - -/** - * create by 赵利君 on 2019/6/10 - * describe: - */ -abstract class NovelBaseActivity : AppCompatActivity() { - - private var mNowMode: Boolean = false - - protected abstract val layoutId: Int - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - StatusBarUtil.setBarsStyle(this, R.color.colorPrimary, true) - mNowMode = SpUtil.getBooleanValue(Constant.NIGHT) - setContentView(layoutId) - initView() - initData() - - } - - private fun setTheme() { - if (SpUtil.getBooleanValue(Constant.NIGHT) != mNowMode) { - if (SpUtil.getBooleanValue(Constant.NIGHT)) { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - } else { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - } - recreate() - } - } - - protected abstract fun initView() - - protected abstract fun initData() - - override fun onResume() { - super.onResume() - setTheme() - } - - protected fun gone(vararg views: View) { - if (views.isNotEmpty()) { - for (view in views) { - view.visibility = View.GONE - } - } - } - - protected fun visible(vararg views: View) { - if (views.isNotEmpty()) { - for (view in views) { - view.visibility = View.VISIBLE - } - } - } - - protected fun isVisible(view: View): Boolean { - return view.visibility == View.VISIBLE - } - - override fun attachBaseContext(newBase: Context) { - super.attachBaseContext(LocalManageUtil.setLocal(newBase)) - } -} diff --git a/app/src/main/java/com/novel/read/base/NovelBaseFragment.kt b/app/src/main/java/com/novel/read/base/NovelBaseFragment.kt deleted file mode 100644 index a2c3dbb..0000000 --- a/app/src/main/java/com/novel/read/base/NovelBaseFragment.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.novel.read.base - - -import android.content.Intent -import android.os.Bundle - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.annotation.LayoutRes -import androidx.fragment.app.Fragment - - -abstract class NovelBaseFragment : Fragment() { - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(getLayoutId(),null) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - initView() - initData() - } - - /** - * 加载布局 - */ - @LayoutRes - abstract fun getLayoutId():Int - - abstract fun initView() - - abstract fun initData() - - fun toActivity(toClsActivity: Class<*>) { - this.toActivity(toClsActivity, null as Bundle?) - } - - fun toActivity(toClsActivity: Class<*>, bundle: Bundle?) { - val intent = Intent(this.context, toClsActivity) - if (bundle != null) { - intent.putExtras(bundle) - } - - this.startActivity(intent) - } - - fun toActivityForResult(toClsActivity: Class<*>, bundle: Bundle?, requestCode: Int) { - val intent = Intent(this.context, toClsActivity) - if (bundle != null) { - intent.putExtras(bundle) - } - - startActivityForResult(intent, requestCode) - } - - -} diff --git a/app/src/main/java/com/novel/read/base/VMBaseActivity.kt b/app/src/main/java/com/novel/read/base/VMBaseActivity.kt new file mode 100644 index 0000000..a480c8e --- /dev/null +++ b/app/src/main/java/com/novel/read/base/VMBaseActivity.kt @@ -0,0 +1,15 @@ +package com.novel.read.base + +import androidx.lifecycle.ViewModel +import com.novel.read.constant.Theme + +abstract class VMBaseActivity( + layoutID: Int, + fullScreen: Boolean = true, + theme: Theme = Theme.Auto, + toolBarTheme: Theme = Theme.Auto +) : BaseActivity(layoutID, fullScreen, theme, toolBarTheme) { + + protected abstract val viewModel: VM + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/base/VMBaseFragment.kt b/app/src/main/java/com/novel/read/base/VMBaseFragment.kt new file mode 100644 index 0000000..3ecae3e --- /dev/null +++ b/app/src/main/java/com/novel/read/base/VMBaseFragment.kt @@ -0,0 +1,9 @@ +package com.novel.read.base + +import androidx.lifecycle.ViewModel + +abstract class VMBaseFragment(layoutID: Int) : BaseFragment(layoutID) { + + protected abstract val viewModel: VM + +} diff --git a/app/src/main/java/com/novel/read/constant/AppConst.kt b/app/src/main/java/com/novel/read/constant/AppConst.kt new file mode 100644 index 0000000..c7f4876 --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/AppConst.kt @@ -0,0 +1,77 @@ +package com.novel.read.constant + +import android.annotation.SuppressLint +import android.graphics.Color +import java.text.SimpleDateFormat + +@SuppressLint("SimpleDateFormat") +object AppConst { + + const val APP_TAG = "TuZi" + + const val channelIdDownload = "channel_download" + const val channelIdReadAloud = "channel_read_aloud" + const val channelIdWeb = "channel_web" + + const val UA_NAME = "User-Agent" + const val CONCEAL = "http://yijianda8.com/conceal/" + + val timeFormat: SimpleDateFormat by lazy { + SimpleDateFormat("HH:mm") + } + + val dateFormat: SimpleDateFormat by lazy { + SimpleDateFormat("yyyy/MM/dd HH:mm") + } + + val fileNameFormat: SimpleDateFormat by lazy { + SimpleDateFormat("yy-MM-dd-HH-mm-ss") + } + + val keyboardToolChars: List by lazy { + arrayListOf( + "※", "@", "&", "|", "%", "/", ":", "[", "]", "{", "}", "<", ">", "\\", + "$", "#", "!", ".", "href", "src", "textNodes", "xpath", "json", "css", + "id", "class", "tag" + ) + } + + const val notificationIdRead = 1144771 + const val notificationIdAudio = 1144772 + const val notificationIdWeb = 1144773 + const val notificationIdDownload = 1144774 + + + const val refresh = 1 + const val loading = 2 + const val complete = 3 + const val error = 4 + const val loadMore = 5 + const val loadComplete = 6 + const val loadMoreFail = 7 + const val noMore = 8 + + @kotlin.jvm.JvmField + val tagColors = intArrayOf( + Color.parseColor("#90C5F0"), + Color.parseColor("#91CED5"), + Color.parseColor("#F88F55"), + Color.parseColor("#C0AFD0"), + Color.parseColor("#E78F8F"), + Color.parseColor("#67CCB7"), + Color.parseColor("#F6BC7E"), + Color.parseColor("#90C5F0"), + Color.parseColor("#91CED5") + ) + + const val home = 0 + const val man = 1 + const val woman = 2 + + const val shellName = "001" + + val menuViewNames = arrayOf( + "com.android.internal.view.menu.ListMenuItemView", + "androidx.appcompat.view.menu.ListMenuItemView" + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/AppPattern.kt b/app/src/main/java/com/novel/read/constant/AppPattern.kt new file mode 100644 index 0000000..bb89765 --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/AppPattern.kt @@ -0,0 +1,16 @@ +package com.novel.read.constant + +import java.util.regex.Pattern + +object AppPattern { + val JS_PATTERN: Pattern = + Pattern.compile("([\\w\\W]*?|@js:[\\w\\W]*$)", Pattern.CASE_INSENSITIVE) + val EXP_PATTERN: Pattern = Pattern.compile("\\{\\{([\\w\\W]*?)\\}\\}") + val imgPattern: Pattern = + Pattern.compile("", Pattern.CASE_INSENSITIVE) + + val nameRegex = Regex("\\s+作\\s*者.*") + val authorRegex = Regex(".*?作\\s*?者[::]") + val fileNameRegex = Regex("[\\\\/:*?\"<>|.]") + val splitGroupRegex = Regex("[,;,;]") +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/BookType.kt b/app/src/main/java/com/novel/read/constant/BookType.kt new file mode 100644 index 0000000..533d2f0 --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/BookType.kt @@ -0,0 +1,13 @@ +package com.novel.read.constant + +object BookType { + const val default = 0 // 0 文本 + const val audio = 1 // 1 音频 + const val local = "loc_book" + const val net = "net_book" + + + const val serial="01" + const val stop="02" + const val complete="03" +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/EventBus.kt b/app/src/main/java/com/novel/read/constant/EventBus.kt new file mode 100644 index 0000000..f9c218c --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/EventBus.kt @@ -0,0 +1,28 @@ +package com.novel.read.constant + +object EventBus { + const val MEDIA_BUTTON = "mediaButton" + const val RECREATE = "RECREATE" + const val UP_BOOK = "upBookToc" + const val UPDATE_BOOK = "UPDATE_BOOK" + const val ALOUD_STATE = "aloud_state" + const val TTS_PROGRESS = "ttsStart" + const val TTS_DS = "ttsDs" + const val BATTERY_CHANGED = "batteryChanged" + const val TIME_CHANGED = "timeChanged" + const val UP_CONFIG = "upConfig" + const val OPEN_CHAPTER = "openChapter" + const val AUDIO_SUB_TITLE = "audioSubTitle" + const val AUDIO_STATE = "audioState" + const val AUDIO_PROGRESS = "audioProgress" + const val AUDIO_SIZE = "audioSize" + const val AUDIO_SPEED = "audioSpeed" + const val SHOW_RSS = "showRss" + const val SHOW_AD = "showAd" + const val WEB_SERVICE = "webService" + const val UP_DOWNLOAD = "upDownload" + const val SAVE_CONTENT = "saveContent" + const val CHECK_SOURCE = "checkSource" + const val CHECK_SOURCE_DONE = "checkSourceDone" + const val REPLACE_RULE_SAVE = "replaceRuleSave" +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/IntentAction.kt b/app/src/main/java/com/novel/read/constant/IntentAction.kt new file mode 100644 index 0000000..b5dfb12 --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/IntentAction.kt @@ -0,0 +1,30 @@ +package com.novel.read.constant + +object IntentAction { + const val start = "start" + const val play = "play" + const val stop = "stop" + const val resume = "resume" + const val pause = "pause" + const val addTimer = "addTimer" + const val setTimer = "setTimer" + const val prevParagraph = "prevParagraph" + const val nextParagraph = "nextParagraph" + const val upTtsSpeechRate = "upTtsSpeechRate" + const val adjustProgress = "adjustProgress" + const val adjustSpeed = "adjustSpeed" + const val prev = "prev" + const val next = "next" + const val moveTo = "moveTo" + const val init = "init" + const val remove = "remove" + + + //page skip use + const val bookTypeId = "bookTypeId" + const val channelName = "channelName" + const val bookId = "bookId" + const val rankType = "rankType" + const val homeType = "homeType" + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/LayoutType.kt b/app/src/main/java/com/novel/read/constant/LayoutType.kt new file mode 100644 index 0000000..bb98fab --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/LayoutType.kt @@ -0,0 +1,23 @@ +package com.novel.read.constant + +object LayoutType { + const val HOT = 1 + const val CLICK = 2 + const val RECOMMEND= 3 + const val END = 4 + + const val BOY_HOT = 6 + const val BOY_END = 7 + const val BOY_SEARCH = 8 + + const val GIRL_HOT = 9 + const val GIRL_END = 10 + const val GIRL_SEARCH = 11 + + const val HEAD = 100 + const val OTHER = 101 + + + const val INIT_BOOK = 102 + const val SEARCH_BOOK = 103 +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/PreferKey.kt b/app/src/main/java/com/novel/read/constant/PreferKey.kt new file mode 100644 index 0000000..54319ae --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/PreferKey.kt @@ -0,0 +1,70 @@ +package com.novel.read.constant + +object PreferKey { + const val versionCode = "versionCode" + const val language = "language" + const val themeMode = "themeMode" + const val hideStatusBar = "hideStatusBar" + const val clickTurnPage = "clickTurnPage" + const val clickAllNext = "clickAllNext" + const val hideNavigationBar = "hideNavigationBar" + const val precisionSearch = "precisionSearch" + const val speakEngine = "speakEngine" + const val readAloudByPage = "readAloudByPage" + const val ttsSpeechRate = "ttsSpeechRate" + const val prevKeys = "prevKeyCodes" + const val nextKeys = "nextKeyCodes" + const val showRss = "showRss" + const val bookshelfLayout = "bookshelfLayout" + const val bookshelfSort = "bookshelfSort" + const val recordLog = "recordLog" + const val processText = "process_text" + const val cleanCache = "cleanCache" + const val saveTabPosition = "saveTabPosition" + const val fontFolder = "fontFolder" + const val backupPath = "backupUri" + const val restoreIgnore = "restoreIgnore" + const val threadCount = "threadCount" + const val webPort = "webPort" + const val keepLight = "keep_light" + const val webService = "webService" + const val webDavUrl = "web_dav_url" + const val webDavAccount = "web_dav_account" + const val webDavPassword = "web_dav_password" + const val webDavCreateDir = "webDavCreateDir" + const val webDavCacheBackup = "webDavCacheBackup" + const val changeSourceLoadToc = "changeSourceLoadToc" + const val changeSourceLoadInfo = "changeSourceLoadInfo" + const val chineseConverterType = "chineseConverterType" + const val launcherIcon = "launcherIcon" + const val textSelectAble = "selectText" + const val lastBackup = "lastBackup" + const val shareLayout = "shareLayout" + const val readStyleSelect = "readStyleSelect" + const val systemTypefaces = "system_typefaces" + const val readBodyToLh = "readBodyToLh" + const val textFullJustify = "textFullJustify" + const val textBottomJustify = "textBottomJustify" + const val autoReadSpeed = "autoReadSpeed" + const val barElevation = "barElevation" + const val transparentStatusBar = "transparentStatusBar" + const val defaultCover = "defaultCover" + const val replaceEnableDefault = "replaceEnableDefault" + const val showBrightnessView = "showBrightnessView" + const val autoClearExpired = "autoClearExpired" + + const val cPrimary = "colorPrimary" + const val cAccent = "colorAccent" + const val cBackground = "colorBackground" + const val cBBackground = "colorBottomBackground" + + const val cNPrimary = "colorPrimaryNight" + const val cNAccent = "colorAccentNight" + const val cNBackground = "colorBackgroundNight" + const val cNBBackground = "colorBottomBackgroundNight" + + const val installCount = "installCount" + const val installTime = "installTime" + const val appraiseShow = "appraiseShow" + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/Status.kt b/app/src/main/java/com/novel/read/constant/Status.kt new file mode 100644 index 0000000..ddbab5a --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/Status.kt @@ -0,0 +1,7 @@ +package com.novel.read.constant + +object Status { + const val STOP = 0 + const val PLAY = 1 + const val PAUSE = 3 +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constant/Theme.kt b/app/src/main/java/com/novel/read/constant/Theme.kt new file mode 100644 index 0000000..d9bcfc6 --- /dev/null +++ b/app/src/main/java/com/novel/read/constant/Theme.kt @@ -0,0 +1,20 @@ +package com.novel.read.constant + +import com.novel.read.help.AppConfig +import com.novel.read.utils.ColorUtils + + +enum class Theme { + Dark, Light, Auto, Transparent; + + companion object { + fun getTheme() = + if (AppConfig.isNightTheme) Dark + else Light + + fun getTheme(backgroundColor: Int) = + if (ColorUtils.isColorLight(backgroundColor)) Light + else Dark + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/constants/Constant.kt b/app/src/main/java/com/novel/read/constants/Constant.kt deleted file mode 100644 index 630e97d..0000000 --- a/app/src/main/java/com/novel/read/constants/Constant.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.novel.read.constants - -import android.graphics.Color - -import com.novel.read.utlis.FileUtils - -import java.io.File - -// ┏┓   ┏┓ -//┏┛┻━━━┛┻┓ -//┃       ┃ -//┃   ━   ┃ -//┃ ┳┛ ┗┳ ┃ -//┃       ┃ -//┃   ┻   ┃ -//┃       ┃ -//┗━┓   ┏━┛ -// ┃   ┃ 神兽保佑 -// ┃   ┃ 代码无BUG! -// ┃   ┗━━━┓ -// ┃       ┣┓ -// ┃       ┏┛ -// ┗┓┓┏━┳┓┏┛ -// ┃┫┫ ┃┫┫ -// ┗┻┛ ┗┻┛ -/** - * Created by zlj on 2019/7/27. - * desc: 常量 - */ -object Constant { - - const val NIGHT = "NIGHT" - const val Language = "Language" - const val BookSort = "BookSort" - const val Uid = "Uid" - const val Sex = "Sex" - const val Type = "Type" - const val DateType = "DateType" - const val BookGuide = "BookGuide" //图书引导是否提示过 - - const val FORMAT_BOOK_DATE = "yyyy-MM-dd HH:mm:ss" - const val FORMAT_TIME = "HH:mm" - const val COMMENT_SIZE = 10 - - const val FeedBackEmail = "390057892@qq.com" - - /** - * 百度语音合成 - */ - const val appId = "16826023" - const val appKey = "vEuU5gIWGwq5hivdTAaKz0P9" - const val secretKey = "FcWRYUIrOPyE7dy51qfYZmg8Y1ZyP1c4 " - - //BookCachePath (因为getCachePath引用了Context,所以必须是静态变量,不能够是静态常量) - @kotlin.jvm.JvmField - var BOOK_CACHE_PATH: String = (FileUtils.getCachePath() + File.separator - + "book_cache" + File.separator) - - @kotlin.jvm.JvmField - val tagColors = intArrayOf( - Color.parseColor("#90C5F0"), - Color.parseColor("#91CED5"), - Color.parseColor("#F88F55"), - Color.parseColor("#C0AFD0"), - Color.parseColor("#E78F8F"), - Color.parseColor("#67CCB7"), - Color.parseColor("#F6BC7E"), - Color.parseColor("#90C5F0"), - Color.parseColor("#91CED5") - ) - - //榜单类型 - interface ListType { - companion object { - const val Human = "1" - const val EditRecommend = "2" - const val HotSearch = "3" - } - } - - interface GenderType { - companion object { - const val Man = "1" - const val Woman = "2" - } - } - - interface DateTyp { - companion object { - const val General = "3" - const val Month = "2" - const val Week = "1" - } - } - - interface Bundle { - companion object { - const val CategoryId = "category_id" - const val mTitle = "mTitle" - const val BookId = "BookId" - } - } - - interface RequestCode { - companion object { - const val REQUEST_READ = 1 - } - } - - interface ResultCode { - companion object { - const val RESULT_IS_COLLECTED = "result_is_collected" - } - } -} diff --git a/app/src/main/java/com/novel/read/data/README.md b/app/src/main/java/com/novel/read/data/README.md new file mode 100644 index 0000000..a935461 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/README.md @@ -0,0 +1,17 @@ +# 存储数据用 +* dao 数据操作 +* entities 数据模型 +* \Book 书籍信息 +* \BookChapter 目录信息 +* \BookGroup 书籍分组 +* \Bookmark 书签 +* \BookSource 书源 +* \Cookie http cookie +* \ReplaceRule 替换规则 +* \RssArticle rss条目 +* \RssReadRecord rss阅读记录 +* \RssSource rss源 +* \RssStar rss收藏 +* \SearchBook 搜索结果 +* \SearchKeyword 搜索关键字 +* \TxtTocRule txt文件目录规则 diff --git a/app/src/main/java/com/novel/read/data/db/BookDao.kt b/app/src/main/java/com/novel/read/data/db/BookDao.kt new file mode 100644 index 0000000..00b1896 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/BookDao.kt @@ -0,0 +1,50 @@ +package com.novel.read.data.db + +import android.content.ContentValues +import com.novel.read.data.db.entity.Book +import org.litepal.LitePal + + +class BookDao { + + fun getAllBooks(): MutableList = LitePal.findAll(Book::class.java) + + fun lastReadBook(): Book = LitePal.order("durChapterTime desc").findFirst(Book::class.java) + + fun update(book: Book) { + val values = ContentValues() + values.put("authorPenname", book.authorPenname) + values.put("bookName", book.bookName) + values.put("bookStatus", book.bookStatus) + values.put("categoryName", book.categoryName) + values.put("channelName", book.channelName) + values.put("cName", book.cName) + values.put("coverImageUrl", book.coverImageUrl) + values.put("introduction", book.introduction) + values.put("keyWord", book.keyWord) + values.put("lastUpdateChapterDate", book.lastUpdateChapterDate) + values.put("status", book.status) + values.put("wordCount", book.wordCount) + values.put("durChapterTime", book.durChapterTime) + values.put("durChapterIndex", book.durChapterIndex) + values.put("durChapterPos", book.durChapterPos) + values.put("durChapterTitle", book.durChapterTitle) + values.put("totalChapterNum", book.totalChapterNum) + LitePal.updateAll(Book::class.java, values, "bookId=?", book.bookId.toString()) + } + + fun getBook(bookId: String): Book? = + LitePal.where("bookId=?", bookId).findFirst(Book::class.java) + + fun insert(book: Book) = book.saveOrUpdate("bookId=?", book.bookId.toString()) + + fun delete(book: Book): Int = + LitePal.deleteAll(Book::class.java, "bookId=?", book.bookId.toString()) + + fun saveBook(book: List?) { + if (book != null && book.isNotEmpty()) { + LitePal.saveAll(book) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/BookDatabase.kt b/app/src/main/java/com/novel/read/data/db/BookDatabase.kt new file mode 100644 index 0000000..2b0b795 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/BookDatabase.kt @@ -0,0 +1,67 @@ +package com.novel.read.data.db + +class BookDatabase private constructor() { + + companion object { + private var instance: BookDatabase? = null + get() { + if (field == null) { + field = BookDatabase() + } + return field + } + + fun get(): BookDatabase { + return instance!! + } + } + + private var chapterDao: ChapterDao? = null + private var bookDao: BookDao? = null + private var readRecordDao: ReadRecordDao? = null + private var bookMarkDao: BookMarkDao? = null + private var searchHistoryDao: SearchHistoryDao? = null + private var userDao: UserDao? = null + + fun getChapterDao(): ChapterDao { + if (chapterDao == null) { + chapterDao = ChapterDao() + } + return chapterDao!! + } + + fun getBookDao(): BookDao { + if (bookDao == null) { + bookDao = BookDao() + } + return bookDao!! + } + + fun getReadRecordDao(): ReadRecordDao { + if (readRecordDao == null) { + readRecordDao = ReadRecordDao() + } + return readRecordDao!! + } + + fun getBookMarkDao(): BookMarkDao { + if (bookMarkDao == null) { + bookMarkDao = BookMarkDao() + } + return bookMarkDao!! + } + + fun getSearchDao(): SearchHistoryDao { + if (searchHistoryDao == null) { + searchHistoryDao = SearchHistoryDao() + } + return searchHistoryDao!! + } + + fun getUserDao(): UserDao { + if (userDao == null) { + userDao = UserDao() + } + return userDao!! + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/BookMarkDao.kt b/app/src/main/java/com/novel/read/data/db/BookMarkDao.kt new file mode 100644 index 0000000..e486936 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/BookMarkDao.kt @@ -0,0 +1,39 @@ +package com.novel.read.data.db + +import com.novel.read.data.db.entity.Bookmark +import org.litepal.LitePal + +class BookMarkDao { + + fun observeByBook(bookId: Long): List? = + LitePal.where("bookId=?", bookId.toString()).find(Bookmark::class.java) + + fun liveDataSearch(bookId: String, key: String): List? = + LitePal.where( + "bookId=? and (chapterName like ? or content like ?)", + bookId.toString(), + "%${key}%", "%${key}%" + ) + .find(Bookmark::class.java) + + fun insert(bookmark: Bookmark) { + bookmark.saveOrUpdate( + "bookId=? and chapterIndex=?", + bookmark.bookId.toString(), + bookmark.chapterIndex.toString() + ) + } + + fun update(bookmark: Bookmark) { + bookmark.saveOrUpdate( + "bookId=? and chapterIndex=?", + bookmark.bookId.toString(), + bookmark.chapterIndex.toString() + ) + } + + fun delete(bookmark: Bookmark) { + bookmark.delete() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/ChapterDao.kt b/app/src/main/java/com/novel/read/data/db/ChapterDao.kt new file mode 100644 index 0000000..399cfa0 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/ChapterDao.kt @@ -0,0 +1,48 @@ +package com.novel.read.data.db + +import com.novel.read.data.db.entity.BookChapter +import org.litepal.LitePal + +class ChapterDao { + + fun observeByBook(bookId: String): List? = + LitePal.where("bookId=?", bookId.toString()).find(BookChapter::class.java) + + fun liveDataSearch(bookId: String, key: String): List? = + LitePal.where("bookId=? and chapterName like ?", bookId, "%${key}%") + .find(BookChapter::class.java) + + fun getChapter(chapterId: Long): BookChapter? = + LitePal.where("chapterId =?", chapterId.toString()).findFirst(BookChapter::class.java) + + fun getChapter(bookId: Long, chapterIndex: Int): BookChapter? = + LitePal.where("bookId=? and chapterIndex =?", bookId.toString(), chapterIndex.toString()) + .findFirst(BookChapter::class.java) + + fun getChapterList(bookId: Long): List? = + LitePal.where("bookId=?", bookId.toString()).find(BookChapter::class.java) + + fun getChapterList(bookId: Long, start: Int, end: Int): List = + LitePal.where( + "bookId=? and chapterIndex >=? and chapterIndex <=?", + bookId.toString(), + start.toString(), + end.toString() + ).order("chapterIndex desc").find(BookChapter::class.java) + + fun getChapterCount(bookId: Long): Int { + return LitePal.where("bookId=?", bookId.toString()).count(BookChapter::class.java) + } + + fun insert(bookChapters: Array) { + if (bookChapters.isNotEmpty()) { + LitePal.deleteAll( + BookChapter::class.java, + "bookId=?", + bookChapters[0].bookId.toString() + ) + } + LitePal.saveAll(bookChapters.toList()) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/ReadRecordDao.kt b/app/src/main/java/com/novel/read/data/db/ReadRecordDao.kt new file mode 100644 index 0000000..65906e8 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/ReadRecordDao.kt @@ -0,0 +1,23 @@ +package com.novel.read.data.db + +import com.novel.read.data.db.entity.ReadRecord +import org.litepal.LitePal + +class ReadRecordDao { + + fun getReadTime(bookName: String): Long? = + LitePal.where("bookName =?", bookName).findFirst(ReadRecord::class.java)?.readTime + + fun insert(readRecord: ReadRecord) { + readRecord.saveOrUpdate("bookId=?", readRecord.bookId.toString()) + } + + fun delete(readRecord: ReadRecord) { + readRecord.delete() + } + + fun getAll(): List { + return LitePal.findAll(ReadRecord::class.java) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/SearchHistoryDao.kt b/app/src/main/java/com/novel/read/data/db/SearchHistoryDao.kt new file mode 100644 index 0000000..b2955cb --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/SearchHistoryDao.kt @@ -0,0 +1,19 @@ +package com.novel.read.data.db + +import com.novel.read.data.db.entity.SearchHistory +import org.litepal.LitePal + +class SearchHistoryDao { + + fun getListByTime(): MutableList? = + LitePal.order("saveTime desc").limit(5).find(SearchHistory::class.java) + + fun insert(searchHistory: SearchHistory, key: String) { + searchHistory.saveOrUpdate("key=?", key) + } + + fun deleteAll() { + LitePal.deleteAll(SearchHistory::class.java) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/UserDao.kt b/app/src/main/java/com/novel/read/data/db/UserDao.kt new file mode 100644 index 0000000..fc66fd9 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/UserDao.kt @@ -0,0 +1,16 @@ +package com.novel.read.data.db + +import com.novel.read.data.db.entity.User +import org.litepal.LitePal +import org.litepal.extension.deleteAll + +class UserDao { + + fun saveUser(user: User) = user.saveOrUpdate("userId=?", user.userId.toString()) + + fun getUser(): User? = + LitePal.findFirst(User::class.java) + + fun deleteUser() = LitePal.deleteAll() + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/entity/Book.kt b/app/src/main/java/com/novel/read/data/db/entity/Book.kt new file mode 100644 index 0000000..f7c91a8 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/entity/Book.kt @@ -0,0 +1,52 @@ +package com.novel.read.data.db.entity + +import com.google.gson.annotations.SerializedName +import com.novel.read.constant.AppPattern +import com.novel.read.constant.BookType +import com.novel.read.utils.MD5Utils +import org.litepal.crud.LitePalSupport +import kotlin.math.max + +data class Book( + val authorPenname: String, + val bookId: Long, + val bookName: String, + val bookStatus: String, + val categoryName: String?, + val channelName: String?, + @SerializedName("className") + val cName: String?, + val coverImageUrl: String, + val introduction: String, + val keyWord: String, + var lastUpdateChapterDate: String, + val status: Int, + val wordCount: Long, + var totalChapterNum: Int = 0, // 书籍目录总数 + var durChapterTitle: String? = null, // 当前章节名称 + var durChapterIndex: Int = 0, // 当前章节索引 + var durChapterPos: Int = 0, // 当前阅读的进度(首行字符的索引位置) + var durChapterTime: Long = System.currentTimeMillis(), // 最近一次阅读书籍的时间(打开正文的时间) + var origin: String = BookType.net, + var originName: String = "", + var bookTypeId: Int = 0 +) : LitePalSupport() { + + fun isLocalBook(): Boolean { + return origin == BookType.local + } + + fun getFolderName(): String { + return bookName.replace(AppPattern.fileNameRegex, "") + MD5Utils.md5Encode16(coverImageUrl) + } + + fun isEpub(): Boolean { + return originName.endsWith(".epub", true) + } + + fun canUpdate(): Boolean { + return bookStatus == BookType.serial + } + + fun getUnreadChapterNum() = max(totalChapterNum - durChapterIndex - 1, 0) +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/entity/BookChapter.kt b/app/src/main/java/com/novel/read/data/db/entity/BookChapter.kt new file mode 100644 index 0000000..3052fd0 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/entity/BookChapter.kt @@ -0,0 +1,19 @@ +package com.novel.read.data.db.entity + +import org.litepal.crud.LitePalSupport + +data class BookChapter( +// val bookId: Int, +// val chapterList: List, +// val volumeId: Int, +// val volumeName: String + + val chapterId: Long, + val bookId: Long, + val chapterIndex: Int, + var chapterName: String, + val createTimeValue: Long, + val updateDate: String, + val updateTimeValue: Long, + val chapterUrl: String?, +) : LitePalSupport() \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/entity/Bookmark.kt b/app/src/main/java/com/novel/read/data/db/entity/Bookmark.kt new file mode 100644 index 0000000..0132bdf --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/entity/Bookmark.kt @@ -0,0 +1,16 @@ +package com.novel.read.data.db.entity + +import org.litepal.crud.LitePalSupport +import java.io.Serializable + +data class Bookmark( + var time: Long = System.currentTimeMillis(), + var bookId: Long = 0, + var bookName: String = "", + val bookAuthor: String = "", + var chapterIndex: Int = 0, + var pageIndex: Int = 0, + var chapterName: String = "", + var content: String = "" + +) : LitePalSupport(), Serializable \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/entity/ChapterDetailEntity.kt b/app/src/main/java/com/novel/read/data/db/entity/ChapterDetailEntity.kt new file mode 100644 index 0000000..f3942ab --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/entity/ChapterDetailEntity.kt @@ -0,0 +1,10 @@ +package com.novel.read.data.db.entity + +data class ChapterDetailEntity( + val chapterContent: String, + val chapterIndex: Int, + val chapterName: String, + val isRecommend: String, + val isVIP: String, + val wordCount: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/entity/HttpTTS.kt b/app/src/main/java/com/novel/read/data/db/entity/HttpTTS.kt new file mode 100644 index 0000000..0d3d8fa --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/entity/HttpTTS.kt @@ -0,0 +1,9 @@ +package com.novel.read.data.db.entity + +import org.litepal.crud.LitePalSupport + +data class HttpTTS( + val id: Long = System.currentTimeMillis(), + var name: String = "", + var url: String = "" +) : LitePalSupport() \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/entity/ReadRecord.kt b/app/src/main/java/com/novel/read/data/db/entity/ReadRecord.kt new file mode 100644 index 0000000..36f806c --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/entity/ReadRecord.kt @@ -0,0 +1,15 @@ +package com.novel.read.data.db.entity + +import org.litepal.crud.LitePalSupport + +import java.io.Serializable + +/** + * Created by zlj + */ +class ReadRecord( + var androidId: String = "", + var bookName: String = "", + var bookId: Long = 0L, + var readTime: Long = 0L +) : LitePalSupport(), Serializable diff --git a/app/src/main/java/com/novel/read/model/db/SearchListTable.kt b/app/src/main/java/com/novel/read/data/db/entity/SearchHistory.kt similarity index 63% rename from app/src/main/java/com/novel/read/model/db/SearchListTable.kt rename to app/src/main/java/com/novel/read/data/db/entity/SearchHistory.kt index 6d6053a..2b42e37 100644 --- a/app/src/main/java/com/novel/read/model/db/SearchListTable.kt +++ b/app/src/main/java/com/novel/read/data/db/entity/SearchHistory.kt @@ -1,20 +1,13 @@ -package com.novel.read.model.db - +package com.novel.read.data.db.entity +import com.novel.read.utils.StringUtils import org.litepal.crud.LitePalSupport - import java.io.Serializable -/** - * create by zlj on 2019/6/19 - * describe: - */ -class SearchListTable : LitePalSupport(), Serializable { - - var key: String = "" +class SearchHistory( + var key: String = "", var saveTime: Long = 0 - - +) : LitePalSupport(), Serializable { override fun equals(other: Any?): Boolean { return if (other != null && other.toString() == key) { true @@ -26,4 +19,8 @@ class SearchListTable : LitePalSupport(), Serializable { result = 31 * result + saveTime.hashCode() return result } -} + + fun getBKey(): String { + return StringUtils.convertCC(key) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/db/entity/User.kt b/app/src/main/java/com/novel/read/data/db/entity/User.kt new file mode 100644 index 0000000..cb63dd1 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/db/entity/User.kt @@ -0,0 +1,29 @@ +package com.novel.read.data.db.entity + +import org.litepal.crud.LitePalSupport +import java.io.Serializable + +data class User( + val createTime: Long, + val email: String, + val headImageUrl: String, + val idToken: String, + val introduction: String?, + val ip: String, + val isEmailVerified: Int, + val lastLoginTime: Long?, + val nickName: String?, + val oldNickName: String?, + val os: String, + val password: String, + val phone: String, + val provider: String, + val sex: Int, + val updateTime: Long?, + val userId: Long, + val userName: String, + val validFlag: Int, + val vipEndTime: Long?, + val vipStartTime: Long?, + val vipStatus: Int +) : LitePalSupport(), Serializable \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/AppUpdateResp.kt b/app/src/main/java/com/novel/read/data/model/AppUpdateResp.kt new file mode 100644 index 0000000..23a9a6b --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/AppUpdateResp.kt @@ -0,0 +1,20 @@ +package com.novel.read.data.model + +data class AppUpdateResp( + val appEdition: AppEdition +) + +data class AppEdition( + val createTime: String, + val editionCode: String, + val editionId: Int, + val fileUrl: String, + val forceUpdate: Int, + val insideEditionCode: Int, + val isDel: Int, + val packageSize: String, + val pushTime: String, + val shellName: String, + val status: Int, + val upgradeContent: String +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/BookInfoResp.kt b/app/src/main/java/com/novel/read/data/model/BookInfoResp.kt new file mode 100644 index 0000000..e395fc6 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/BookInfoResp.kt @@ -0,0 +1,33 @@ +package com.novel.read.data.model + +data class BookInfoResp( + val book: BookResp +) + +data class BookResp( + val authorInformation: Any, + val authorName: String, + val authorUserId: Long, + val bookClass: Any, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Any, + val bookTypeId: Int, + val categoryName: String?, + val channelName: Any?, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Any, + val hits: Any, + val hotStatus: Any, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: Any, + val rankType: Any, + val recommendStatus: Any, + val validFlag: Int, + val wordCount: Long +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/BookListResp.kt b/app/src/main/java/com/novel/read/data/model/BookListResp.kt new file mode 100644 index 0000000..6029d23 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/BookListResp.kt @@ -0,0 +1,52 @@ +package com.novel.read.data.model + +import com.novel.read.utils.StringUtils + +data class BookListResp( + val authorInformation: String, + var authorName: String?, + val authorUserId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Int, + val categoryName: String?, + val channelName: String?, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val hotStatus: Int, + val introduction: String?, + val keyWord: String, + val lastUpdateChapterDate: String?, + val recommendStatus: Int, + val validFlag: Int, + val wordCount: Long + +) { + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName!!) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName ?: "") + } + + fun getBChannel(): String { + return StringUtils.convertCC(channelName!!) + } + + fun getBIntroduction(): String { + return StringUtils.convertCC(introduction!!) + } + + fun getBKeyWord(): String { + return StringUtils.convertCC(keyWord) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/BoyEndRank.kt b/app/src/main/java/com/novel/read/data/model/BoyEndRank.kt new file mode 100644 index 0000000..dd5f071 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/BoyEndRank.kt @@ -0,0 +1,51 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class BoyEndRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Long, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int, + val wordCount: Long +){ + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class BoyEndRankEntity(val boyEndRanks:List):MultiItemEntity{ + override val itemType: Int + get() = LayoutType.BOY_END +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/BoyHotRank.kt b/app/src/main/java/com/novel/read/data/model/BoyHotRank.kt new file mode 100644 index 0000000..1a51daf --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/BoyHotRank.kt @@ -0,0 +1,50 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class BoyHotRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Long, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int +) { + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class BoyHotRankEntity(val boyHotRanks: List) : MultiItemEntity { + override val itemType: Int + get() = LayoutType.BOY_HOT +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/BoySearchRank.kt b/app/src/main/java/com/novel/read/data/model/BoySearchRank.kt new file mode 100644 index 0000000..c68c2b2 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/BoySearchRank.kt @@ -0,0 +1,50 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class BoySearchRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Long, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int +){ + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class BoySearchRankEntity(val boySearchRanks:List):MultiItemEntity{ + override val itemType: Int + get() = LayoutType.BOY_SEARCH +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/ChannelResp.kt b/app/src/main/java/com/novel/read/data/model/ChannelResp.kt new file mode 100644 index 0000000..bbc722f --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/ChannelResp.kt @@ -0,0 +1,24 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.SectionEntity +import com.novel.read.utils.StringUtils + +data class ChannelResp( + val allType: List +) + +data class AllType( + val bookTypeId: Long, + val categoryName: String, + val createTime: Long, + val validFlag: Int, + val typeImageUrl:String, + val bookCount :Int +) : SectionEntity { + override val isHeader: Boolean + get() = false + + fun getBChannel(): String { + return StringUtils.convertCC(categoryName) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/ChannelSection.kt b/app/src/main/java/com/novel/read/data/model/ChannelSection.kt new file mode 100644 index 0000000..2bc8941 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/ChannelSection.kt @@ -0,0 +1,8 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.SectionEntity + +data class ChannelSection( + override val isHeader: Boolean, + val obj: Any +) : SectionEntity \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/ChapterContentResp.kt b/app/src/main/java/com/novel/read/data/model/ChapterContentResp.kt new file mode 100644 index 0000000..bde4345 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/ChapterContentResp.kt @@ -0,0 +1,16 @@ +package com.novel.read.data.model + +data class ChapterContentResp( + val chapter: ChapterContent +) + +data class ChapterContent( + val bookId: Long, + val chapterContent: String, + val chapterId: Long, + val chapterIndex: Int, + val chapterName: String, + val chapterUrl: Any, + val createTime: Long, + val validFlag: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/ChapterResp.kt b/app/src/main/java/com/novel/read/data/model/ChapterResp.kt new file mode 100644 index 0000000..be34a63 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/ChapterResp.kt @@ -0,0 +1,16 @@ +package com.novel.read.data.model + +data class ChapterResp( + val chapterList: List?, + val count: Int +) + +data class Chapter( + val bookId: Long, + val chapterId: Long, + val chapterIndex: Int, + val chapterName: String, + val chapterUrl: String?, + val createTime: Long, + val validFlag: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/ClickRank.kt b/app/src/main/java/com/novel/read/data/model/ClickRank.kt new file mode 100644 index 0000000..865a281 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/ClickRank.kt @@ -0,0 +1,51 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class ClickRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Int, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int, + val wordCount: Long +){ + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class ClickEntity(val clickRanks:List):MultiItemEntity{ + override val itemType: Int + get() = LayoutType.CLICK +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/Default.kt b/app/src/main/java/com/novel/read/data/model/Default.kt new file mode 100644 index 0000000..a9450d9 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/Default.kt @@ -0,0 +1,3 @@ +package com.novel.read.data.model + +class Default() \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/EndRank.kt b/app/src/main/java/com/novel/read/data/model/EndRank.kt new file mode 100644 index 0000000..4cbc584 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/EndRank.kt @@ -0,0 +1,49 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class EndRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Int, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int +){ + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class EndEntity(val endRanks: List) : MultiItemEntity { + override val itemType: Int + get() = LayoutType.END +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/GirlEndRank.kt b/app/src/main/java/com/novel/read/data/model/GirlEndRank.kt new file mode 100644 index 0000000..27b33cd --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/GirlEndRank.kt @@ -0,0 +1,51 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class GirlEndRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Long, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int, + val wordCount: Long +){ + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class GirlEndRankEntity(val girlEndRanks:List):MultiItemEntity{ + override val itemType: Int + get() = LayoutType.GIRL_END +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/GirlHotRank.kt b/app/src/main/java/com/novel/read/data/model/GirlHotRank.kt new file mode 100644 index 0000000..5c2e054 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/GirlHotRank.kt @@ -0,0 +1,51 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class GirlHotRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Long, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int +){ + + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class GirlHotRankEntity(val girlHotRanks:List):MultiItemEntity{ + override val itemType: Int + get() = LayoutType.GIRL_HOT +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/GirlSearchRank.kt b/app/src/main/java/com/novel/read/data/model/GirlSearchRank.kt new file mode 100644 index 0000000..14f52ee --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/GirlSearchRank.kt @@ -0,0 +1,51 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class GirlSearchRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Long, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int +){ + + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } +} + +data class GirlSearchRankEntity(val girlSearchRanks:List):MultiItemEntity{ + override val itemType: Int + get() = LayoutType.GIRL_SEARCH +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/GoodsResp.kt b/app/src/main/java/com/novel/read/data/model/GoodsResp.kt new file mode 100644 index 0000000..49e42e5 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/GoodsResp.kt @@ -0,0 +1,15 @@ +package com.novel.read.data.model + +data class GoodsResp( + val bookCommodityClass: Int, + val bookCommodityId: Long, + val commodityCode: String, + val commodityCurrentValuation: Int, + val commodityName: String, + val commodityValuation: Int, + val createTime: Long, + val discount: Int, + val remark: String, + val thirdCommodityNumber: String, + val validFlag: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/HomeBanner.kt b/app/src/main/java/com/novel/read/data/model/HomeBanner.kt new file mode 100644 index 0000000..c528876 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/HomeBanner.kt @@ -0,0 +1,11 @@ +package com.novel.read.data.model + +data class HomeBanner( + val bannerId: Int, + val bookChannelId: Long, + val bookId: Int, + val createTime: String, + val imgUrl: String, + val isDel: Int, + val type: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/HomeResp.kt b/app/src/main/java/com/novel/read/data/model/HomeResp.kt new file mode 100644 index 0000000..8adcf6a --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/HomeResp.kt @@ -0,0 +1,16 @@ +package com.novel.read.data.model + +data class HomeResp( + val wordNumRank: List, + val clickRank: List, + val starRank: List, + val recommendRank: List, + + val boyHotRank: List, + val boyEndRank: List, + val boyHotSearchRank: List, + + val girlHotRank: List, + val girlEndRank: List, + val girlHotSearchRank: List, +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/HotRank.kt b/app/src/main/java/com/novel/read/data/model/HotRank.kt new file mode 100644 index 0000000..3942806 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/HotRank.kt @@ -0,0 +1,45 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class HotRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Int, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int +){ + fun getBName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBAuthor(): String { + return StringUtils.convertCC(authorName) + } +} + +data class HotEntity(val hotRanks: List) : MultiItemEntity { + override val itemType: Int + get() = LayoutType.HOT +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/LoginReq.kt b/app/src/main/java/com/novel/read/data/model/LoginReq.kt new file mode 100644 index 0000000..77b2331 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/LoginReq.kt @@ -0,0 +1,21 @@ +package com.novel.read.data.model + +data class LoginReq( + val email: String, + val headImageUrl: String, + val idToken: String, + val ip: String, + var isEmailVerified: Int, + val nickName: String, + val os: String = "Android", + val phone: String, + val provider: String +){ + fun setIsEmail(boolean: Boolean){ + isEmailVerified = if (boolean){ + 0 + }else{ + 1 + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/Pagination.kt b/app/src/main/java/com/novel/read/data/model/Pagination.kt new file mode 100644 index 0000000..da2db28 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/Pagination.kt @@ -0,0 +1,14 @@ +package com.novel.read.data.model + +import androidx.annotation.Keep + +/** + * Created by xiaojianjun on 2019-11-07. + */ +@Keep +data class Pagination( + val count: Int, + val bookList: MutableList, + val bookRankList: MutableList, + val searchTermsList: MutableList +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/PaginationSimilar.kt b/app/src/main/java/com/novel/read/data/model/PaginationSimilar.kt new file mode 100644 index 0000000..55f6eb0 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/PaginationSimilar.kt @@ -0,0 +1,9 @@ +package com.novel.read.data.model + +import androidx.annotation.Keep + + +@Keep +data class PaginationSimilar( + val recommendBookList: MutableList +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/RecommendRank.kt b/app/src/main/java/com/novel/read/data/model/RecommendRank.kt new file mode 100644 index 0000000..ca20870 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/RecommendRank.kt @@ -0,0 +1,53 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType +import com.novel.read.utils.StringUtils + +data class RecommendRank( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Int, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hits: String, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val rankNumber: String, + val rankType: String, + val recommendStatus: Int, + val validFlag: Int +) : MultiItemEntity { + override val itemType: Int + get() = LayoutType.RECOMMEND + + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } + +} + +data class RecommendEntity(val recommendRanks: List) : MultiItemEntity { + override val itemType: Int + get() = LayoutType.RECOMMEND +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/SearchResp.kt b/app/src/main/java/com/novel/read/data/model/SearchResp.kt new file mode 100644 index 0000000..0f9c4ad --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/SearchResp.kt @@ -0,0 +1,53 @@ +package com.novel.read.data.model + +import com.novel.read.utils.StringUtils + +data class SearchResp( + val authorInformation: String, + val authorName: String, + val authorUserId: Long, + val bookChannelId: Long, + val bookClass: Int, + val bookId: Long, + val bookName: String, + val bookSId: String, + val bookStatus: Int, + val bookTypeId: Int, + val categoryName: String, + val channelName: String, + val coverImageUrl: String, + val createTime: Long, + val endStatus: Int, + val extBookId: Int, + val hotStatus: Int, + val introduction: String, + val keyWord: String, + val lastUpdateChapterDate: String, + val recommendStatus: Int, + val validFlag: Int, + val wordCount: Long, +){ + fun getBAuthorName(): String { + return StringUtils.convertCC(authorName) + } + + fun getBBookName(): String { + return StringUtils.convertCC(bookName) + } + + fun getBCategoryName(): String { + return StringUtils.convertCC(categoryName) + } + + fun getBChannel(): String { + return StringUtils.convertCC(channelName) + } + + fun getBIntroduction(): String { + return StringUtils.convertCC(introduction) + } + + fun getBKeyWord(): String { + return StringUtils.convertCC(keyWord) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/Tools.kt b/app/src/main/java/com/novel/read/data/model/Tools.kt new file mode 100644 index 0000000..aecd2d5 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/Tools.kt @@ -0,0 +1,5 @@ +package com.novel.read.data.model + +class Tools(var title: String, var img: Int) { + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/TypeEntity.kt b/app/src/main/java/com/novel/read/data/model/TypeEntity.kt new file mode 100644 index 0000000..2a6c108 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/TypeEntity.kt @@ -0,0 +1,9 @@ +package com.novel.read.data.model + +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.constant.LayoutType + +class TypeEntity: MultiItemEntity { + override val itemType: Int + get() = LayoutType.OTHER +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/TypeName.kt b/app/src/main/java/com/novel/read/data/model/TypeName.kt new file mode 100644 index 0000000..4adbf20 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/TypeName.kt @@ -0,0 +1,69 @@ +package com.novel.read.data.model + +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.LayoutType +import kotlin.collections.ArrayList + + +data class TypeName( + val rankType: Int, + val name: String, + var check: Boolean +) { + + +} + +fun rankList(layoutType: Int): List { + val list: MutableList = + ArrayList() + list.clear() + list.add(TypeName(LayoutType.HOT, App.INSTANCE.getString(R.string.big_hot_title), false)) + list.add(TypeName(LayoutType.CLICK, App.INSTANCE.getString(R.string.click_title), false)) + list.add( + TypeName( + LayoutType.RECOMMEND, + App.INSTANCE.getString(R.string.recommend_title), + false + ) + ) + list.add(TypeName(LayoutType.END, App.INSTANCE.getString(R.string.end_title), false)) + + list[layoutType - 1].check = true + return list +} + +fun manList(layoutType: Int): List { + val list: MutableList = + ArrayList() + list.clear() + list.add(TypeName(LayoutType.BOY_HOT, App.INSTANCE.getString(R.string.big_hot_title), false)) + list.add(TypeName(LayoutType.BOY_END, App.INSTANCE.getString(R.string.end_title2), false)) + list.add( + TypeName( + LayoutType.BOY_SEARCH, + App.INSTANCE.getString(R.string.hot_search_title), + false + ) + ) + list[layoutType - 6].check = true + return list +} + +fun womanList(layoutType: Int): List { + val list: MutableList = + ArrayList() + list.clear() + list.add(TypeName(LayoutType.GIRL_HOT, App.INSTANCE.getString(R.string.big_hot_title), false)) + list.add(TypeName(LayoutType.GIRL_END, App.INSTANCE.getString(R.string.end_title2), false)) + list.add( + TypeName( + LayoutType.GIRL_SEARCH, + App.INSTANCE.getString(R.string.hot_search_title), + false + ) + ) + list[layoutType - 9].check = true + return list +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/model/UserResp.kt b/app/src/main/java/com/novel/read/data/model/UserResp.kt new file mode 100644 index 0000000..942093e --- /dev/null +++ b/app/src/main/java/com/novel/read/data/model/UserResp.kt @@ -0,0 +1,32 @@ +package com.novel.read.data.model + +import com.novel.read.data.db.entity.User + +data class UserResp( + val user: User +) +// +//data class User( +// val createTime: Long, +// val email: String, +// val headImageUrl: String, +// val idToken: String, +// val introduction: Any, +// val ip: String, +// val isEmailVerified: Int, +// val lastLoginTime: Any, +// val nickName: String, +// val oldNickName: Any, +// val os: String, +// val password: String, +// val phone: String, +// val provider: String, +// val sex: Any, +// val updateTime: Any, +// val userId: Long, +// val userName: String, +// val validFlag: Int, +// val vipEndTime: Any, +// val vipStartTime: Any, +// val vipStatus: Int +//) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/read/TextChapter.kt b/app/src/main/java/com/novel/read/data/read/TextChapter.kt new file mode 100644 index 0000000..463321e --- /dev/null +++ b/app/src/main/java/com/novel/read/data/read/TextChapter.kt @@ -0,0 +1,54 @@ +package com.novel.read.data.read + +import kotlin.math.min + +data class TextChapter( + val position: Int, + val title: String, + val chapterId: Int, + val pages: List, + val pageLines: List, + val pageLengths: List, + val chaptersSize: Int +) { + fun page(index: Int): TextPage? { + return pages.getOrNull(index) + } + + val lastPage: TextPage? get() = pages.lastOrNull() + + val lastIndex: Int get() = pages.lastIndex + + val pageSize: Int get() = pages.size + + fun isLastIndex(index: Int): Boolean { + return index >= pages.size - 1 + } + + fun getReadLength(pageIndex: Int): Int { + var length = 0 + val maxIndex = min(pageIndex, pages.size) + for (index in 0 until maxIndex) { + length += pageLengths[index] + } + return length + } + + fun getUnRead(pageIndex: Int): String { + val stringBuilder = StringBuilder() + if (pages.isNotEmpty()) { + for (index in pageIndex..pages.lastIndex) { + stringBuilder.append(pages[index].text) + } + } + return stringBuilder.toString() + } + + fun getContent(): String { + val stringBuilder = StringBuilder() + pages.forEach { + stringBuilder.append(it.text) + } + return stringBuilder.toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/read/TextChar.kt b/app/src/main/java/com/novel/read/data/read/TextChar.kt new file mode 100644 index 0000000..03400b3 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/read/TextChar.kt @@ -0,0 +1,9 @@ +package com.novel.read.data.read + +data class TextChar( + val charData: String, + var start: Float, + var end: Float, + var selected: Boolean = false, + var isImage: Boolean = false +) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/data/read/TextLine.kt b/app/src/main/java/com/novel/read/data/read/TextLine.kt new file mode 100644 index 0000000..237a252 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/read/TextLine.kt @@ -0,0 +1,39 @@ +package com.novel.read.data.read + +import android.text.TextPaint +import io.legado.app.ui.book.read.page.provider.ChapterProvider +import io.legado.app.ui.book.read.page.provider.ChapterProvider.textHeight + +data class TextLine( + var text: String = "", + val textChars: ArrayList = arrayListOf(), + var lineTop: Float = 0f, + var lineBase: Float = 0f, + var lineBottom: Float = 0f, + val isTitle: Boolean = false, + val isImage: Boolean = false, + var isReadAloud: Boolean = false +) { + + fun upTopBottom(durY: Float, textPaint: TextPaint) { + lineTop = ChapterProvider.paddingTop + durY + lineBottom = lineTop + textPaint.textHeight + lineBase = lineBottom - textPaint.fontMetrics.descent + } + + fun addTextChar(charData: String, start: Float, end: Float) { + textChars.add(TextChar(charData, start = start, end = end)) + } + + fun getTextCharAt(index: Int): TextChar { + return textChars[index] + } + + fun getTextCharReverseAt(index: Int): TextChar { + return textChars[textChars.lastIndex - index] + } + + fun getTextCharsCount(): Int { + return textChars.size + } +} diff --git a/app/src/main/java/com/novel/read/data/read/TextPage.kt b/app/src/main/java/com/novel/read/data/read/TextPage.kt new file mode 100644 index 0000000..25189e1 --- /dev/null +++ b/app/src/main/java/com/novel/read/data/read/TextPage.kt @@ -0,0 +1,122 @@ +package com.novel.read.data.read + +import android.text.Layout +import android.text.StaticLayout +import com.novel.read.App +import com.novel.read.R +import com.novel.read.help.ReadBookConfig +import io.legado.app.ui.book.read.page.provider.ChapterProvider +import java.text.DecimalFormat + +data class TextPage( + var index: Int = 0, + var text: String = App.INSTANCE.getString(R.string.data_loading), + var title: String = "", + val textLines: ArrayList = arrayListOf(), + var pageSize: Int = 0, + var chapterSize: Int = 0, + var chapterIndex: Int = 0, + var height: Float = 0f +) { + + fun upLinesPosition() = ChapterProvider.apply { + if (!ReadBookConfig.textBottomJustify) return@apply + if (textLines.size <= 1) return@apply + if (textLines.last().isImage) return@apply + if (visibleHeight - height >= with(textLines.last()) { lineBottom - lineTop }) return@apply + val surplus = (visibleBottom - textLines.last().lineBottom) + if (surplus == 0f) return@apply + height += surplus + val tj = surplus / (textLines.size - 1) + for (i in 1 until textLines.size) { + val line = textLines[i] + line.lineTop = line.lineTop + tj * i + line.lineBase = line.lineBase + tj * i + line.lineBottom = line.lineBottom + tj * i + } + } + + @Suppress("DEPRECATION") + fun format(): TextPage { + if (textLines.isEmpty() && ChapterProvider.visibleWidth > 0) { + val layout = StaticLayout( + text, ChapterProvider.contentPaint, ChapterProvider.visibleWidth, + Layout.Alignment.ALIGN_NORMAL, 1f, 0f, false + ) + var y = (ChapterProvider.visibleHeight - layout.height) / 2f + if (y < 0) y = 0f + for (lineIndex in 0 until layout.lineCount) { + val textLine = TextLine() + textLine.lineTop = ChapterProvider.paddingTop + y + layout.getLineTop(lineIndex) + textLine.lineBase = + ChapterProvider.paddingTop + y + layout.getLineBaseline(lineIndex) + textLine.lineBottom = + ChapterProvider.paddingTop + y + layout.getLineBottom(lineIndex) + var x = ChapterProvider.paddingLeft + + (ChapterProvider.visibleWidth - layout.getLineMax(lineIndex)) / 2 + textLine.text = + text.substring(layout.getLineStart(lineIndex), layout.getLineEnd(lineIndex)) + for (i in textLine.text.indices) { + val char = textLine.text[i].toString() + val cw = StaticLayout.getDesiredWidth(char, ChapterProvider.contentPaint) + val x1 = x + cw + textLine.addTextChar(charData = char, start = x, end = x1) + x = x1 + } + textLines.add(textLine) + } + height = ChapterProvider.visibleHeight.toFloat() + } + return this + } + + fun removePageAloudSpan(): TextPage { + textLines.forEach { textLine -> + textLine.isReadAloud = false + } + return this + } + + fun upPageAloudSpan(pageStart: Int) { + removePageAloudSpan() + var lineStart = 0 + for ((index, textLine) in textLines.withIndex()) { + if (pageStart > lineStart && pageStart < lineStart + textLine.text.length) { + for (i in index - 1 downTo 0) { + if (textLines[i].text.endsWith("\n")) { + break + } else { + textLines[i].isReadAloud = true + } + } + for (i in index until textLines.size) { + if (textLines[i].text.endsWith("\n")) { + textLines[i].isReadAloud = true + break + } else { + textLines[i].isReadAloud = true + } + } + break + } + lineStart += textLine.text.length + } + } + + val readProgress: String + get() { + val df = DecimalFormat("0.0%") + if (chapterSize == 0 || pageSize == 0 && chapterIndex == 0) { + return "0.0%" + } else if (pageSize == 0) { + return df.format((chapterIndex + 1.0f) / chapterSize.toDouble()) + } + var percent = + df.format(chapterIndex * 1.0f / chapterSize + 1.0f / chapterSize * (index + 1) / pageSize.toDouble()) + if (percent == "100.0%" && (chapterIndex + 1 != chapterSize || index + 1 != pageSize)) { + percent = "99.9%" + } + return percent + } + +} diff --git a/app/src/main/java/com/novel/read/event/AddBookSignEvent.kt b/app/src/main/java/com/novel/read/event/AddBookSignEvent.kt deleted file mode 100644 index 4566d2a..0000000 --- a/app/src/main/java/com/novel/read/event/AddBookSignEvent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.mango.mangolib.http.ErrorResponse - -/** - * create by 赵利君 on 2019/6/25 - * describe: - */ -class AddBookSignEvent : BaseEvent { - constructor(result: ErrorResponse) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/BookArticleEvent.kt b/app/src/main/java/com/novel/read/event/BookArticleEvent.kt deleted file mode 100644 index 9901bb1..0000000 --- a/app/src/main/java/com/novel/read/event/BookArticleEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.BookArticleResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class BookArticleEvent : BaseEvent { - - constructor(result: BookArticleResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/DeleteBookSignEvent.kt b/app/src/main/java/com/novel/read/event/DeleteBookSignEvent.kt deleted file mode 100644 index ee62dbd..0000000 --- a/app/src/main/java/com/novel/read/event/DeleteBookSignEvent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.mango.mangolib.http.ErrorResponse - -class DeleteBookSignEvent : BaseEvent{ - constructor(result: ErrorResponse) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/DeleteResponseEvent.kt b/app/src/main/java/com/novel/read/event/DeleteResponseEvent.kt deleted file mode 100644 index 1691041..0000000 --- a/app/src/main/java/com/novel/read/event/DeleteResponseEvent.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.db.CollBookBean - -class DeleteResponseEvent(var isDelete: Boolean, var collBook: CollBookBean) : BaseEvent() - diff --git a/app/src/main/java/com/novel/read/event/DeleteTaskEvent.kt b/app/src/main/java/com/novel/read/event/DeleteTaskEvent.kt deleted file mode 100644 index 4474419..0000000 --- a/app/src/main/java/com/novel/read/event/DeleteTaskEvent.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.db.CollBookBean - -class DeleteTaskEvent(var collBook: CollBookBean) : BaseEvent() diff --git a/app/src/main/java/com/novel/read/event/EditEvent.kt b/app/src/main/java/com/novel/read/event/EditEvent.kt deleted file mode 100644 index 5cf201a..0000000 --- a/app/src/main/java/com/novel/read/event/EditEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.RecommendListResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class EditEvent : BaseEvent { - - constructor(result: RecommendListResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/ErrorChapterEvent.kt b/app/src/main/java/com/novel/read/event/ErrorChapterEvent.kt deleted file mode 100644 index b65bead..0000000 --- a/app/src/main/java/com/novel/read/event/ErrorChapterEvent.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent - -class ErrorChapterEvent : BaseEvent { - constructor(result: Any) : super(result) - - constructor() -} diff --git a/app/src/main/java/com/novel/read/event/FinishChapterEvent.kt b/app/src/main/java/com/novel/read/event/FinishChapterEvent.kt deleted file mode 100644 index d2d7a6c..0000000 --- a/app/src/main/java/com/novel/read/event/FinishChapterEvent.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent - -class FinishChapterEvent : BaseEvent { - constructor(result: Any) : super(result) - - constructor() -} diff --git a/app/src/main/java/com/novel/read/event/GetBookDetailEvent.kt b/app/src/main/java/com/novel/read/event/GetBookDetailEvent.kt deleted file mode 100644 index d5bc678..0000000 --- a/app/src/main/java/com/novel/read/event/GetBookDetailEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.BookDetailResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class GetBookDetailEvent : BaseEvent { - - constructor(result: BookDetailResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/GetBookSignEvent.kt b/app/src/main/java/com/novel/read/event/GetBookSignEvent.kt deleted file mode 100644 index 9e8b03b..0000000 --- a/app/src/main/java/com/novel/read/event/GetBookSignEvent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.MarkResp - -/** - * create by 赵利君 on 2019/6/25 - * describe: - */ -class GetBookSignEvent : BaseEvent { - constructor(result: MarkResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/GetCategoryTypeEvent.kt b/app/src/main/java/com/novel/read/event/GetCategoryTypeEvent.kt deleted file mode 100644 index 88c8e64..0000000 --- a/app/src/main/java/com/novel/read/event/GetCategoryTypeEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.CategoryTypeResp - -/** - * create by zlj on 2019/6/18 - * describe: - */ -class GetCategoryTypeEvent : BaseEvent { - - constructor(result: CategoryTypeResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/GetRecommendBookEvent.kt b/app/src/main/java/com/novel/read/event/GetRecommendBookEvent.kt deleted file mode 100644 index fbdeff5..0000000 --- a/app/src/main/java/com/novel/read/event/GetRecommendBookEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.RecommendBookResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class GetRecommendBookEvent : BaseEvent { - - constructor(result: RecommendBookResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/HideBottomBarEvent.kt b/app/src/main/java/com/novel/read/event/HideBottomBarEvent.kt deleted file mode 100644 index a9f7469..0000000 --- a/app/src/main/java/com/novel/read/event/HideBottomBarEvent.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent - -class HideBottomBarEvent(result: Boolean?) : BaseEvent(result!!) diff --git a/app/src/main/java/com/novel/read/event/HotSearchEvent.kt b/app/src/main/java/com/novel/read/event/HotSearchEvent.kt deleted file mode 100644 index 06b220e..0000000 --- a/app/src/main/java/com/novel/read/event/HotSearchEvent.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.HotSearchResp -import com.novel.read.model.protocol.SearchResp - -/** - * create by zlj on 2019/6/18 - * describe: - */ -class HotSearchEvent : BaseEvent{ - - constructor(result: HotSearchResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/HumanEvent.kt b/app/src/main/java/com/novel/read/event/HumanEvent.kt deleted file mode 100644 index 43025b1..0000000 --- a/app/src/main/java/com/novel/read/event/HumanEvent.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.novel.read.event - - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.RecommendListResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class HumanEvent : BaseEvent { - - constructor(result: RecommendListResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/LoginEvent.kt b/app/src/main/java/com/novel/read/event/LoginEvent.kt deleted file mode 100644 index 000e2bb..0000000 --- a/app/src/main/java/com/novel/read/event/LoginEvent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.UidResp - -class LoginEvent : BaseEvent { - constructor(result: UidResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/RankByUpdateEvent.kt b/app/src/main/java/com/novel/read/event/RankByUpdateEvent.kt deleted file mode 100644 index 4642e32..0000000 --- a/app/src/main/java/com/novel/read/event/RankByUpdateEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.RankByUpdateResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class RankByUpdateEvent : BaseEvent { - - constructor(result: RankByUpdateResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/ReStartEvent.java b/app/src/main/java/com/novel/read/event/ReStartEvent.java deleted file mode 100644 index 39d1224..0000000 --- a/app/src/main/java/com/novel/read/event/ReStartEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.novel.read.event; - -import com.mango.mangolib.event.BaseEvent; - -public class ReStartEvent extends BaseEvent { -} diff --git a/app/src/main/java/com/novel/read/event/RecommendListEvent.kt b/app/src/main/java/com/novel/read/event/RecommendListEvent.kt deleted file mode 100644 index c8fbf76..0000000 --- a/app/src/main/java/com/novel/read/event/RecommendListEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.RecommendListResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class RecommendListEvent : BaseEvent { - - constructor(result: RecommendListResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/RxBus.java b/app/src/main/java/com/novel/read/event/RxBus.java deleted file mode 100644 index 1cd13e3..0000000 --- a/app/src/main/java/com/novel/read/event/RxBus.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.novel.read.event; - -import io.reactivex.Observable; -import io.reactivex.subjects.PublishSubject; - -public class RxBus { - private static volatile RxBus sInstance; - private final PublishSubject mEventBus = PublishSubject.create(); - - public static RxBus getInstance(){ - if (sInstance == null){ - synchronized (RxBus.class){ - if (sInstance == null){ - sInstance = new RxBus(); - } - } - } - return sInstance; - } - - /** - * 发送事件(post event) - * @param event : event object(事件的内容) - */ - public void post(Object event){ - mEventBus.onNext(event); - } - - /** - * - * @param code - * @param event - */ - public void post(int code,Object event){ - Message msg = new Message(code,event); - mEventBus.onNext(msg); - } - - /** - * 返回Event的管理者,进行对事件的接受 - * @return - */ - public Observable toObservable(){ - return mEventBus; - } - - /** - * - * @param cls :保证接受到制定的类型 - * @param - * @return - */ - public Observable toObservable(Class cls){ - //ofType起到过滤的作用,确定接受的类型 - return mEventBus.ofType(cls); - } - - public Observable toObservable(int code,Class cls){ - return mEventBus.ofType(Message.class) - .filter(msg -> msg.code == code && cls.isInstance(msg.event)) - .map( msg -> (T)msg.event); - - } - - class Message{ - int code; - Object event; - - public Message(int code,Object event){ - this.code = code; - this.event = event; - } - } -} diff --git a/app/src/main/java/com/novel/read/event/SearchListEvent.kt b/app/src/main/java/com/novel/read/event/SearchListEvent.kt deleted file mode 100644 index 4376ab2..0000000 --- a/app/src/main/java/com/novel/read/event/SearchListEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.SearchResp - -/** - * create by 赵利君 on 2019/6/18 - * describe: - */ -class SearchListEvent : BaseEvent { - - constructor(result: SearchResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/SwitchFragmentEvent.kt b/app/src/main/java/com/novel/read/event/SwitchFragmentEvent.kt deleted file mode 100644 index 296ab2e..0000000 --- a/app/src/main/java/com/novel/read/event/SwitchFragmentEvent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent - -class SwitchFragmentEvent : BaseEvent { - - constructor(result: Any) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/UpdateBookEvent.kt b/app/src/main/java/com/novel/read/event/UpdateBookEvent.kt deleted file mode 100644 index 8f4a974..0000000 --- a/app/src/main/java/com/novel/read/event/UpdateBookEvent.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent - -class UpdateBookEvent : BaseEvent { - - constructor(result: String) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/event/VersionEvent.kt b/app/src/main/java/com/novel/read/event/VersionEvent.kt deleted file mode 100644 index 6bfd821..0000000 --- a/app/src/main/java/com/novel/read/event/VersionEvent.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.novel.read.event - -import com.mango.mangolib.event.BaseEvent -import com.novel.read.model.protocol.VersionResp - -/** - * create by 赵利君 on 2019/6/25 - * describe: - */ -class VersionEvent : BaseEvent { - constructor(result: VersionResp) : super(result) {} - - constructor() {} -} diff --git a/app/src/main/java/com/novel/read/fragment/BookFragment.kt b/app/src/main/java/com/novel/read/fragment/BookFragment.kt deleted file mode 100644 index 5c78b91..0000000 --- a/app/src/main/java/com/novel/read/fragment/BookFragment.kt +++ /dev/null @@ -1,277 +0,0 @@ -package com.novel.read.fragment - -import android.app.AlertDialog -import android.os.Bundle -import android.util.Log -import android.view.View -import androidx.appcompat.app.AppCompatDelegate -import androidx.recyclerview.widget.GridLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.activity.NovelMainActivity -import com.novel.read.activity.NovelSearchActivity -import com.novel.read.adapter.BookAdapter -import com.novel.read.base.NovelBaseFragment -import com.novel.read.constants.Constant -import com.novel.read.event.HideBottomBarEvent -import com.novel.read.event.SwitchFragmentEvent -import com.novel.read.event.UpdateBookEvent -import com.novel.read.http.AccountManager -import com.novel.read.model.db.BookRecordBean -import com.novel.read.model.db.CollBookBean -import com.novel.read.model.db.dbManage.BookRepository -import com.novel.read.model.protocol.BookDetailResp -import com.novel.read.showToast -import com.novel.read.utlis.LocalManageUtil -import com.novel.read.utlis.RxUtils -import com.novel.read.utlis.SpUtil -import com.squareup.otto.Subscribe -import io.reactivex.Single -import io.reactivex.SingleObserver -import io.reactivex.disposables.Disposable -import kotlinx.android.synthetic.main.fragment_book.* -import org.litepal.LitePal -import java.util.* - -/** - * create by 赵利君 on 2019/10/14 - * describe: - */ -class BookFragment : NovelBaseFragment() { - - private lateinit var mAdapter: BookAdapter - private val mList = ArrayList() - private var isInit = true - - override fun getLayoutId(): Int { - return R.layout.fragment_book - } - - override fun initView() { - EventManager.instance.registerSubscriber(this) - - mList.addAll(BookRepository.getInstance().collBooks) - val gridLayoutManager = GridLayoutManager(activity, 3) - gridLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { - override fun getSpanSize(i: Int): Int { - return if (mList.size == 0) { - 3 - } else { - 1 - } - } - } - - rlv_book.layoutManager = gridLayoutManager - mAdapter = BookAdapter(mList) - rlv_book.adapter = mAdapter - if (isInit) { - isInit = false - update(mList) - } - } - - override fun initData() { - title.inflateMenu(R.menu.title_book) - title_edit.inflateMenu(R.menu.title_edit) - setOnClick() - } - - private fun setOnClick() { - title.setOnMenuItemClickListener { menuItem -> - when (menuItem.itemId) { - R.id.action_search -> { - toActivity(NovelSearchActivity::class.java) - activity!!.overridePendingTransition( - R.anim.message_fade_in, - R.anim.message_fade_out - ) - } - R.id.edit_book -> if (mList.size == 0) { //没书的时候提醒用户不能编辑 - activity!!.showToast(getString(R.string.please_add_book)) - } else { - mAdapter.setEdit(true) - tv_cancel.visibility = View.VISIBLE - tv_delete.visibility = View.VISIBLE - title_edit.visibility = View.VISIBLE - title.visibility = View.GONE - EventManager.instance.postEvent(HideBottomBarEvent(true)) - } - R.id.book_sort -> showBookSortDialog() - R.id.menu2 -> showLanguageDialog() - R.id.menu3 -> { - if (SpUtil.getBooleanValue(Constant.NIGHT)) { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) - SpUtil.setBooleanValue(Constant.NIGHT, false) - } else { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) - SpUtil.setBooleanValue(Constant.NIGHT, true) - } - activity!!.recreate() - } - } - true - } - title_edit.setOnMenuItemClickListener { menuItem -> - if (menuItem.itemId == R.id.action_edit) { - for (i in mList.indices) { - mList[i].isSelect = true - } - mAdapter.notifyDataSetChanged() - } - true - } - tv_cancel.setOnClickListener { - EventManager.instance.postEvent(HideBottomBarEvent(false)) - updateBook(UpdateBookEvent()) - } - - tv_delete.setOnClickListener { - val deleteList = mAdapter.selectList - val iterator = deleteList.iterator() - while (iterator.hasNext()) { - val collBookBean = iterator.next() - if (collBookBean.isSaved) { - collBookBean.delete() - LitePal.deleteAll(BookRecordBean::class.java, "bookId=?", collBookBean.id) - } - } - activity!!.showToast(getString(R.string.delete_success)) - EventManager.instance.postEvent(HideBottomBarEvent(false)) - updateBook(UpdateBookEvent()) - } - - mAdapter.setOnItemClickListener(object : BookAdapter.OnItemClickListener { - override fun onItemClick(view: View, pos: Int) { - EventManager.instance.postEvent(SwitchFragmentEvent()) - } - }) - - - } - - - private fun showLanguageDialog() { - AlertDialog.Builder(activity) - .setTitle(getString(R.string.choose_language)) - .setSingleChoiceItems( - resources.getStringArray(R.array.setting_dialog_language_choice), - SpUtil.getIntValue(Constant.Language, 1) - ) { dialog, which -> - resources.getStringArray(R.array.setting_dialog_language_choice)[which] - SpUtil.setIntValue(Constant.Language, which) - dialog.dismiss() - if (which == 0) { - selectLanguage(0) - } else { - selectLanguage(1) - } - }.create().show() - } - - private fun selectLanguage(select: Int) { - LocalManageUtil.saveSelectLanguage(activity, select) - NovelMainActivity.reStart(activity!!) - } - - private fun showBookSortDialog() { - AlertDialog.Builder(activity) - .setTitle(getString(R.string.choose_language)) - .setSingleChoiceItems( - resources.getStringArray(R.array.setting_dialog_sort_choice), - if (SpUtil.getBooleanValue(Constant.BookSort, false)) 0 else 1 - ) { dialog, which -> - if (which == 0) { - SpUtil.setBooleanValue(Constant.BookSort, true) - } else { - SpUtil.setBooleanValue(Constant.BookSort, false) - } - updateBook(UpdateBookEvent()) - dialog.dismiss() - } - .create().show() - } - - override fun onResume() { - super.onResume() - updateBook(UpdateBookEvent()) - } - - @Subscribe - fun updateBook(event: UpdateBookEvent) { - tv_cancel.visibility = View.GONE - tv_delete.visibility = View.GONE - title.visibility = View.VISIBLE - title_edit.visibility = View.GONE - mList.clear() - mList.addAll(BookRepository.getInstance().collBooks) - mAdapter.setEdit(false) - } - - private fun update(collBookBeans: List?) { //检测书籍更新 - if (collBookBeans == null || collBookBeans.isEmpty()) return - val collBooks = ArrayList(collBookBeans) - val observables = ArrayList>(collBooks.size) - val it = collBooks.iterator() - while (it.hasNext()) { - val collBook = it.next() - //删除本地文件 - if (collBook.isLocal) { - it.remove() - } else { - observables.add(AccountManager.getInstance().getBookDetails(collBook.id)) - } - } - //zip可能不是一个好方法。 - Single.zip>(observables) { objects -> - val newCollBooks = ArrayList(objects.size) - for (i in collBooks.indices) { - val oldCollBook = collBooks[i] - val newCollBook = (objects[i] as BookDetailResp).collBookBean - //如果是oldBook是update状态,或者newCollBook与oldBook章节数不同 - if (oldCollBook.isUpdate || oldCollBook.lastChapter != newCollBook.lastChapter) { - newCollBook.setIsUpdate(true) - } else { - newCollBook.setIsUpdate(false) - } - newCollBook.lastRead = oldCollBook.lastRead - newCollBooks.add(newCollBook) - //存储到数据库中 - BookRepository.getInstance().saveCollBooks(newCollBooks) - } - newCollBooks - }.compose> { - RxUtils.toSimpleSingle( - it - ) - }.subscribe(object : SingleObserver> { - override fun onSubscribe(d: Disposable) { - } - - override fun onSuccess(value: List) { - //跟原先比较 - mList.clear() - mList.addAll(BookRepository.getInstance().collBooks) - mAdapter.notifyDataSetChanged() - } - - override fun onError(e: Throwable) {} - } - ) - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } - - companion object { - - fun newInstance(): BookFragment { - val args = Bundle() - val fragment = BookFragment() - fragment.arguments = args - return fragment - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/fragment/BookListFragment.kt b/app/src/main/java/com/novel/read/fragment/BookListFragment.kt deleted file mode 100644 index a3ab24e..0000000 --- a/app/src/main/java/com/novel/read/fragment/BookListFragment.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.novel.read.fragment - -import android.os.Bundle -import androidx.recyclerview.widget.LinearLayoutManager -import com.novel.read.R -import com.novel.read.adapter.RankListAdapter -import com.novel.read.base.NovelBaseFragment -import com.novel.read.constants.Constant -import com.novel.read.constants.Constant.COMMENT_SIZE -import com.novel.read.http.AccountManager -import com.novel.read.inter.OnLoadMoreListener -import com.novel.read.model.protocol.RankByUpdateResp -import kotlinx.android.synthetic.main.fragment_book_list.* -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import java.util.* - - -class BookListFragment : NovelBaseFragment() { - - private lateinit var mAdapter: RankListAdapter - private var mList: MutableList = ArrayList() - private var sex: String = "" - private var dateType: String = "" - private var type: String = "" - private var page = 1 - private var loadSize: Int = 0 - - override fun getLayoutId(): Int { - return R.layout.fragment_book_list - } - - override fun initView() { - rlv_book_list.layoutManager = LinearLayoutManager(activity) - mAdapter = RankListAdapter(mList, rlv_book_list) - rlv_book_list.adapter = mAdapter - - arguments?.let { - sex = it.getString(Constant.Sex) - dateType = it.getString(Constant.DateType) - type = it.getString(Constant.Type) - } - - } - - override fun initData() { - getData() - - mAdapter.setOnLoadMoreListener(object : OnLoadMoreListener { - override fun onLoadMore() { - if (mAdapter.isLoadingMore) { - - } else { - if (loadSize >= COMMENT_SIZE) { - mAdapter.isLoadingMore = true - mAdapter.notifyDataSetChanged() - page++ - getData() - } - } - } - }) - - } - - private fun getData() { - AccountManager.getInstance().getRankList(type, sex, dateType, page.toString(), RankCallBack()) - } - - private inner class RankCallBack : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful) { - if (response.body() != null) { - loadSize = response.body()!!.book.size - if (mAdapter.isLoadingMore) { - mAdapter.isLoadingMore = false - mList.addAll(response.body()!!.book) - mAdapter.notifyDataSetChanged() - } else { - mList.clear() - mList.addAll(response.body()!!.book) - mAdapter.notifyDataSetChanged() - } - } - } - } - - override fun onFailure(call: Call, t: Throwable) { - - } - } - - companion object { - - fun newInstance(type: String, dateType: String, sex: String): BookListFragment { - val args = Bundle() - args.putString(Constant.Sex, sex) - args.putString(Constant.DateType, dateType) - args.putString(Constant.Type, type) - val fragment = BookListFragment() - fragment.arguments = args - return fragment - } - } -} diff --git a/app/src/main/java/com/novel/read/fragment/ManFragment.kt b/app/src/main/java/com/novel/read/fragment/ManFragment.kt deleted file mode 100644 index 5b9ede5..0000000 --- a/app/src/main/java/com/novel/read/fragment/ManFragment.kt +++ /dev/null @@ -1,144 +0,0 @@ -package com.novel.read.fragment - -import android.os.Bundle -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.adapter.EditRecommendAdapter -import com.novel.read.adapter.HumanAdapter -import com.novel.read.adapter.RankAdapter -import com.novel.read.base.NovelBaseFragment -import com.novel.read.constants.Constant -import com.novel.read.dp2px -import com.novel.read.http.AccountManager -import com.novel.read.model.protocol.RecommendListResp -import com.novel.read.utlis.EvenItemDecoration -import kotlinx.android.synthetic.main.fragment_man.* -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import java.util.* - - -class ManFragment : NovelBaseFragment() { - - private lateinit var mHumanAdapter: HumanAdapter - private val mHumanList = ArrayList() - private lateinit var mEditAdapter: EditRecommendAdapter - private val mEditList = ArrayList() - private lateinit var mRankAdapter: RankAdapter - private val mRankList = ArrayList() - - override fun getLayoutId(): Int { - return R.layout.fragment_man - } - - override fun initView() { - EventManager.instance.registerSubscriber(this) - - mHumanAdapter = HumanAdapter(mHumanList) - rlv_pop.apply { - layoutManager = GridLayoutManager(activity, 3) - adapter = mHumanAdapter - addItemDecoration(EvenItemDecoration(activity!!.dp2px(10), 3)) - } - - val linearLayoutManager = LinearLayoutManager(activity) - linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL - rlv_recommend.layoutManager = linearLayoutManager - mEditAdapter = EditRecommendAdapter(mEditList) - rlv_recommend.adapter = mEditAdapter - - mRankAdapter = RankAdapter(mRankList) - rlv_update.apply { - layoutManager = GridLayoutManager(activity, 3) - adapter = mRankAdapter - addItemDecoration(EvenItemDecoration(activity!!.dp2px(10), 3)) - } - } - - override fun initData() { - swipe.showLoading() - getData() - swipe.setOnReloadingListener { getData() } - } - - private fun getData() { - AccountManager.getInstance().getRecommendList(Constant.ListType.Human, HumanCallBack()) - AccountManager.getInstance() - .getRecommendList(Constant.ListType.EditRecommend, EditCallBack()) - AccountManager.getInstance() - .getRecommendList(Constant.ListType.HotSearch, HotSearchCallBack()) - } - - private inner class HumanCallBack : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - mHumanList.clear() - mHumanList.addAll(response.body()!!.list) - mHumanAdapter.notifyDataSetChanged() - } else { - swipe.showError() - } - } - - override fun onFailure(call: Call, t: Throwable) { - swipe.showError() - } - } - - private inner class EditCallBack : Callback { - - override fun onResponse(call: Call, response: Response) { - if (response.isSuccessful && response.body() != null) { - mEditList.clear() - mEditList.addAll(response.body()!!.list) - mEditAdapter.notifyDataSetChanged() - - } else { - swipe.showError() - } - } - - override fun onFailure(call: Call, t: Throwable) { - - } - } - - private inner class HotSearchCallBack : Callback { - - override fun onResponse(call: Call, response: Response) { - swipe.showFinish() - if (response.isSuccessful && response.body() != null) { - mRankList.clear() - mRankList.addAll(response.body()!!.list) - mRankAdapter.notifyDataSetChanged() - } else { - swipe.showError() - } - } - - override fun onFailure(call: Call, t: Throwable) { - - } - } - - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } - - companion object { - - fun newInstance(sex: String): ManFragment { - val args = Bundle() - args.putString(Constant.Sex, sex) - val fragment = ManFragment() - fragment.arguments = args - return fragment - } - } -} diff --git a/app/src/main/java/com/novel/read/fragment/MoreFragment.kt b/app/src/main/java/com/novel/read/fragment/MoreFragment.kt deleted file mode 100644 index 1b55bb8..0000000 --- a/app/src/main/java/com/novel/read/fragment/MoreFragment.kt +++ /dev/null @@ -1,110 +0,0 @@ -package com.novel.read.fragment - -import android.content.ActivityNotFoundException -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Bundle -import android.view.View -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.activity.NovelSearchActivity -import com.novel.read.activity.NovelSettingActivity -import com.novel.read.base.NovelBaseFragment -import com.novel.read.constants.Constant -import com.novel.read.event.ReStartEvent -import com.novel.read.showToast -import com.novel.read.utlis.VersionUtil -import com.novel.read.widget.dialog.AppraiseDialog -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.fragment_more.* - -/** - * create by 赵利君 on 2019/6/10 - * describe: - */ -class MoreFragment : NovelBaseFragment() { - - override fun getLayoutId(): Int { - return R.layout.fragment_more - } - - override fun initView() { - EventManager.instance.registerSubscriber(this) - toolbar.inflateMenu(R.menu.title_more) - } - - override fun initData() { - toolbar.setOnMenuItemClickListener { menuItem -> - if (menuItem.itemId == R.id.action_search) { - toActivity(NovelSearchActivity::class.java) - activity!!.overridePendingTransition( - R.anim.message_fade_in, - R.anim.message_fade_out - ) - } - true - } - - //意见反馈 - tv_options.setOnClickListener { - feedback() - } - - //评价 - tv_appraise.setOnClickListener { - val dialog = AppraiseDialog(activity!!) - dialog.appraiseDialog(View.OnClickListener { - val uri = Uri.parse("https://github.com/390057892/reader") - val intent = Intent(Intent.ACTION_VIEW, uri) - startActivity(intent) - dialog.dismiss() - }) - dialog.show() - } - - //设置 - tv_setting.setOnClickListener { - toActivity(NovelSettingActivity::class.java) - } - } - - private fun feedback() { - val email = Intent(Intent.ACTION_SEND) - //邮件发送类型:无附件,纯文本 - email.type = "plain/text" - //邮件接收者(数组,可以是多位接收者) - val emailReceiver = arrayOf(Constant.FeedBackEmail) - val emailTitle = getString(R.string.opinions) - val emailContent = "" - //设置邮件地址 - email.putExtra(Intent.EXTRA_EMAIL, emailReceiver) - //设置邮件标题 - email.putExtra(Intent.EXTRA_SUBJECT, emailTitle) - //设置发送的内容 - email.putExtra(Intent.EXTRA_TEXT, emailContent) - //调用系统的邮件系统 - startActivity(Intent.createChooser(email, "请选择邮件发送软件")) - - } - - - @Subscribe - fun restart(event: ReStartEvent) { - activity!!.recreate() - } - - companion object { - fun newInstance(): MoreFragment { - val args = Bundle() - val fragment = MoreFragment() - fragment.arguments = args - return fragment - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } -} diff --git a/app/src/main/java/com/novel/read/fragment/RecommendFragment.kt b/app/src/main/java/com/novel/read/fragment/RecommendFragment.kt deleted file mode 100644 index 337a8a5..0000000 --- a/app/src/main/java/com/novel/read/fragment/RecommendFragment.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.novel.read.fragment - -import android.os.Bundle -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.activity.NovelSearchActivity -import com.novel.read.base.NovelBaseFragment -import kotlinx.android.synthetic.main.title_recommend.* - -/** - * create by zlj on 2019/6/10 - * describe: - */ -class RecommendFragment : NovelBaseFragment() { - - override fun getLayoutId(): Int { - return R.layout.fragment_recommend - } - - override fun initView() { - EventManager.instance.registerSubscriber(this) - // List fragmentList = new ArrayList<>(); - // ManFragment manFragment = ManFragment.newInstance(Constant.GenderType.Man); - // WomanFragment womanFragment = WomanFragment.newInstance(Constant.GenderType.Woman); - // fragmentList.add(manFragment); - // fragmentList.add(womanFragment); - } - - override fun initData() { - tv_search.setOnClickListener { - toActivity(NovelSearchActivity::class.java) - activity!!.overridePendingTransition( - R.anim.message_fade_in, - R.anim.message_fade_out - ) - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } - - companion object { - fun newInstance(): RecommendFragment { - val args = Bundle() - val fragment = RecommendFragment() - fragment.arguments = args - return fragment - } - } -} diff --git a/app/src/main/java/com/novel/read/fragment/StackFragment.kt b/app/src/main/java/com/novel/read/fragment/StackFragment.kt deleted file mode 100644 index 37fb7c1..0000000 --- a/app/src/main/java/com/novel/read/fragment/StackFragment.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.novel.read.fragment - -import android.os.Bundle -import androidx.recyclerview.widget.GridLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.activity.NovelSearchActivity -import com.novel.read.adapter.StackAdapter -import com.novel.read.base.NovelBaseFragment -import com.novel.read.event.GetCategoryTypeEvent -import com.novel.read.http.AccountManager -import com.novel.read.model.protocol.CategoryTypeResp -import com.squareup.otto.Subscribe -import kotlinx.android.synthetic.main.fragment_stack.* -import kotlinx.android.synthetic.main.title_stack.* -import java.util.* - -/** - * create by zlj on 2019/6/10 - * describe: - */ -class StackFragment : NovelBaseFragment() { - - private lateinit var mAdapter: StackAdapter - private var mList: MutableList = ArrayList() - - override fun getLayoutId(): Int { - return R.layout.fragment_stack - } - - override fun initView() { - EventManager.instance.registerSubscriber(this) - rlv_book_type.layoutManager = GridLayoutManager(activity, 2) - mAdapter = StackAdapter(mList) - rlv_book_type.adapter = mAdapter - } - - override fun initData() { - refresh.showLoading() - getData() - refresh.setOnReloadingListener { getData() } - - tv_search.setOnClickListener { - toActivity(NovelSearchActivity::class.java) - activity!!.overridePendingTransition(R.anim.message_fade_in, R.anim.message_fade_out) - } - } - - private fun getData() { - AccountManager.getInstance().getCategoryType() - } - - @Subscribe - fun getCategoryType(event: GetCategoryTypeEvent) { - refresh.showFinish() - if (event.isFail) { - refresh.showError() - } else { - mList.clear() - mList.addAll(event.result!!.category) - mAdapter.notifyDataSetChanged() - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } - - companion object { - fun newInstance(): StackFragment { - val args = Bundle() - val fragment = StackFragment() - fragment.arguments = args - return fragment - } - } -} diff --git a/app/src/main/java/com/novel/read/fragment/WomanFragment.kt b/app/src/main/java/com/novel/read/fragment/WomanFragment.kt deleted file mode 100644 index 89d3278..0000000 --- a/app/src/main/java/com/novel/read/fragment/WomanFragment.kt +++ /dev/null @@ -1,171 +0,0 @@ -package com.novel.read.fragment - -import android.os.Bundle -import android.view.View -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager -import com.mango.mangolib.event.EventManager -import com.novel.read.R -import com.novel.read.activity.NovelRankListActivity -import com.novel.read.activity.NovelRecommendBookListActivity -import com.novel.read.adapter.EditRecommendAdapter -import com.novel.read.adapter.HumanAdapter -import com.novel.read.adapter.RankAdapter -import com.novel.read.base.NovelBaseFragment -import com.novel.read.constants.Constant -import com.novel.read.http.AccountManager -import com.novel.read.model.protocol.RecommendListResp -import kotlinx.android.synthetic.main.fragment_man.* -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import java.util.* - - -class WomanFragment : NovelBaseFragment(), View.OnClickListener { - - private lateinit var mHumanAdapter: HumanAdapter - private val mHumanList = ArrayList() - private lateinit var mEditAdapter: EditRecommendAdapter - private val mEditList = ArrayList() - private lateinit var mRankAdapter: RankAdapter - private val mRankList = ArrayList() - - override fun getLayoutId(): Int { - return R.layout.fragment_man - } - - override fun initView() { - EventManager.instance.registerSubscriber(this) - - rlv_pop.layoutManager = GridLayoutManager(activity, 3) - mHumanAdapter = HumanAdapter(mHumanList) - rlv_pop.adapter = mHumanAdapter - - val linearLayoutManager = LinearLayoutManager(activity) - linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL - rlv_recommend.layoutManager = linearLayoutManager - mEditAdapter = EditRecommendAdapter(mEditList) - rlv_recommend.adapter = mEditAdapter - - rlv_update.layoutManager = GridLayoutManager(activity, 3) - mRankAdapter = RankAdapter(mRankList) - rlv_update.adapter = mRankAdapter - - } - - override fun initData() { - arguments?.let { - val sex = it.getString(Constant.Sex) - swipe.showLoading() - getData(sex) - swipe.setOnReloadingListener { getData(sex) } - } - - } - - private fun getData(sex: String?) { - AccountManager.getInstance().getRecommendList(Constant.ListType.Human, HumanCallBack()) - AccountManager.getInstance() - .getRecommendList(Constant.ListType.EditRecommend, EditCallBack()) - AccountManager.getInstance() - .getRecommendList(Constant.ListType.HotSearch, HotSearchCallBack()) - } - - override fun onClick(v: View) { - val bundle = Bundle() - bundle.putString(Constant.Sex, Constant.GenderType.Woman) - when (view?.id) { - R.id.head_pop -> { - bundle.putString(Constant.Type, Constant.ListType.Human) - toActivity(NovelRecommendBookListActivity::class.java, bundle) - } - R.id.head_recommend -> { - bundle.putString(Constant.Type, Constant.ListType.EditRecommend) - toActivity(NovelRankListActivity::class.java, bundle) - } - R.id.head_update -> { - bundle.putString(Constant.Type, Constant.ListType.HotSearch) - toActivity(NovelRankListActivity::class.java, bundle) - } - } - } - - private inner class HumanCallBack : Callback { - - override fun onResponse( - call: Call, - response: Response - ) { - if (response.isSuccessful && response.body() != null) { - mHumanList.clear() - mHumanList.addAll(response.body()!!.list) - mHumanAdapter.notifyDataSetChanged() - - } else { - swipe.showError() - } - } - - override fun onFailure(call: Call, t: Throwable) { - - } - } - - private inner class EditCallBack : Callback { - - override fun onResponse( - call: Call, - response: Response - ) { - if (response.isSuccessful && response.body() != null) { - mEditList.clear() - mEditList.addAll(response.body()!!.list) - mEditAdapter.notifyDataSetChanged() - - } else { - swipe.showError() - } - } - - override fun onFailure(call: Call, t: Throwable) { - - } - } - - private inner class HotSearchCallBack : Callback { - - override fun onResponse( - call: Call, - response: Response - ) { - swipe.showFinish() - if (response.isSuccessful && response.body() != null) { - mRankList.clear() - mRankList.addAll(response.body()!!.list) - mRankAdapter.notifyDataSetChanged() - } else { - swipe.showError() - } - } - - override fun onFailure(call: Call, t: Throwable) { - - } - } - - override fun onDestroy() { - super.onDestroy() - EventManager.instance.unregisterSubscriber(this) - } - - companion object { - fun newInstance(sex: String): WomanFragment { - val args = Bundle() - args.putString(Constant.Sex, sex) - val fragment = WomanFragment() - fragment.arguments = args - return fragment - } - } -} diff --git a/app/src/main/java/com/novel/read/help/ActivityHelp.kt b/app/src/main/java/com/novel/read/help/ActivityHelp.kt new file mode 100644 index 0000000..b9a265f --- /dev/null +++ b/app/src/main/java/com/novel/read/help/ActivityHelp.kt @@ -0,0 +1,119 @@ +package com.novel.read.help + +import android.app.Activity +import android.app.Application +import android.os.Bundle +import com.novel.read.utils.LanguageUtils +import java.lang.ref.WeakReference +import java.util.* + +/** + * Activity管理器,管理项目中Activity的状态 + */ +@Suppress("unused") +object ActivityHelp : Application.ActivityLifecycleCallbacks { + + private val activities: MutableList> = arrayListOf() + + fun size(): Int { + return activities.size + } + + /** + * 判断指定Activity是否存在 + */ + fun isExist(activityClass: Class<*>): Boolean { + activities.forEach { item -> + if (item.get()?.javaClass == activityClass) { + return true + } + } + return false + } + + /** + * 添加Activity + */ + fun add(activity: Activity) { + activities.add(WeakReference(activity)) + } + + /** + * 移除Activity + */ + fun remove(activity: Activity) { + for (temp in activities) { + if (null != temp.get() && temp.get() === activity) { + activities.remove(temp) + break + } + } + } + + /** + * 移除Activity + */ + fun remove(activityClass: Class<*>) { + val iterator = activities.iterator() + while (iterator.hasNext()) { + val item = iterator.next() + if (item.get()?.javaClass == activityClass) { + iterator.remove() + } + } + } + + /** + * 关闭指定 activity + */ + fun finishActivity(vararg activities: Activity) { + activities.forEach { activity -> + activity.finish() + } + } + + /** + * 关闭指定 activity(class) + */ + fun finishActivity(vararg activityClasses: Class<*>) { + val waitFinish = ArrayList>() + for (temp in activities) { + for (activityClass in activityClasses) { + if (temp.get()?.javaClass == activityClass) { + waitFinish.add(temp) + break + } + } + } + waitFinish.forEach { + it.get()?.finish() + } + } + + override fun onActivityPaused(activity: Activity) { + } + + override fun onActivityResumed(activity: Activity) { + } + + override fun onActivityStarted(activity: Activity) { + + } + + override fun onActivityDestroyed(activity: Activity) { + remove(activity) + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { + } + + override fun onActivityStopped(activity: Activity) { + } + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + add(activity) + if (!LanguageUtils.isSameWithSetting(activity)){ + LanguageUtils.setConfiguration(activity) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/AppConfig.kt b/app/src/main/java/com/novel/read/help/AppConfig.kt new file mode 100644 index 0000000..24dc0b1 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/AppConfig.kt @@ -0,0 +1,115 @@ +package com.novel.read.help + +import android.annotation.SuppressLint +import android.content.Context +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.PreferKey +import com.novel.read.utils.ext.* + +object AppConfig { + + var isEInkMode: Boolean = false + + fun isNightTheme(context: Context): Boolean { + return when (context.getPrefString(PreferKey.themeMode, "0")) { + "1" -> false + "2" -> true + "3" -> false + else -> context.sysIsDarkMode() + } + } + + var isNightTheme: Boolean + get() = isNightTheme(App.INSTANCE) + set(value) { + if (isNightTheme != value) { + if (value) { + App.INSTANCE.putPrefString(PreferKey.themeMode, "2") + } else { + App.INSTANCE.putPrefString(PreferKey.themeMode, "1") + } + } + } + + fun upEInkMode() { + isEInkMode = App.INSTANCE.getPrefString(PreferKey.themeMode) == "3" + } + + var isTransparentStatusBar: Boolean + get() = App.INSTANCE.getPrefBoolean(PreferKey.transparentStatusBar,true) + set(value) { + App.INSTANCE.putPrefBoolean(PreferKey.transparentStatusBar, value) + } + + val requestedDirection: String? + get() = App.INSTANCE.getPrefString(R.string.pk_requested_direction) + + var backupPath: String? + get() = App.INSTANCE.getPrefString(PreferKey.backupPath) + set(value) { + if (value.isNullOrEmpty()) { + App.INSTANCE.removePref(PreferKey.backupPath) + } else { + App.INSTANCE.putPrefString(PreferKey.backupPath, value) + } + } + + val autoRefreshBook: Boolean + get() = App.INSTANCE.getPrefBoolean(R.string.pk_auto_refresh) + + var threadCount: Int + get() = App.INSTANCE.getPrefInt(PreferKey.threadCount, 16) + set(value) { + App.INSTANCE.putPrefInt(PreferKey.threadCount, value) + } + + var importBookPath: String? + get() = App.INSTANCE.getPrefString("importBookPath") + set(value) { + if (value == null) { + App.INSTANCE.removePref("importBookPath") + } else { + App.INSTANCE.putPrefString("importBookPath", value) + } + } + + var ttsSpeechRate: Int + get() = App.INSTANCE.getPrefInt(PreferKey.ttsSpeechRate, 5) + set(value) { + App.INSTANCE.putPrefInt(PreferKey.ttsSpeechRate, value) + } + + val clickAllNext: Boolean get() = App.INSTANCE.getPrefBoolean(PreferKey.clickAllNext, false) + + var chineseConverterType: Int + get() = App.INSTANCE.getPrefInt(PreferKey.chineseConverterType,2) + set(value) { + App.INSTANCE.putPrefInt(PreferKey.chineseConverterType, value) + } + + var systemTypefaces: Int + get() = App.INSTANCE.getPrefInt(PreferKey.systemTypefaces) + set(value) { + App.INSTANCE.putPrefInt(PreferKey.systemTypefaces, value) + } + + var elevation: Int + @SuppressLint("PrivateResource") + get() = App.INSTANCE.getPrefInt( + PreferKey.barElevation, +// App.INSTANCE.resources.getDimension(R.dimen.design_appbar_elevation).toInt() + 0.toInt() + ) + set(value) { + App.INSTANCE.putPrefInt(PreferKey.barElevation, value) + } + + var replaceEnableDefault: Boolean = + App.INSTANCE.getPrefBoolean(PreferKey.replaceEnableDefault, true) + + + val readBodyToLh: Boolean get() = App.INSTANCE.getPrefBoolean(PreferKey.readBodyToLh, true) + +} + diff --git a/app/src/main/java/com/novel/read/help/BookHelp.kt b/app/src/main/java/com/novel/read/help/BookHelp.kt new file mode 100644 index 0000000..a1e693b --- /dev/null +++ b/app/src/main/java/com/novel/read/help/BookHelp.kt @@ -0,0 +1,397 @@ +package com.novel.read.help + +import android.util.Log +import com.hankcs.hanlp.HanLP +import com.novel.read.App +import com.novel.read.constant.AppPattern +import com.novel.read.constant.EventBus +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.utils.FileUtils +import com.novel.read.utils.MD5Utils +import com.novel.read.utils.StringUtils +import com.novel.read.utils.ext.* +import com.novel.read.help.coroutine.Coroutine +import com.novel.read.network.repository.ImageRepository +import com.novel.read.utils.NetworkUtils +import kotlinx.coroutines.Dispatchers.Main +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext +import net.ricecode.similarity.JaroWinklerStrategy +import net.ricecode.similarity.StringSimilarityServiceImpl +import org.jetbrains.anko.toast +import java.io.File +import java.util.concurrent.CopyOnWriteArraySet +import java.util.regex.Matcher +import java.util.regex.Pattern +import kotlin.math.abs +import kotlin.math.max +import kotlin.math.min + +object BookHelp { + private const val cacheFolderName = "book_cache" + private const val cacheImageFolderName = "images" + private val downloadDir: File = App.INSTANCE.externalFilesDir + private val downloadImages = CopyOnWriteArraySet() + private val imageRepository by lazy { ImageRepository() } + fun formatChapterName(bookChapter: BookChapter): String { + return String.format( + "%05d-%s.nb", + bookChapter.chapterId, + MD5Utils.md5Encode16(bookChapter.chapterName) + ) + } + + fun clearCache() { + FileUtils.deleteFile( + FileUtils.getPath(downloadDir, cacheFolderName) + ) + } + + fun clearCache(book: Book) { + val filePath = FileUtils.getPath(downloadDir, cacheFolderName, book.getFolderName()) + FileUtils.deleteFile(filePath) + } + + /** + * 清楚已删除书的缓存 + */ + fun clearRemovedCache() { + Coroutine.async { + val bookFolderNames = arrayListOf() + App.db.getBookDao().getAllBooks().forEach { + bookFolderNames.add(it.getFolderName()) + } + val file = FileUtils.getFile(downloadDir, cacheFolderName) + file.listFiles()?.forEach { bookFile -> + if (!bookFolderNames.contains(bookFile.name)) { + FileUtils.deleteFile(bookFile.absolutePath) + } + } + } + } + + suspend fun saveContent(book: Book, bookChapter: BookChapter, content: String) { + if (content.isEmpty()) return + //保存文本 + FileUtils.createFileIfNotExist( + downloadDir, + cacheFolderName, + book.getFolderName(), + formatChapterName(bookChapter) + ).writeText(content) + //保存图片 + content.split("\n").forEach { + val matcher = AppPattern.imgPattern.matcher(it) + if (matcher.find()) { + var src = matcher.group(1) + src = NetworkUtils.getAbsoluteURL(bookChapter.chapterUrl, src) + src?.let { + saveImage(book, src) + } + } + } + postEvent(EventBus.SAVE_CONTENT, bookChapter) + } + + suspend fun saveImage(book: Book, src: String) { + while (downloadImages.contains(src)) { + delay(100) + } + if (getImage(book, src).exists()) { + return + } + Log.e("saveImage", "saveImage: $src", ) + downloadImages.add(src) + try { + imageRepository.getImage(src).let { + val c=it + Log.e("saveImage", "bytes: $c", ) + FileUtils.createFileIfNotExist( + downloadDir, + cacheFolderName, + book.getFolderName(), + cacheImageFolderName, + "${MD5Utils.md5Encode16(src)}${getImageSuffix(src)}" + ).writeBytes(c.bytes()) + } + } catch (e: Exception) { + e.printStackTrace() + } finally { + downloadImages.remove(src) + } + } + + fun getImage(book: Book, src: String): File { + return FileUtils.getFile( + downloadDir, + cacheFolderName, + book.getFolderName(), + cacheImageFolderName, + "${MD5Utils.md5Encode16(src)}${getImageSuffix(src)}" + ) + } + + private fun getImageSuffix(src: String): String { + var suffix = src.substringAfterLast(".").substringBefore(",") + if (suffix.length > 5) { + suffix = ".jpg" + } + return suffix + } + + fun getChapterFiles(book: Book): List { + val fileNameList = arrayListOf() + if (book.isLocalBook()) { + return fileNameList + } + FileUtils.createFolderIfNotExist( + downloadDir, + subDirs = arrayOf(cacheFolderName, book.getFolderName()) + ).list()?.let { + fileNameList.addAll(it) + } + return fileNameList + } + + // 检测该章节是否下载 + fun hasContent(book: Book, bookChapter: BookChapter): Boolean { + return if (book.isLocalBook()) { + true + } else { + FileUtils.exists( + downloadDir, + cacheFolderName, + book.getFolderName(), + formatChapterName(bookChapter) + ) + } + } + + fun getContent(book: Book, bookChapter: BookChapter): String? { + if (book.isLocalBook()) { +// return LocalBook.getContext(book, bookChapter) + //todo epub + return null + } else { + val file = FileUtils.getFile( + downloadDir, + cacheFolderName, + book.getFolderName(), + formatChapterName(bookChapter) + ) + if (file.exists()) { + return file.readText() + } + } + return null + } + + fun delContent(book: Book, bookChapter: BookChapter) { + if (book.isLocalBook()) { + return + } else { + FileUtils.createFileIfNotExist( + downloadDir, + cacheFolderName, + book.getFolderName(), + formatChapterName(bookChapter) + ).delete() + } + } + + fun formatBookName(name: String): String { + return name + .replace(AppPattern.nameRegex, "") + .trim { it <= ' ' } + } + + fun formatBookAuthor(author: String): String { + return author + .replace(AppPattern.authorRegex, "") + .trim { it <= ' ' } + } + + /** + * 根据目录名获取当前章节 + */ + fun getDurChapter( + oldDurChapterIndex: Int, + oldChapterListSize: Int, + oldDurChapterName: String?, + newChapterList: List + ): Int { + if (oldChapterListSize == 0) return 0 + val oldChapterNum = getChapterNum(oldDurChapterName) + val oldName = getPureChapterName(oldDurChapterName) + val newChapterSize = newChapterList.size + val min = max( + 0, + min( + oldDurChapterIndex, + oldDurChapterIndex - oldChapterListSize + newChapterSize + ) - 10 + ) + val max = min( + newChapterSize - 1, + max( + oldDurChapterIndex, + oldDurChapterIndex - oldChapterListSize + newChapterSize + ) + 10 + ) + var nameSim = 0.0 + var newIndex = 0 + var newNum = 0 + if (oldName.isNotEmpty()) { + val service = StringSimilarityServiceImpl(JaroWinklerStrategy()) + for (i in min..max) { + val newName = getPureChapterName(newChapterList[i].chapterName) + val temp = service.score(oldName, newName) + if (temp > nameSim) { + nameSim = temp + newIndex = i + } + } + } + if (nameSim < 0.96 && oldChapterNum > 0) { + for (i in min..max) { + val temp = getChapterNum(newChapterList[i].chapterName) + if (temp == oldChapterNum) { + newNum = temp + newIndex = i + break + } else if (abs(temp - oldChapterNum) < abs(newNum - oldChapterNum)) { + newNum = temp + newIndex = i + } + } + } + return if (nameSim > 0.96 || abs(newNum - oldChapterNum) < 1) { + newIndex + } else { + min(max(0, newChapterList.size - 1), oldDurChapterIndex) + } + } + + private val chapterNamePattern by lazy { + Pattern.compile("^(.*?第([\\d零〇一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟0-9\\s]+)[章节篇回集])[、,。 ::.\\s]*") + } + + private fun getChapterNum(chapterName: String?): Int { + if (chapterName != null) { + val matcher: Matcher = chapterNamePattern.matcher(chapterName) + if (matcher.find()) { + return StringUtils.stringToInt(matcher.group(2)) + } + } + return -1 + } + + @Suppress("SpellCheckingInspection") + private val regexOther by lazy { + // 所有非字母数字中日韩文字 CJK区+扩展A-F区 + return@lazy "[^\\w\\u4E00-\\u9FEF〇\\u3400-\\u4DBF\\u20000-\\u2A6DF\\u2A700-\\u2EBEF]".toRegex() + } + + private val regexA by lazy { + return@lazy "\\s".toRegex() + } + + private val regexB by lazy { + return@lazy "^第.*?章|[(\\[][^()\\[\\]]{2,}[)\\]]$".toRegex() + } + + private fun getPureChapterName(chapterName: String?): String { + return if (chapterName == null) "" else StringUtils.fullToHalf(chapterName) + .replace(regexA, "") + .replace(regexB, "") + .replace(regexOther, "") + } + + private var bookName: String? = null + private var bookOrigin: String? = null +// private var replaceRules: List = arrayListOf() + +// @Synchronized +// fun upReplaceRules() { +// val o = bookOrigin +// bookName?.let { +// replaceRules = if (o.isNullOrEmpty()) { +// App.db.replaceRuleDao().findEnabledByScope(it) +// } else { +// App.db.replaceRuleDao().findEnabledByScope(it, o) +// } +// } +// } + + suspend fun disposeContent( + book: Book, + title: String, + content: String + ): List { + var title1 = title + var content1 = content +// if (book.getReSegment()) { +// content1 = ContentHelp.reSegment(content1, title1) +// } +// if (book.getUseReplaceRule()) { +// synchronized(this) { +// if (bookName != book.name || bookOrigin != book.origin) { +// bookName = book.name +// bookOrigin = book.origin +// replaceRules = if (bookOrigin.isNullOrEmpty()) { +// App.db.replaceRuleDao().findEnabledByScope(bookName!!) +// } else { +// App.db.replaceRuleDao().findEnabledByScope(bookName!!, bookOrigin!!) +// } +// } +// } +// replaceRules.forEach { item -> +// item.pattern.let { +// if (it.isNotEmpty()) { +// try { +// content1 = if (item.isRegex) { +// content1.replace(it.toRegex(), item.replacement) +// } else { +// content1.replace(it, item.replacement) +// } +// } catch (e: Exception) { +// withContext(Main) { +// App.INSTANCE.toast("${item.name}替换出错") +// } +// } +// } +// } +// } +// } + try { + when (AppConfig.chineseConverterType) { + 1 -> { + title1 = HanLP.convertToSimplifiedChinese(title1) + content1 = HanLP.convertToSimplifiedChinese(content1) + } + 2 -> { + title1 = HanLP.convertToTraditionalChinese(title1) + content1 = HanLP.convertToTraditionalChinese(content1) + } + } + } catch (e: Exception) { + withContext(Main) { + App.INSTANCE.toast("简繁转换出错") + } + } + val contents = arrayListOf() + content1.split("\n").forEach { + val str = it.replace("^[\\n\\s\\r]+".toRegex(), "") + if (contents.isEmpty()) { + contents.add(title1) + if (str != title1 && str.isNotEmpty()) { + contents.add("${ReadBookConfig.paragraphIndent}$str") + } + } else if (str.isNotEmpty()) { + contents.add("${ReadBookConfig.paragraphIndent}$str") + } + } + return contents + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/DefaultData.kt b/app/src/main/java/com/novel/read/help/DefaultData.kt new file mode 100644 index 0000000..9f9ad9d --- /dev/null +++ b/app/src/main/java/com/novel/read/help/DefaultData.kt @@ -0,0 +1,37 @@ +package com.novel.read.help + +import com.novel.read.App +import com.novel.read.data.db.entity.HttpTTS +import com.novel.read.utils.ext.* +import java.io.File + +object DefaultData { + + const val httpTtsFileName = "httpTTS.json" + const val txtTocRuleFileName = "txtTocRule.json" + + val defaultHttpTTS by lazy { + val json = + String( + App.INSTANCE.assets.open("defaultData${File.separator}$httpTtsFileName") + .readBytes() + ) + GSON.fromJsonArray(json)!! + } + + val defaultReadConfigs by lazy { + val json = String( + App.INSTANCE.assets.open("defaultData${File.separator}${ReadBookConfig.configFileName}") + .readBytes() + ) + GSON.fromJsonArray(json)!! + } + + val defaultThemeConfigs by lazy { + val json = String( + App.INSTANCE.assets.open("defaultData${File.separator}${ThemeConfig.configFileName}") + .readBytes() + ) + GSON.fromJsonArray(json)!! + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/ImageLoader.kt b/app/src/main/java/com/novel/read/help/ImageLoader.kt new file mode 100644 index 0000000..9217df6 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/ImageLoader.kt @@ -0,0 +1,56 @@ +package com.novel.read.help + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.drawable.Drawable +import android.net.Uri +import androidx.annotation.DrawableRes +import com.bumptech.glide.Glide +import com.bumptech.glide.RequestBuilder +import com.novel.read.utils.ext.isAbsUrl +import com.novel.read.utils.ext.isContentPath +import java.io.File + +object ImageLoader { + + /** + * 自动判断path类型 + */ + fun load(context: Context, path: String?): RequestBuilder { + return when { + path.isNullOrEmpty() -> Glide.with(context).load(path) + path.isAbsUrl() -> Glide.with(context).load(path) + path.isContentPath() -> Glide.with(context).load(Uri.parse(path)) + else -> try { + Glide.with(context).load(File(path)) + } catch (e: Exception) { + Glide.with(context).load(path) + } + } + } + + fun load(context: Context, @DrawableRes resId: Int?): RequestBuilder { + return Glide.with(context).load(resId) + } + + fun load(context: Context, file: File?): RequestBuilder { + return Glide.with(context).load(file) + } + + fun load(context: Context, uri: Uri?): RequestBuilder { + return Glide.with(context).load(uri) + } + + fun load(context: Context, drawable: Drawable?): RequestBuilder { + return Glide.with(context).load(drawable) + } + + fun load(context: Context, bitmap: Bitmap?): RequestBuilder { + return Glide.with(context).load(bitmap) + } + + fun load(context: Context, bytes: ByteArray?): RequestBuilder { + return Glide.with(context).load(bytes) + } + +} diff --git a/app/src/main/java/com/novel/read/help/IntentDataHelp.kt b/app/src/main/java/com/novel/read/help/IntentDataHelp.kt new file mode 100644 index 0000000..67f4e05 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/IntentDataHelp.kt @@ -0,0 +1,20 @@ +package com.novel.read.help + +object IntentDataHelp { + + private val bigData: MutableMap = mutableMapOf() + + fun putData(data: Any, tag: String = ""): String { + val key = tag + System.currentTimeMillis() + bigData[key] = data + return key + } + + @Suppress("UNCHECKED_CAST") + fun getData(key: String?): T? { + if (key == null) return null + val data = bigData[key] + bigData.remove(key) + return data as? T + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/IntentHelp.kt b/app/src/main/java/com/novel/read/help/IntentHelp.kt new file mode 100644 index 0000000..b4b6bed --- /dev/null +++ b/app/src/main/java/com/novel/read/help/IntentHelp.kt @@ -0,0 +1,61 @@ +package com.novel.read.help + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.novel.read.R +import org.jetbrains.anko.toast + +object IntentHelp { + + + fun toTTSSetting(context: Context) { + //跳转到文字转语音设置界面 + try { + val intent = Intent() + intent.action = "com.android.settings.TTS_SETTINGS" + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(intent) + } catch (ignored: Exception) { + context.toast(R.string.tip_cannot_jump_setting_page) + } + } + + fun toInstallUnknown(context: Context) { + try { + val intent = Intent() + intent.action = "android.settings.MANAGE_UNKNOWN_APP_SOURCES" + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + context.startActivity(intent) + } catch (ignored: Exception) { + context.toast("无法打开设置") + } + } + + inline fun servicePendingIntent( + context: Context, + action: String, + bundle: Bundle? = null + ): PendingIntent? { + val intent = Intent(context, T::class.java) + intent.action = action + bundle?.let { + intent.putExtras(bundle) + } + return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) + } + + inline fun activityPendingIntent( + context: Context, + action: String, + bundle: Bundle? = null + ): PendingIntent? { + val intent = Intent(context, T::class.java) + intent.action = action + bundle?.let { + intent.putExtras(bundle) + } + return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/MediaHelp.kt b/app/src/main/java/com/novel/read/help/MediaHelp.kt new file mode 100644 index 0000000..40013cc --- /dev/null +++ b/app/src/main/java/com/novel/read/help/MediaHelp.kt @@ -0,0 +1,82 @@ +package com.novel.read.help + +import android.content.Context +import android.media.AudioAttributes +import android.media.AudioFocusRequest +import android.media.AudioManager +import android.media.MediaPlayer +import android.os.Build +import android.support.v4.media.session.PlaybackStateCompat +import com.novel.read.R + +object MediaHelp { + const val MEDIA_SESSION_ACTIONS = (PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS + or PlaybackStateCompat.ACTION_REWIND + or PlaybackStateCompat.ACTION_PLAY + or PlaybackStateCompat.ACTION_PLAY_PAUSE + or PlaybackStateCompat.ACTION_PAUSE + or PlaybackStateCompat.ACTION_STOP + or PlaybackStateCompat.ACTION_FAST_FORWARD + or PlaybackStateCompat.ACTION_SKIP_TO_NEXT + or PlaybackStateCompat.ACTION_SEEK_TO + or PlaybackStateCompat.ACTION_SET_RATING + or PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID + or PlaybackStateCompat.ACTION_PLAY_FROM_SEARCH + or PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM + or PlaybackStateCompat.ACTION_PLAY_FROM_URI + or PlaybackStateCompat.ACTION_PREPARE + or PlaybackStateCompat.ACTION_PREPARE_FROM_MEDIA_ID + or PlaybackStateCompat.ACTION_PREPARE_FROM_SEARCH + or PlaybackStateCompat.ACTION_PREPARE_FROM_URI + or PlaybackStateCompat.ACTION_SET_REPEAT_MODE + or PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE + or PlaybackStateCompat.ACTION_SET_CAPTIONING_ENABLED) + + fun getFocusRequest(audioFocusChangeListener: AudioManager.OnAudioFocusChangeListener): AudioFocusRequest? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val mPlaybackAttributes = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() + AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) + .setAudioAttributes(mPlaybackAttributes) + .setAcceptsDelayedFocusGain(true) + .setOnAudioFocusChangeListener(audioFocusChangeListener) + .build() + } else { + null + } + } + + /** + * @return 音频焦点 + */ + fun requestFocus( + audioManager: AudioManager, + listener: AudioManager.OnAudioFocusChangeListener, + focusRequest: AudioFocusRequest? + ): Boolean { + val request: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + focusRequest?.let { + audioManager.requestAudioFocus(focusRequest) + } ?: AudioManager.AUDIOFOCUS_REQUEST_GRANTED + } else { + @Suppress("DEPRECATION") + audioManager.requestAudioFocus( + listener, + AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN + ) + } + return request == AudioManager.AUDIOFOCUS_REQUEST_GRANTED + } + + fun playSilentSound(mContext: Context) { + kotlin.runCatching { + // Stupid Android 8 "Oreo" hack to make media buttons work + val mMediaPlayer = MediaPlayer.create(mContext, R.raw.silent_sound) + mMediaPlayer.setOnCompletionListener { mMediaPlayer.release() } + mMediaPlayer.start() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/ReadBookConfig.kt b/app/src/main/java/com/novel/read/help/ReadBookConfig.kt new file mode 100644 index 0000000..e19ab19 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/ReadBookConfig.kt @@ -0,0 +1,530 @@ +package com.novel.read.help + +import android.graphics.Color +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import androidx.annotation.Keep +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.PreferKey +import com.novel.read.user.VipHelper +import com.novel.read.utils.BitmapUtils +import com.novel.read.utils.FileUtils +import com.novel.read.utils.ext.* +import com.novel.read.help.coroutine.Coroutine +import io.legado.app.ui.book.read.page.provider.ChapterProvider +import java.io.File + +/** + * 阅读界面配置 + */ +@Keep +object ReadBookConfig { + const val configFileName = "readConfig.json" + const val shareConfigFileName = "shareReadConfig.json" + val configFilePath = FileUtils.getPath(App.INSTANCE.filesDir, configFileName) + val shareConfigFilePath = FileUtils.getPath(App.INSTANCE.filesDir, shareConfigFileName) + val configList: ArrayList = arrayListOf() + lateinit var shareConfig: Config + var durConfig + get() = getConfig(styleSelect) + set(value) { + configList[styleSelect] = value + if (shareLayout) { + shareConfig = value + } + upBg() + } + + var bg: Drawable? = null + var bgMeanColor: Int = 0 + val textColor: Int get() = durConfig.curTextColor() + + init { + initConfigs() + initShareConfig() + } + + @Synchronized + fun getConfig(index: Int): Config { + if (configList.size < 5) { + resetAll() + } + return configList.getOrNull(index) ?: configList[0] + } + + fun initConfigs() { + val configFile = File(configFilePath) + var configs: List? = null + if (configFile.exists()) { + try { + val json = configFile.readText() + configs = GSON.fromJsonArray(json) + } catch (e: Exception) { + e.printStackTrace() + } + } + (configs ?: DefaultData.defaultReadConfigs).let { + configList.clear() + configList.addAll(it) + } + } + + fun initShareConfig() { + val configFile = File(shareConfigFilePath) + var c: Config? = null + if (configFile.exists()) { + try { + val json = configFile.readText() + c = GSON.fromJsonObject(json) + } catch (e: Exception) { + e.printStackTrace() + } + } + shareConfig = c ?: configList.getOrNull(5) ?: Config() + } + + fun upBg() { + val resources = App.INSTANCE.resources + val dm = resources.displayMetrics + val width = dm.widthPixels + val height = dm.heightPixels + bg = durConfig.curBgDrawable(width, height).apply { + if (this is BitmapDrawable) { + bgMeanColor = BitmapUtils.getMeanColor(bitmap) + } else if (this is ColorDrawable) { + bgMeanColor = color + } + } + } + + fun save() { + Coroutine.async { + synchronized(this) { + GSON.toJson(configList).let { + FileUtils.deleteFile(configFilePath) + FileUtils.createFileIfNotExist(configFilePath).writeText(it) + } + GSON.toJson(shareConfig).let { + FileUtils.deleteFile(shareConfigFilePath) + FileUtils.createFileIfNotExist(shareConfigFilePath).writeText(it) + } + } + } + } + + fun deleteDur(): Boolean { + if (configList.size > 5) { + configList.removeAt(styleSelect) + if (styleSelect > 0) { + styleSelect -= 1 + } + upBg() + return true + } + return false + } + + private fun resetAll() { + DefaultData.defaultReadConfigs.let { + configList.clear() + configList.addAll(it) + save() + } + } + + //配置写入读取 + var autoReadSpeed = App.INSTANCE.getPrefInt(PreferKey.autoReadSpeed, 46) + set(value) { + field = value + App.INSTANCE.putPrefInt(PreferKey.autoReadSpeed, value) + } + var styleSelect = App.INSTANCE.getPrefInt(PreferKey.readStyleSelect) + set(value) { + field = value + if (App.INSTANCE.getPrefInt(PreferKey.readStyleSelect) != value) { + App.INSTANCE.putPrefInt(PreferKey.readStyleSelect, value) + } + } + var shareLayout = App.INSTANCE.getPrefBoolean(PreferKey.shareLayout, true) + set(value) { + field = value + if (App.INSTANCE.getPrefBoolean(PreferKey.shareLayout) != value) { + App.INSTANCE.putPrefBoolean(PreferKey.shareLayout, value) + } + } + val clickTurnPage get() = App.INSTANCE.getPrefBoolean(PreferKey.clickTurnPage, true) + val clickAllNext get() = App.INSTANCE.getPrefBoolean(PreferKey.clickAllNext, false) + val textFullJustify get() = App.INSTANCE.getPrefBoolean(PreferKey.textFullJustify, true) + val textBottomJustify get() = App.INSTANCE.getPrefBoolean(PreferKey.textBottomJustify, true) + var hideStatusBar = App.INSTANCE.getPrefBoolean(PreferKey.hideStatusBar) + var hideNavigationBar = App.INSTANCE.getPrefBoolean(PreferKey.hideNavigationBar) + + val config get() = if (shareLayout) shareConfig else durConfig + + var pageAnim: Int + get() = config.curPageAnim() + set(value) { + config.setCurPageAnim(value) + } + + var textFont: String + get() = config.textFont + set(value) { + config.textFont = value + } + + var textBold: Int + get() = config.textBold + set(value) { + config.textBold = value + } + + var textSize: Int + get() = config.textSize + set(value) { + config.textSize = value + } + + var letterSpacing: Float + get() = config.letterSpacing + set(value) { + config.letterSpacing = value + } + + var lineSpacingExtra: Int + get() = config.lineSpacingExtra + set(value) { + config.lineSpacingExtra = value + } + + var paragraphSpacing: Int + get() = config.paragraphSpacing + set(value) { + config.paragraphSpacing = value + } + + var titleMode: Int + get() = config.titleMode + set(value) { + config.titleMode = value + } + var titleSize: Int + get() = config.titleSize + set(value) { + config.titleSize = value + } + + var titleTopSpacing: Int + get() = config.titleTopSpacing + set(value) { + config.titleTopSpacing = value + } + + var titleBottomSpacing: Int + get() = config.titleBottomSpacing + set(value) { + config.titleBottomSpacing = value + } + + var paragraphIndent: String + get() = config.paragraphIndent + set(value) { + config.paragraphIndent = value + } + + var paddingBottom: Int +// get() = config.paddingBottom + get() = if (VipHelper.showAd()) { + 10 + } else { + 20 + } + set(value) { + config.paddingBottom = value + } + + var paddingLeft: Int + get() = config.paddingLeft + set(value) { + config.paddingLeft = value + } + + var paddingRight: Int + get() = config.paddingRight + set(value) { + config.paddingRight = value + } + + var paddingTop: Int + get() = config.paddingTop + set(value) { + config.paddingTop = value + } + + var headerPaddingBottom: Int + get() = config.headerPaddingBottom + set(value) { + config.headerPaddingBottom = value + } + + var headerPaddingLeft: Int + get() = config.headerPaddingLeft + set(value) { + config.headerPaddingLeft = value + } + + var headerPaddingRight: Int + get() = config.headerPaddingRight + set(value) { + config.headerPaddingRight = value + } + + var headerPaddingTop: Int + get() = config.headerPaddingTop + set(value) { + config.headerPaddingTop = value + } + + var footerPaddingBottom: Int + // get() = config.footerPaddingBottom + get() = if (VipHelper.showAd()) { + 60 + } else { + 10 + } + set(value) { + config.footerPaddingBottom = value + } + + var footerPaddingLeft: Int + get() = config.footerPaddingLeft + set(value) { + config.footerPaddingLeft = value + } + + var footerPaddingRight: Int + get() = config.footerPaddingRight + set(value) { + config.footerPaddingRight = value + } + + var footerPaddingTop: Int + get() = config.footerPaddingTop + set(value) { + config.footerPaddingTop = value + } + + var showHeaderLine: Boolean + get() = config.showHeaderLine + set(value) { + config.showHeaderLine = value + } + + var showFooterLine: Boolean + get() = config.showFooterLine + set(value) { + config.showFooterLine = value + } + + fun getExportConfig(): Config { + val exportConfig = GSON.fromJsonObject(GSON.toJson(durConfig))!! + if (shareLayout) { + exportConfig.textFont = shareConfig.textFont + exportConfig.textBold = shareConfig.textBold + exportConfig.textSize = shareConfig.textSize + exportConfig.letterSpacing = shareConfig.letterSpacing + exportConfig.lineSpacingExtra = shareConfig.lineSpacingExtra + exportConfig.paragraphSpacing = shareConfig.paragraphSpacing + exportConfig.titleMode = shareConfig.titleMode + exportConfig.titleSize = shareConfig.titleSize + exportConfig.titleTopSpacing = shareConfig.titleTopSpacing + exportConfig.titleBottomSpacing = shareConfig.titleBottomSpacing + exportConfig.paddingBottom = shareConfig.paddingBottom + exportConfig.paddingLeft = shareConfig.paddingLeft + exportConfig.paddingRight = shareConfig.paddingRight + exportConfig.paddingTop = shareConfig.paddingTop + exportConfig.headerPaddingBottom = shareConfig.headerPaddingBottom + exportConfig.headerPaddingLeft = shareConfig.headerPaddingLeft + exportConfig.headerPaddingRight = shareConfig.headerPaddingRight + exportConfig.headerPaddingTop = shareConfig.headerPaddingTop + exportConfig.footerPaddingBottom = shareConfig.footerPaddingBottom + exportConfig.footerPaddingLeft = shareConfig.footerPaddingLeft + exportConfig.footerPaddingRight = shareConfig.footerPaddingRight + exportConfig.footerPaddingTop = shareConfig.footerPaddingTop + exportConfig.showHeaderLine = shareConfig.showHeaderLine + exportConfig.showFooterLine = shareConfig.showFooterLine + exportConfig.tipHeaderLeft = shareConfig.tipHeaderLeft + exportConfig.tipHeaderMiddle = shareConfig.tipHeaderMiddle + exportConfig.tipHeaderRight = shareConfig.tipHeaderRight + exportConfig.tipFooterLeft = shareConfig.tipFooterLeft + exportConfig.tipFooterMiddle = shareConfig.tipFooterMiddle + exportConfig.tipFooterRight = shareConfig.tipFooterRight + exportConfig.hideHeader = shareConfig.hideHeader + exportConfig.hideFooter = shareConfig.hideFooter + } + return exportConfig + } + + @Keep + class Config( + var name: String = "", + var bgStr: String = "#EFEFF7",//白天背景 + var bgStrNight: String = "#000000",//夜间背景 + var bgStrEInk: String = "#FFFFFF", + var bgType: Int = 0,//白天背景类型 0:颜色, 1:assets图片, 2其它图片 + var bgTypeNight: Int = 0,//夜间背景类型 + var bgTypeEInk: Int = 0, + private var darkStatusIcon: Boolean = true,//白天是否暗色状态栏 + private var darkStatusIconNight: Boolean = false,//晚上是否暗色状态栏 + private var darkStatusIconEInk: Boolean = true, + private var textColor: String = "#383429",//白天文字颜色 + private var textColorNight: String = "#ADADAD",//夜间文字颜色 + private var textColorEInk: String = "#000000", + private var pageAnim: Int = 0, + private var pageAnimEInk: Int = 3, + var textFont: String = "",//字体 + var textBold: Int = 0,//是否粗体字 0:正常, 1:粗体, 2:细体 + var textSize: Int = 20,//文字大小 + var letterSpacing: Float = 0.1f,//字间距 + var lineSpacingExtra: Int = 13,//行间距 + var paragraphSpacing: Int = 4,//段距 + var titleMode: Int = 0,//标题居中 1 居中 + var titleSize: Int = 5, + var titleTopSpacing: Int = 12, + var titleBottomSpacing: Int = 0, + var paragraphIndent: String = "  ",//段落缩进 + var paddingBottom: Int = 6, + var paddingLeft: Int = 16, + var paddingRight: Int = 16, + var paddingTop: Int = 10, + var headerPaddingBottom: Int = 0, + var headerPaddingLeft: Int = 16, + var headerPaddingRight: Int = 16, + var headerPaddingTop: Int = 0, + var footerPaddingBottom: Int = 60, + var footerPaddingLeft: Int = 16, + var footerPaddingRight: Int = 16, + var footerPaddingTop: Int = 6, + var showHeaderLine: Boolean = false, + var showFooterLine: Boolean = false, + var tipHeaderLeft: Int = ReadTipConfig.time, + var tipHeaderMiddle: Int = ReadTipConfig.none, + var tipHeaderRight: Int = ReadTipConfig.battery, + var tipFooterLeft: Int = ReadTipConfig.chapterTitle, + var tipFooterMiddle: Int = ReadTipConfig.none, + var tipFooterRight: Int = ReadTipConfig.pageAndTotal, + var hideHeader: Boolean = true, + var hideFooter: Boolean = false + ) { + + fun setCurTextColor(color: Int) { + when { + AppConfig.isEInkMode -> textColorEInk = "#${color.hexString}" + AppConfig.isNightTheme -> textColorNight = "#${color.hexString}" + else -> textColor = "#${color.hexString}" + } + ChapterProvider.upStyle() + } + + fun curTextColor(): Int { + return when { + AppConfig.isEInkMode -> Color.parseColor(textColorEInk) + AppConfig.isNightTheme -> Color.parseColor(textColorNight) + else -> Color.parseColor(textColor) + } + } + + fun setCurStatusIconDark(isDark: Boolean) { + when { + AppConfig.isEInkMode -> darkStatusIconEInk = isDark + AppConfig.isNightTheme -> darkStatusIconNight = isDark + else -> darkStatusIcon = isDark + } + } + + fun curStatusIconDark(): Boolean { + return when { + AppConfig.isEInkMode -> darkStatusIconEInk + AppConfig.isNightTheme -> darkStatusIconNight + else -> darkStatusIcon + } + } + + fun setCurPageAnim(anim: Int) { + when { + AppConfig.isEInkMode -> pageAnimEInk = anim + else -> pageAnim = anim + } + } + + fun curPageAnim(): Int { + return when { + AppConfig.isEInkMode -> pageAnimEInk + else -> pageAnim + } + } + + fun setCurBg(bgType: Int, bg: String) { + when { + AppConfig.isEInkMode -> { + bgTypeEInk = bgType + bgStrEInk = bg + } + AppConfig.isNightTheme -> { + bgTypeNight = bgType + bgStrNight = bg + } + else -> { + this.bgType = bgType + bgStr = bg + } + } + } + + fun curBgStr(): String { + return when { + AppConfig.isEInkMode -> bgStrEInk + AppConfig.isNightTheme -> bgStrNight + else -> bgStr + } + } + + fun curBgType(): Int { + return when { + AppConfig.isEInkMode -> bgTypeEInk + AppConfig.isNightTheme -> bgTypeNight + else -> bgType + } + } + + fun curBgDrawable(width: Int, height: Int): Drawable { + var bgDrawable: Drawable? = null + val resources = App.INSTANCE.resources + try { + bgDrawable = when (curBgType()) { + 0 -> ColorDrawable(Color.parseColor(curBgStr())) + 1 -> { + BitmapDrawable( + resources, + BitmapUtils.decodeAssetsBitmap( + App.INSTANCE, + "bg" + File.separator + curBgStr(), + width, + height + ) + ) + } + else -> BitmapDrawable( + resources, + BitmapUtils.decodeBitmap(curBgStr(), width, height) + ) + } + } catch (e: Exception) { + e.printStackTrace() + } + return bgDrawable ?: ColorDrawable(App.INSTANCE.getCompatColor(R.color.background)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/ReadTipConfig.kt b/app/src/main/java/com/novel/read/help/ReadTipConfig.kt new file mode 100644 index 0000000..7504a3c --- /dev/null +++ b/app/src/main/java/com/novel/read/help/ReadTipConfig.kt @@ -0,0 +1,71 @@ +package com.novel.read.help + +import com.novel.read.App +import com.novel.read.R + +object ReadTipConfig { + val tipArray: Array = App.INSTANCE.resources.getStringArray(R.array.read_tip) + const val none = 0 + const val chapterTitle = 1 + const val time = 2 + const val battery = 3 + const val page = 4 + const val totalProgress = 5 + const val pageAndTotal = 6 + const val bookName = 7 + + val tipHeaderLeftStr: String get() = tipArray.getOrElse(tipHeaderLeft) { tipArray[none] } + val tipHeaderMiddleStr: String get() = tipArray.getOrElse(tipHeaderMiddle) { tipArray[none] } + val tipHeaderRightStr: String get() = tipArray.getOrElse(tipHeaderRight) { tipArray[none] } + val tipFooterLeftStr: String get() = tipArray.getOrElse(tipFooterLeft) { tipArray[none] } + val tipFooterMiddleStr: String get() = tipArray.getOrElse(tipFooterMiddle) { tipArray[none] } + val tipFooterRightStr: String get() = tipArray.getOrElse(tipFooterRight) { tipArray[none] } + + var tipHeaderLeft: Int + get() = ReadBookConfig.config.tipHeaderLeft + set(value) { + ReadBookConfig.config.tipHeaderLeft = value + } + + var tipHeaderMiddle: Int + get() = ReadBookConfig.config.tipHeaderMiddle + set(value) { + ReadBookConfig.config.tipHeaderMiddle = value + } + + var tipHeaderRight: Int + get() = ReadBookConfig.config.tipHeaderRight + set(value) { + ReadBookConfig.config.tipHeaderRight = value + } + + var tipFooterLeft: Int + get() = ReadBookConfig.config.tipFooterLeft + set(value) { + ReadBookConfig.config.tipFooterLeft = value + } + + var tipFooterMiddle: Int + get() = ReadBookConfig.config.tipFooterMiddle + set(value) { + ReadBookConfig.config.tipFooterMiddle = value + } + + var tipFooterRight: Int + get() = ReadBookConfig.config.tipFooterRight + set(value) { + ReadBookConfig.config.tipFooterRight = value + } + + var hideHeader: Boolean + get() = ReadBookConfig.config.hideHeader + set(value) { + ReadBookConfig.config.hideHeader = value + } + + var hideFooter: Boolean + get() = ReadBookConfig.config.hideFooter + set(value) { + ReadBookConfig.config.hideFooter = value + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/ThemeConfig.kt b/app/src/main/java/com/novel/read/help/ThemeConfig.kt new file mode 100644 index 0000000..30a37f6 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/ThemeConfig.kt @@ -0,0 +1,212 @@ +package com.novel.read.help + +import android.content.Context +import android.graphics.Color +import androidx.annotation.Keep +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.EventBus +import com.novel.read.constant.PreferKey +import com.novel.read.lib.ThemeStore +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.FileUtils +import com.novel.read.utils.ext.* +import java.io.File + +object ThemeConfig { + const val configFileName = "themeConfig.json" + val configFilePath = FileUtils.getPath(App.INSTANCE.filesDir, configFileName) + + val configList: ArrayList by lazy { + val cList = getConfigs() ?: DefaultData.defaultThemeConfigs + ArrayList(cList) + } + + fun upConfig() { + getConfigs()?.let { + it.forEach { config -> + addConfig(config) + } + } + } + + fun save() { + val json = GSON.toJson(configList) + FileUtils.deleteFile(configFilePath) + FileUtils.createFileIfNotExist(configFilePath).writeText(json) + } + + fun delConfig(index: Int) { + configList.removeAt(index) + save() + } + + fun addConfig(json: String): Boolean { + GSON.fromJsonObject(json.trim { it < ' ' })?.let { + addConfig(it) + return true + } + return false + } + + private fun addConfig(newConfig: Config) { + configList.forEachIndexed { index, config -> + if (newConfig.themeName == config.themeName) { + configList[index] = newConfig + return + } + } + configList.add(newConfig) + save() + } + + private fun getConfigs(): List? { + val configFile = File(configFilePath) + if (configFile.exists()) { + try { + val json = configFile.readText() + return GSON.fromJsonArray(json) + } catch (e: Exception) { + e.printStackTrace() + } + } + return null + } + + fun applyConfig(context: Context, config: Config) { + val primary = Color.parseColor(config.primaryColor) + val accent = Color.parseColor(config.accentColor) + val background = Color.parseColor(config.backgroundColor) + val bBackground = Color.parseColor(config.bottomBackground) + if (config.isNightTheme) { + context.putPrefInt(PreferKey.cNPrimary, primary) + context.putPrefInt(PreferKey.cNAccent, accent) + context.putPrefInt(PreferKey.cNBackground, background) + context.putPrefInt(PreferKey.cNBBackground, bBackground) + } else { + context.putPrefInt(PreferKey.cPrimary, primary) + context.putPrefInt(PreferKey.cAccent, accent) + context.putPrefInt(PreferKey.cBackground, background) + context.putPrefInt(PreferKey.cBBackground, bBackground) + } + AppConfig.isNightTheme = config.isNightTheme + App.INSTANCE.applyDayNight() + postEvent(EventBus.RECREATE, "") + } + + fun saveDayTheme(context: Context, name: String) { + val primary = + context.getPrefInt(PreferKey.cPrimary, context.getCompatColor(R.color.md_brown_500)) + val accent = + context.getPrefInt(PreferKey.cAccent, context.getCompatColor(R.color.md_red_600)) + val background = + context.getPrefInt(PreferKey.cBackground, context.getCompatColor(R.color.md_grey_100)) + val bBackground = + context.getPrefInt(PreferKey.cBBackground, context.getCompatColor(R.color.md_grey_200)) + val config = Config( + themeName = name, + isNightTheme = false, + primaryColor = "#${primary.hexString}", + accentColor = "#${accent.hexString}", + backgroundColor = "#${background.hexString}", + bottomBackground = "#${bBackground.hexString}" + ) + addConfig(config) + } + + fun saveNightTheme(context: Context, name: String) { + val primary = + context.getPrefInt( + PreferKey.cNPrimary, + context.getCompatColor(R.color.md_blue_grey_600) + ) + val accent = + context.getPrefInt( + PreferKey.cNAccent, + context.getCompatColor(R.color.md_deep_orange_800) + ) + val background = + context.getPrefInt(PreferKey.cNBackground, context.getCompatColor(R.color.md_grey_900)) + val bBackground = + context.getPrefInt(PreferKey.cNBBackground, context.getCompatColor(R.color.md_grey_850)) + val config = Config( + themeName = name, + isNightTheme = true, + primaryColor = "#${primary.hexString}", + accentColor = "#${accent.hexString}", + backgroundColor = "#${background.hexString}", + bottomBackground = "#${bBackground.hexString}" + ) + addConfig(config) + } + + /** + * 更新主题 + */ + fun applyTheme(context: Context) = with(context) { + when { + AppConfig.isEInkMode -> { + ThemeStore.editTheme(this) + .coloredNavigationBar(true) + .primaryColor(Color.WHITE) + .accentColor(Color.BLACK) + .backgroundColor(Color.WHITE) + .bottomBackground(Color.WHITE) + .apply() + } + AppConfig.isNightTheme -> { + val primary = + getPrefInt(PreferKey.cNPrimary, getCompatColor(R.color.md_grey_900)) + val accent = + getPrefInt(PreferKey.cNAccent, getCompatColor(R.color.md_amber_800)) + var background = + getPrefInt(PreferKey.cNBackground, getCompatColor(R.color.md_grey_900)) + if (ColorUtils.isColorLight(background)) { + background = getCompatColor(R.color.md_grey_900) + putPrefInt(PreferKey.cNBackground, background) + } + val bBackground = + getPrefInt(PreferKey.cNBBackground, getCompatColor(R.color.md_grey_900)) + ThemeStore.editTheme(this) + .coloredNavigationBar(true) + .primaryColor(ColorUtils.withAlpha(primary, 1f)) + .accentColor(ColorUtils.withAlpha(accent, 1f)) + .backgroundColor(ColorUtils.withAlpha(background, 1f)) + .bottomBackground(ColorUtils.withAlpha(bBackground, 1f)) + .apply() + } + else -> { + val primary = + getPrefInt(PreferKey.cPrimary, getCompatColor(R.color.md_grey_50)) + val accent = + getPrefInt(PreferKey.cAccent, getCompatColor(R.color.md_amber_800)) + var background = + getPrefInt(PreferKey.cBackground, getCompatColor(R.color.md_grey_50)) + if (!ColorUtils.isColorLight(background)) { + background = getCompatColor(R.color.md_grey_50) + putPrefInt(PreferKey.cBackground, background) + } + val bBackground = + getPrefInt(PreferKey.cBBackground, getCompatColor(R.color.white)) + ThemeStore.editTheme(this) + .coloredNavigationBar(true) + .primaryColor(ColorUtils.withAlpha(primary, 1f)) + .accentColor(ColorUtils.withAlpha(accent, 1f)) + .backgroundColor(ColorUtils.withAlpha(background, 1f)) + .bottomBackground(ColorUtils.withAlpha(bBackground, 1f)) + .apply() + } + } + } + + @Keep + class Config( + var themeName: String, + var isNightTheme: Boolean, + var primaryColor: String, + var accentColor: String, + var backgroundColor: String, + var bottomBackground: String + ) + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/TintHelper.kt b/app/src/main/java/com/novel/read/help/TintHelper.kt new file mode 100644 index 0000000..d20c9d9 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/TintHelper.kt @@ -0,0 +1,488 @@ +package com.novel.read.help + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.PorterDuff +import android.graphics.drawable.Drawable +import android.graphics.drawable.RippleDrawable +import android.os.Build +import android.view.View +import android.widget.* +import androidx.annotation.CheckResult +import androidx.annotation.ColorInt +import androidx.appcompat.widget.AppCompatEditText +import androidx.appcompat.widget.SearchView +import androidx.appcompat.widget.SwitchCompat +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.novel.read.R +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ViewUtils + +/** + * @author afollestad, plusCubed + */ +@Suppress("MemberVisibilityCanBePrivate") +object TintHelper { + + @SuppressLint("PrivateResource") + @ColorInt + private fun getDefaultRippleColor(context: Context, useDarkRipple: Boolean): Int { + // Light ripple is actually translucent black, and vice versa + return ContextCompat.getColor( + context, if (useDarkRipple) + R.color.ripple_material_light + else + R.color.ripple_material_dark + ) + } + + private fun getDisabledColorStateList( + @ColorInt normal: Int, + @ColorInt disabled: Int + ): ColorStateList { + return ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_enabled), + intArrayOf(android.R.attr.state_enabled) + ), intArrayOf(disabled, normal) + ) + } + + fun setTintSelector(view: View, @ColorInt color: Int, darker: Boolean, useDarkTheme: Boolean) { + val isColorLight = ColorUtils.isColorLight(color) + val disabled = ContextCompat.getColor( + view.context, + if (useDarkTheme) R.color.ate_button_disabled_dark else R.color.ate_button_disabled_light + ) + val pressed = ColorUtils.shiftColor(color, if (darker) 0.9f else 1.1f) + val activated = ColorUtils.shiftColor(color, if (darker) 1.1f else 0.9f) + val rippleColor = getDefaultRippleColor(view.context, isColorLight) + val textColor = ContextCompat.getColor( + view.context, + if (isColorLight) R.color.ate_primary_text_light else R.color.ate_primary_text_dark + ) + + val sl: ColorStateList + when (view) { + is Button -> { + sl = getDisabledColorStateList(color, disabled) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && view.getBackground() is RippleDrawable) { + val rd = view.getBackground() as RippleDrawable + rd.setColor(ColorStateList.valueOf(rippleColor)) + } + + // Disabled text color state for buttons, may get overridden later by ATE tags + view.setTextColor( + getDisabledColorStateList( + textColor, + ContextCompat.getColor( + view.getContext(), + if (useDarkTheme) R.color.ate_button_text_disabled_dark else R.color.ate_button_text_disabled_light + ) + ) + ) + } + is FloatingActionButton -> { + // FloatingActionButton doesn't support disabled state? + sl = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_pressed), + intArrayOf(android.R.attr.state_pressed) + ), intArrayOf(color, pressed) + ) + + view.rippleColor = rippleColor + view.backgroundTintList = sl + if (view.drawable != null) + view.setImageDrawable(createTintedDrawable(view.drawable, textColor)) + return + } + else -> { + sl = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_enabled), + intArrayOf(android.R.attr.state_enabled), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_pressed), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_activated), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_checked) + ), + intArrayOf(disabled, color, pressed, activated, activated) + ) + } + } + + var drawable: Drawable? = view.background + if (drawable != null) { + drawable = createTintedDrawable(drawable, sl) + ViewUtils.setBackgroundCompat(view, drawable) + } + + if (view is TextView && view !is Button) { + view.setTextColor( + getDisabledColorStateList( + textColor, + ContextCompat.getColor( + view.getContext(), + if (isColorLight) R.color.ate_text_disabled_light else R.color.ate_text_disabled_dark + ) + ) + ) + } + } + + fun setTintAuto( + view: View, @ColorInt color: Int, + isBackground: Boolean, isDark: Boolean + ) { + var isBg = isBackground + if (!isBg) { + when (view) { + is RadioButton -> setTint(view, color, isDark) + is SeekBar -> setTint(view, color, isDark) + is ProgressBar -> setTint(view, color) + is AppCompatEditText -> setTint(view, color, isDark) + is CheckBox -> setTint(view, color, isDark) + is ImageView -> setTint(view, color) + is Switch -> setTint(view, color, isDark) + is SwitchCompat -> setTint(view, color, isDark) + is SearchView -> { + val iconIdS = + intArrayOf( + androidx.appcompat.R.id.search_button, + androidx.appcompat.R.id.search_close_btn, + androidx.appcompat.R.id.search_go_btn, + androidx.appcompat.R.id.search_voice_btn, + androidx.appcompat.R.id.search_mag_icon + ) + for (iconId in iconIdS) { + val icon = view.findViewById(iconId) + if (icon != null) { + setTint(icon, color) + } + } + } + else -> isBg = true + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && + !isBg && view.background is RippleDrawable + ) { + // Ripples for the above views (e.g. when you tap and hold a switch or checkbox) + val rd = view.background as RippleDrawable + @SuppressLint("PrivateResource") val unchecked = ContextCompat.getColor( + view.context, + if (isDark) R.color.ripple_material_dark else R.color.ripple_material_light + ) + val checked = ColorUtils.adjustAlpha(color, 0.4f) + val sl = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_activated, -android.R.attr.state_checked), + intArrayOf(android.R.attr.state_activated), + intArrayOf(android.R.attr.state_checked) + ), + intArrayOf(unchecked, checked, checked) + ) + rd.setColor(sl) + } + } + if (isBg) { + // Need to tint the isBackground of a view + if (view is FloatingActionButton || view is Button) { + setTintSelector(view, color, false, isDark) + } else if (view.background != null) { + var drawable: Drawable? = view.background + if (drawable != null) { + drawable = createTintedDrawable(drawable, color) + ViewUtils.setBackgroundCompat(view, drawable) + } + } + } + } + + @SuppressLint("PrivateResource") + fun setTint(radioButton: RadioButton, @ColorInt color: Int, useDarker: Boolean) { + val sl = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_enabled), + intArrayOf(android.R.attr.state_enabled, -android.R.attr.state_checked), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_checked) + ), intArrayOf( + // Radio button includes own alpha for disabled state + ColorUtils.stripAlpha( + ContextCompat.getColor( + radioButton.context, + if (useDarker) R.color.ate_control_disabled_dark else R.color.ate_control_disabled_light + ) + ), + ContextCompat.getColor( + radioButton.context, + if (useDarker) R.color.ate_control_normal_dark else R.color.ate_control_normal_light + ), + color + ) + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + radioButton.buttonTintList = sl + } else { + radioButton.buttonDrawable = createTintedDrawable( + ContextCompat.getDrawable(radioButton.context, R.drawable.abc_btn_radio_material), + sl + ) + } + } + + fun setTint(seekBar: SeekBar, @ColorInt color: Int, useDarker: Boolean) { + val s1 = getDisabledColorStateList( + color, + ContextCompat.getColor( + seekBar.context, + if (useDarker) R.color.ate_control_disabled_dark else R.color.ate_control_disabled_light + ) + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + seekBar.thumbTintList = s1 + seekBar.progressTintList = s1 + } else { + val progressDrawable = createTintedDrawable(seekBar.progressDrawable, s1) + seekBar.progressDrawable = progressDrawable + val thumbDrawable = createTintedDrawable(seekBar.thumb, s1) + seekBar.thumb = thumbDrawable + } + } + + @JvmOverloads + fun setTint( + progressBar: ProgressBar, @ColorInt color: Int, + skipIndeterminate: Boolean = false + ) { + val sl = ColorStateList.valueOf(color) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + progressBar.progressTintList = sl + progressBar.secondaryProgressTintList = sl + if (!skipIndeterminate) + progressBar.indeterminateTintList = sl + } else { + if (!skipIndeterminate && progressBar.indeterminateDrawable != null) + progressBar.indeterminateDrawable.setTint(color) + if (progressBar.progressDrawable != null) + progressBar.progressDrawable.setTint(color) + } + } + + + @SuppressLint("RestrictedApi") + fun setTint(editText: AppCompatEditText, @ColorInt color: Int, useDarker: Boolean) { + val editTextColorStateList = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_enabled), + intArrayOf( + android.R.attr.state_enabled, + -android.R.attr.state_pressed, + -android.R.attr.state_focused + ), + intArrayOf() + ), + intArrayOf( + ContextCompat.getColor( + editText.context, + if (useDarker) R.color.ate_text_disabled_dark else R.color.ate_text_disabled_light + ), + ContextCompat.getColor( + editText.context, + if (useDarker) R.color.ate_control_normal_dark else R.color.ate_control_normal_light + ), + color + ) + ) + editText.supportBackgroundTintList = editTextColorStateList + setCursorTint(editText, color) + } + + @SuppressLint("PrivateResource") + fun setTint(box: CheckBox, @ColorInt color: Int, useDarker: Boolean) { + val sl = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_enabled), + intArrayOf(android.R.attr.state_enabled, -android.R.attr.state_checked), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_checked) + ), + intArrayOf( + ContextCompat.getColor( + box.context, + if (useDarker) R.color.ate_control_disabled_dark else R.color.ate_control_disabled_light + ), + ContextCompat.getColor( + box.context, + if (useDarker) R.color.ate_control_normal_dark else R.color.ate_control_normal_light + ), + color + ) + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + box.buttonTintList = sl + } else { + val drawable = + createTintedDrawable( + ContextCompat.getDrawable( + box.context, + R.drawable.abc_btn_check_material + ), sl + ) + box.buttonDrawable = drawable + } + } + + fun setTint(image: ImageView, @ColorInt color: Int) { + image.setColorFilter(color, PorterDuff.Mode.SRC_ATOP) + } + + private fun modifySwitchDrawable( + context: Context, + from: Drawable, + @ColorInt tint: Int, + thumb: Boolean, + compatSwitch: Boolean, + useDarker: Boolean + ): Drawable? { + var tint1 = tint + if (useDarker) { + tint1 = ColorUtils.shiftColor(tint1, 1.1f) + } + tint1 = ColorUtils.adjustAlpha(tint1, if (compatSwitch && !thumb) 0.5f else 1.0f) + val disabled: Int + var normal: Int + if (thumb) { + disabled = ContextCompat.getColor( + context, + if (useDarker) R.color.ate_switch_thumb_disabled_dark else R.color.ate_switch_thumb_disabled_light + ) + normal = ContextCompat.getColor( + context, + if (useDarker) R.color.ate_switch_thumb_normal_dark else R.color.ate_switch_thumb_normal_light + ) + } else { + disabled = ContextCompat.getColor( + context, + if (useDarker) R.color.ate_switch_track_disabled_dark else R.color.ate_switch_track_disabled_light + ) + normal = ContextCompat.getColor( + context, + if (useDarker) R.color.ate_switch_track_normal_dark else R.color.ate_switch_track_normal_light + ) + } + + // Stock switch includes its own alpha + if (!compatSwitch) { + normal = ColorUtils.stripAlpha(normal) + } + + val sl = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_enabled), + intArrayOf( + android.R.attr.state_enabled, + -android.R.attr.state_activated, + -android.R.attr.state_checked + ), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_activated), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_checked) + ), + intArrayOf(disabled, normal, tint1, tint1) + ) + return createTintedDrawable(from, sl) + } + + fun setTint( + @SuppressLint("UseSwitchCompatOrMaterialCode") switchView: Switch, + @ColorInt color: Int, + useDarker: Boolean + ) { + if (switchView.trackDrawable != null) { + switchView.trackDrawable = modifySwitchDrawable( + switchView.context, + switchView.trackDrawable, + color, + thumb = false, + compatSwitch = false, + useDarker = useDarker + ) + } + if (switchView.thumbDrawable != null) { + switchView.thumbDrawable = modifySwitchDrawable( + switchView.context, + switchView.thumbDrawable, + color, + thumb = true, + compatSwitch = false, + useDarker = useDarker + ) + } + } + + fun setTint(switchView: SwitchCompat, @ColorInt color: Int, useDarker: Boolean) { + if (switchView.trackDrawable != null) { + switchView.trackDrawable = modifySwitchDrawable( + switchView.context, + switchView.trackDrawable, + color, + thumb = false, + compatSwitch = true, + useDarker = useDarker + ) + } + if (switchView.thumbDrawable != null) { + switchView.thumbDrawable = modifySwitchDrawable( + switchView.context, + switchView.thumbDrawable, + color, + thumb = true, + compatSwitch = true, + useDarker = useDarker + ) + } + } + + // This returns a NEW Drawable because of the mutate() call. The mutate() call is necessary because Drawables with the same resource have shared states otherwise. + @CheckResult + fun createTintedDrawable(drawable: Drawable?, @ColorInt color: Int): Drawable? { + var drawable1: Drawable? = drawable ?: return null + drawable1 = DrawableCompat.wrap(drawable1!!.mutate()) + DrawableCompat.setTintMode(drawable1!!, PorterDuff.Mode.SRC_IN) + DrawableCompat.setTint(drawable1, color) + return drawable1 + } + + // This returns a NEW Drawable because of the mutate() call. The mutate() call is necessary because Drawables with the same resource have shared states otherwise. + @CheckResult + fun createTintedDrawable(drawable: Drawable?, sl: ColorStateList): Drawable? { + var drawable1: Drawable? = drawable ?: return null + drawable1 = DrawableCompat.wrap(drawable1!!.mutate()) + DrawableCompat.setTintList(drawable1!!, sl) + return drawable1 + } + + fun setCursorTint(editText: EditText, @ColorInt color: Int) { + try { + val fCursorDrawableRes = TextView::class.java.getDeclaredField("mCursorDrawableRes") + fCursorDrawableRes.isAccessible = true + val mCursorDrawableRes = fCursorDrawableRes.getInt(editText) + val fEditor = TextView::class.java.getDeclaredField("mEditor") + fEditor.isAccessible = true + val editor = fEditor.get(editText) + val clazz = editor.javaClass + val fCursorDrawable = clazz.getDeclaredField("mCursorDrawable") + fCursorDrawable.isAccessible = true + val drawables = arrayOfNulls(2) + drawables[0] = ContextCompat.getDrawable(editText.context, mCursorDrawableRes) + drawables[0] = createTintedDrawable(drawables[0], color) + drawables[1] = ContextCompat.getDrawable(editText.context, mCursorDrawableRes) + drawables[1] = createTintedDrawable(drawables[1], color) + fCursorDrawable.set(editor, drawables) + } catch (ignored: Exception) { + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/coroutine/CompositeCoroutine.kt b/app/src/main/java/com/novel/read/help/coroutine/CompositeCoroutine.kt new file mode 100644 index 0000000..fbdf434 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/coroutine/CompositeCoroutine.kt @@ -0,0 +1,83 @@ +package com.novel.read.help.coroutine + +class CompositeCoroutine : CoroutineContainer { + + private var resources: HashSet>? = null + + val size: Int + get() = resources?.size ?: 0 + + val isEmpty: Boolean + get() = size == 0 + + constructor() + + constructor(vararg coroutines: Coroutine<*>) { + this.resources = hashSetOf(*coroutines) + } + + constructor(coroutines: Iterable>) { + this.resources = hashSetOf() + for (d in coroutines) { + this.resources?.add(d) + } + } + + override fun add(coroutine: Coroutine<*>): Boolean { + synchronized(this) { + var set: HashSet>? = resources + if (resources == null) { + set = hashSetOf() + resources = set + } + return set!!.add(coroutine) + } + } + + override fun addAll(vararg coroutines: Coroutine<*>): Boolean { + synchronized(this) { + var set: HashSet>? = resources + if (resources == null) { + set = hashSetOf() + resources = set + } + for (coroutine in coroutines) { + val add = set!!.add(coroutine) + if (!add) { + return false + } + } + } + return true + } + + override fun remove(coroutine: Coroutine<*>): Boolean { + if (delete(coroutine)) { + coroutine.cancel() + return true + } + return false + } + + override fun delete(coroutine: Coroutine<*>): Boolean { + synchronized(this) { + val set = resources + if (set == null || !set.remove(coroutine)) { + return false + } + } + return true + } + + override fun clear() { + val set: HashSet>? + synchronized(this) { + set = resources + resources = null + } + + set?.forEachIndexed { _, coroutine -> + coroutine.cancel() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/help/coroutine/Coroutine.kt b/app/src/main/java/com/novel/read/help/coroutine/Coroutine.kt new file mode 100644 index 0000000..f96c5e2 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/coroutine/Coroutine.kt @@ -0,0 +1,214 @@ +package com.novel.read.help.coroutine + +import com.novel.read.BuildConfig +import kotlinx.coroutines.* +import kotlin.coroutines.CoroutineContext + + +class Coroutine( + val scope: CoroutineScope, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> T +) { + + companion object { + + val DEFAULT = MainScope() + + fun async( + scope: CoroutineScope = DEFAULT, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> T + ): Coroutine { + return Coroutine(scope, context, block) + } + + } + + private val job: Job + + private var start: VoidCallback? = null + private var success: Callback? = null + private var error: Callback? = null + private var finally: VoidCallback? = null + private var cancel: VoidCallback? = null + + private var timeMillis: Long? = null + private var errorReturn: Result? = null + + val isCancelled: Boolean + get() = job.isCancelled + + val isActive: Boolean + get() = job.isActive + + val isCompleted: Boolean + get() = job.isCompleted + + init { + this.job = executeInternal(context, block) + } + + fun timeout(timeMillis: () -> Long): Coroutine { + this.timeMillis = timeMillis() + return this@Coroutine + } + + fun timeout(timeMillis: Long): Coroutine { + this.timeMillis = timeMillis + return this@Coroutine + } + + fun onErrorReturn(value: () -> T?): Coroutine { + this.errorReturn = Result(value()) + return this@Coroutine + } + + fun onErrorReturn(value: T?): Coroutine { + this.errorReturn = Result(value) + return this@Coroutine + } + + fun onStart( + context: CoroutineContext? = null, + block: (suspend CoroutineScope.() -> Unit) + ): Coroutine { + this.start = VoidCallback(context, block) + return this@Coroutine + } + + fun onSuccess( + context: CoroutineContext? = null, + block: suspend CoroutineScope.(T) -> Unit + ): Coroutine { + this.success = Callback(context, block) + return this@Coroutine + } + + fun onError( + context: CoroutineContext? = null, + block: suspend CoroutineScope.(Throwable) -> Unit + ): Coroutine { + this.error = Callback(context, block) + return this@Coroutine + } + + fun onFinally( + context: CoroutineContext? = null, + block: suspend CoroutineScope.() -> Unit + ): Coroutine { + this.finally = VoidCallback(context, block) + return this@Coroutine + } + + fun onCancel( + context: CoroutineContext? = null, + block: suspend CoroutineScope.() -> Unit + ): Coroutine { + this.cancel = VoidCallback(context, block) + return this@Coroutine + } + + //取消当前任务 + fun cancel(cause: CancellationException? = null) { + job.cancel(cause) + cancel?.let { + MainScope().launch { + if (null == it.context) { + it.block.invoke(scope) + } else { + withContext(scope.coroutineContext.plus(it.context)) { + it.block.invoke(this) + } + } + } + } + } + + fun invokeOnCompletion(handler: CompletionHandler): DisposableHandle { + return job.invokeOnCompletion(handler) + } + + private fun executeInternal( + context: CoroutineContext, + block: suspend CoroutineScope.() -> T + ): Job { + return scope.plus(Dispatchers.Main).launch { + try { + start?.let { dispatchVoidCallback(this, it) } + val value = executeBlock(scope, context, timeMillis ?: 0L, block) + if (isActive) { + success?.let { dispatchCallback(this, value, it) } + } + } catch (e: Throwable) { + if (BuildConfig.DEBUG) { + e.printStackTrace() + } + val consume: Boolean = errorReturn?.value?.let { value -> + if (isActive) { + success?.let { dispatchCallback(this, value, it) } + } + true + } ?: false + + if (!consume && isActive) { + error?.let { dispatchCallback(this, e, it) } + } + } finally { + if (isActive) { + finally?.let { dispatchVoidCallback(this, it) } + } + } + } + } + + private suspend inline fun dispatchVoidCallback(scope: CoroutineScope, callback: VoidCallback) { + if (null == callback.context) { + callback.block.invoke(scope) + } else { + withContext(scope.coroutineContext.plus(callback.context)) { + callback.block.invoke(this) + } + } + } + + private suspend inline fun dispatchCallback( + scope: CoroutineScope, + value: R, + callback: Callback + ) { + if (!scope.isActive) return + if (null == callback.context) { + callback.block.invoke(scope, value) + } else { + withContext(scope.coroutineContext.plus(callback.context)) { + callback.block.invoke(this, value) + } + } + } + + private suspend inline fun executeBlock( + scope: CoroutineScope, + context: CoroutineContext, + timeMillis: Long, + noinline block: suspend CoroutineScope.() -> T + ): T { + return withContext(scope.coroutineContext.plus(context)) { + if (timeMillis > 0L) withTimeout(timeMillis) { + block() + } else block() + } + } + + private data class Result(val value: T?) + + private inner class VoidCallback( + val context: CoroutineContext?, + val block: suspend CoroutineScope.() -> Unit + ) + + private inner class Callback( + val context: CoroutineContext?, + val block: suspend CoroutineScope.(VALUE) -> Unit + ) +} diff --git a/app/src/main/java/com/novel/read/help/coroutine/CoroutineContainer.kt b/app/src/main/java/com/novel/read/help/coroutine/CoroutineContainer.kt new file mode 100644 index 0000000..f7756c1 --- /dev/null +++ b/app/src/main/java/com/novel/read/help/coroutine/CoroutineContainer.kt @@ -0,0 +1,16 @@ +package com.novel.read.help.coroutine + + +internal interface CoroutineContainer { + + fun add(coroutine: Coroutine<*>): Boolean + + fun addAll(vararg coroutines: Coroutine<*>): Boolean + + fun remove(coroutine: Coroutine<*>): Boolean + + fun delete(coroutine: Coroutine<*>): Boolean + + fun clear() + +} diff --git a/app/src/main/java/com/novel/read/http/AccountManager.kt b/app/src/main/java/com/novel/read/http/AccountManager.kt deleted file mode 100644 index 369fc63..0000000 --- a/app/src/main/java/com/novel/read/http/AccountManager.kt +++ /dev/null @@ -1,303 +0,0 @@ -package com.novel.read.http - -import android.content.Context -import android.text.TextUtils -import android.util.Log - -import com.mango.mangolib.event.EventManager -import com.mango.mangolib.http.MyRequestType -import com.mango.mangolib.http.ServiceCallback -import com.novel.read.event.AddBookSignEvent -import com.novel.read.event.BookArticleEvent -import com.novel.read.event.DeleteBookSignEvent -import com.novel.read.event.ErrorChapterEvent -import com.novel.read.event.FinishChapterEvent -import com.novel.read.event.GetBookDetailEvent -import com.novel.read.event.GetBookSignEvent -import com.novel.read.event.GetCategoryTypeEvent -import com.novel.read.event.GetRecommendBookEvent -import com.novel.read.event.HotSearchEvent -import com.novel.read.event.LoginEvent -import com.novel.read.event.SearchListEvent -import com.novel.read.event.VersionEvent -import com.novel.read.http.service.AccountService -import com.novel.read.model.db.ChapterInfoBean -import com.novel.read.model.db.dbManage.BookRepository -import com.novel.read.model.protocol.BookDetailResp -import com.novel.read.model.protocol.RankByUpdateResp -import com.novel.read.model.protocol.RecommendListResp -import com.novel.read.utlis.PhoneUtils -import com.novel.read.widget.page.TxtChapter - -import org.reactivestreams.Subscriber -import org.reactivestreams.Subscription - -import java.util.ArrayDeque -import java.util.ArrayList -import java.util.HashMap - -import io.reactivex.Single -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.schedulers.Schedulers -import okhttp3.MediaType -import okhttp3.RequestBody -import retrofit2.Callback - -/** - * Created by zlj on 2017/2/14. - */ - -class AccountManager private constructor() { - - private val accountService: AccountService = - ServiceGenerator.createService(AccountService::class.java, MyRequestType.URL_TEXT) - - private var mChapterSub: Subscription? = null - - fun getRecommendBook(bookId: String, limit: String) { - val map = HashMap() - map["book_id"] = bookId - val call = accountService.getRecommendBook(getUrlString(Urls.getRecommend, map)) - call.enqueue(ServiceCallback(GetRecommendBookEvent::class.java)) - } - - fun getBookDetail(bookId: String) { - val map = HashMap() - map["book_id"] = bookId - val call = accountService.getBookDetail(getUrlString(Urls.getBookDetail, map)) - call.enqueue(ServiceCallback(GetBookDetailEvent::class.java)) - } - - fun getBookDetails(bookId: String): Single { //rxjava 获取多书籍详情 合并请求调用 - val map = HashMap() - map["book_id"] = bookId - return accountService.getBookDetails(getUrlString(Urls.getBookDetail, map)) - } - - fun getCategoryType() { - val map = HashMap() - val call = accountService.getCategoryType(getUrlString(Urls.getCategoryType, map)) - call.enqueue(ServiceCallback(GetCategoryTypeEvent::class.java)) - } - - fun getHotSearch() { - val map = HashMap() - val call = accountService.getHotSearch(getUrlString(Urls.getHotSearch, map)) - call.enqueue(ServiceCallback(HotSearchEvent::class.java)) - } - - fun getBookArticle(bookId: String, hasContent: String="2", page: String="1", limit: String="100000") { - val map = HashMap() - map["book_id"] = bookId - map["has_content"] = hasContent - map["page"] = page - map["limit"] = limit - val call = accountService.getBookArticle(getUrlString(Urls.getBookArticle, map)) - call.enqueue(ServiceCallback(BookArticleEvent::class.java)) - } - - - fun getSearchBookList(category_id: String, key: String, page: Int) { - val map = HashMap() - if (!TextUtils.isEmpty(category_id)) { - map["category_id"] = category_id - } else { - map["category_id"] = "0" - } - if (!TextUtils.isEmpty(key)) { - map["key"] = key - } - map["page"] = page.toString() - val call = accountService.getSearchList(getUrlString(Urls.getBookList, map)) - call.enqueue(ServiceCallback(SearchListEvent::class.java)) - } - - fun getRecommendList(listType: String, callback: Callback) { - val map = HashMap() - map["type"] = listType - val call = accountService.getRecommendList(getUrlString(Urls.getRecommendList, map)) - call.enqueue(callback) - - } - - fun getRankByUpdate(page: Int, limit: Int, callback: Callback) { - val map = HashMap() - if (!TextUtils.isEmpty(page.toString())) { - map["page"] = page.toString() - } - if (limit != 0) { - map["limit"] = limit.toString() - } - val call = accountService.getRankByUpdate(getUrlString(Urls.getRankByUpdate, map)) - call.enqueue(callback) - } - - fun getRankList( - type: String, - sex: String, - dateType: String, - page: String, - callback: Callback - ) { - val map = HashMap() - map["type"] = type - map["gender"] = sex - map["date_type"] = dateType - map["page"] = page - val call = accountService.getRankList(getUrlString(Urls.getRankList, map)) - call.enqueue(callback) - } - - fun checkVersion(versionCode: Int) { - val map = HashMap() - map["version"] = versionCode.toString() - // map.put("shell", Constant.shell); - val call = accountService.checkVersion(getUrlString(Urls.checkVersion, map)) - call.enqueue(ServiceCallback(VersionEvent::class.java)) - } - - fun addSign(bookId: String, articleId: String, content: String) { - val map = HashMap() - map["book_id"] = bookId - map["article_id"] = articleId - map["content"] = content - val call = accountService.addSign(Urls.addBookSign, mapToBody(map)) - call.enqueue(ServiceCallback(AddBookSignEvent::class.java)) - } - - fun deleteSign(signIds: String) { - val map = HashMap() - map["sign_ids"] = signIds - val call = accountService.deleteSign(Urls.deleteSign, mapToBody(map)) - call.enqueue(ServiceCallback(DeleteBookSignEvent::class.java)) - } - - fun getSignList(bookId: String) { - val map = HashMap() - map["book_id"] = bookId - val call = accountService.getSignList(getUrlString(Urls.getBookSign, map)) - call.enqueue(ServiceCallback(GetBookSignEvent::class.java)) - } - - fun login(mContext: Context) { - val map = HashMap() - Log.e("getUniquePsuedoID", "login: " + PhoneUtils.uniquePsuedoID) - map["code"] = PhoneUtils.uniquePsuedoID - val call = accountService.login(Urls.login, mapToBody(map)) - call.enqueue(ServiceCallback(LoginEvent::class.java)) - } - - fun getBookArticleDetail(bookId: String?, bookChapters: List) { - val size = bookChapters.size - //取消上次的任务,防止多次加载 - if (mChapterSub != null) { - mChapterSub!!.cancel() - } - val chapterInfos = ArrayList>(bookChapters.size) - val titles = ArrayDeque(bookChapters.size) - - // 将要下载章节,转换成网络请求。 - for (i in 0 until size) { - val bookChapter = bookChapters[i] - // 网络中获取数据 - val chapterInfoSingle = getChapterInfo(bookChapter.chapterId) - chapterInfos.add(chapterInfoSingle) - titles.add(bookChapter.title) - } - - Single.concat(chapterInfos) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Subscriber { - internal var title = titles.poll() - - override fun onSubscribe(s: Subscription) { - s.request(Integer.MAX_VALUE.toLong()) - mChapterSub = s - } - - override fun onNext(chapterInfoBean: ChapterInfoBean) { - //存储数据 - BookRepository.getInstance().saveChapterInfo( - bookId, title, chapterInfoBean.body - ) - EventManager.instance.postEvent(FinishChapterEvent()) - //将获取到的数据进行存储 - title = titles.poll() - } - - override fun onError(t: Throwable) { - //只有第一个加载失败才会调用errorChapter - if (bookChapters[0].title == title) { - EventManager.instance.postEvent(ErrorChapterEvent()) - } - } - - override fun onComplete() {} - } - ) - } - - /** - * 注意这里用的是同步请求 - */ - fun getChapterInfo(id: String): Single { - val map = HashMap() - map["article_id"] = id - return accountService.getBookArticleDetail(getUrlString(Urls.getDetail, map)) - .map { bean -> bean.article?.get(0) } - } - - /** - * get方法拼接字符串 - */ - private fun getUrlString(path: String, query: HashMap?): String { - var mypath = path - if (query != null && query.size > 0) { - val pathWithQuery = StringBuilder(path) - if (!path.contains("?")) { - pathWithQuery.append("?") - } else { - pathWithQuery.append("&") - } - - for (stringStringEntry in query.entries) { - val key = (stringStringEntry as Map.Entry<*, *>).key as String - val `val` = (stringStringEntry as Map.Entry<*, *>).value as String - pathWithQuery.append(key) - pathWithQuery.append("=") - pathWithQuery.append(`val`) - pathWithQuery.append("&") - } - - pathWithQuery.deleteCharAt(pathWithQuery.length - 1) - mypath = pathWithQuery.toString() - } - - return mypath - } - - /** - * 减少请求info类的数量,直接用map替代实体类,返回body - */ - private fun mapToBody(map: HashMap): RequestBody { - return RequestBody.create( - MediaType.parse("application/json; charset=utf-8"), - ServiceGenerator.formatResponse(map) - ) - } - - companion object { - - private var instance: AccountManager? = null - - @Synchronized - fun getInstance(): AccountManager { - if (instance == null) { - instance = AccountManager() - } - return instance as AccountManager - } - } - -} diff --git a/app/src/main/java/com/novel/read/http/CommonHeadersInterceptor.kt b/app/src/main/java/com/novel/read/http/CommonHeadersInterceptor.kt deleted file mode 100644 index a29d6d2..0000000 --- a/app/src/main/java/com/novel/read/http/CommonHeadersInterceptor.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.novel.read.http - -import com.common_lib.base.utils.SecurityUtils -import com.novel.read.constants.Constant -import com.novel.read.utlis.SpUtil - -import java.io.IOException - -import okhttp3.Interceptor -import okhttp3.Request -import okhttp3.Response - -/** - * Created by zlj on 2019/3/1. - */ -class CommonHeadersInterceptor : Interceptor { - - @Throws(IOException::class) - override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request() - val builder = request.newBuilder() - - val authKey = "Android" - val timeStamp = (System.currentTimeMillis() / 1000).toString() - val uid = SpUtil.getStringValue(Constant.Uid, "1") - builder.addHeader("Content-Type", "application/json") - builder.addHeader("UID", uid) - builder.addHeader("AUTHKEY", authKey) - builder.addHeader("TIMESTAMP", timeStamp) - - builder.addHeader("SIGN", SecurityUtils.getInstance().MD5Decode(authKey + timeStamp).toUpperCase()) - - return chain.proceed(builder.build()) - } -} diff --git a/app/src/main/java/com/novel/read/http/ServiceGenerator.kt b/app/src/main/java/com/novel/read/http/ServiceGenerator.kt deleted file mode 100644 index b17c361..0000000 --- a/app/src/main/java/com/novel/read/http/ServiceGenerator.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.novel.read.http - -import com.google.gson.GsonBuilder -import com.mango.mangolib.http.GsonUTCdateAdapter -import com.mango.mangolib.http.MyRequestType -import com.mango.mangolib.http.ResponseConverterFactory - -import java.util.Date -import java.util.concurrent.TimeUnit - -import okhttp3.OkHttpClient -import retrofit2.Retrofit -import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory -import retrofit2.converter.gson.GsonConverterFactory - - -object ServiceGenerator { - private const val API_BASE_URL_TEXT = "http://novel.duoduvip.com/" - - private val gson = GsonBuilder() - .setPrettyPrinting() - .registerTypeAdapter(Date::class.java, GsonUTCdateAdapter()).create() - - - private val builderTEXT = Retrofit.Builder() - .baseUrl(API_BASE_URL_TEXT) - .client(okHttp) - .addConverterFactory(ResponseConverterFactory.create()) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .addConverterFactory(GsonConverterFactory.create(gson)) - - private val okHttp: OkHttpClient - get() = OkHttpClient() - .newBuilder() - .addInterceptor(CommonHeadersInterceptor()) - .connectTimeout(15, TimeUnit.SECONDS) - .writeTimeout(15, TimeUnit.SECONDS) - .readTimeout(15, TimeUnit.SECONDS) - .build() - - fun createService(serviceClass: Class, type: MyRequestType): S { - val retrofit = builderTEXT.build() - return retrofit.create(serviceClass) - } - - fun formatResponse(obj: Any): String { - return gson.toJson(obj) - } -} diff --git a/app/src/main/java/com/novel/read/http/Urls.kt b/app/src/main/java/com/novel/read/http/Urls.kt deleted file mode 100644 index eb0731d..0000000 --- a/app/src/main/java/com/novel/read/http/Urls.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.novel.read.http - -/** - * create by zlj on 2019/10/14 - * describe: - */ - -object Urls { - - internal const val getRecommend = "api/book/getRecommendByBook/" //获取推荐书籍 - internal const val getBookDetail = "api/book/getBookDetail/" //获取书籍详情 - internal const val getCategoryType = "api/category/getCategoryList/" //获取小说分类 - internal const val getHotSearch = "api/search/getHotSearch/" //获取热搜墙 - internal const val getBookArticle = "api/book/getBookArticle/" //获取书籍章节 - - internal const val getBookList = "api/book/getBookList/" //获取和搜索书籍列表 - internal const val getRecommendList = "api/rank/getRecommendList/" //获取推荐列表 - internal const val getRankByUpdate = "api/rank/getRankByUpdate/" //最新更新 - internal const val getRankList = "api/rank/getRankList/" //获取排行榜 - internal const val checkVersion = "api/version/checkVersion/" //检测新版本 - internal const val addBookSign = "api/sign/addBookSign/" //添加书签 - internal const val getBookSign = "api/sign/getBookSignList/" //获取书签 - internal const val deleteSign = "api/sign/deleteSign/" //获取书签 - - internal const val login = "api/login/checkLogin"//登录 - - internal const val getDetail = "api/book/getArticleDetail"//获取章节详情 - -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/http/service/AccountService.kt b/app/src/main/java/com/novel/read/http/service/AccountService.kt deleted file mode 100644 index 0aa9754..0000000 --- a/app/src/main/java/com/novel/read/http/service/AccountService.kt +++ /dev/null @@ -1,94 +0,0 @@ -package com.novel.read.http.service - -import com.mango.mangolib.http.ErrorResponse -import com.novel.read.model.protocol.BookArticleResp -import com.novel.read.model.protocol.BookDetailResp -import com.novel.read.model.protocol.CategoryTypeResp -import com.novel.read.model.protocol.ChapterInfoPackage -import com.novel.read.model.protocol.HotSearchResp -import com.novel.read.model.protocol.MarkResp -import com.novel.read.model.protocol.RankByUpdateResp -import com.novel.read.model.protocol.RecommendBookResp -import com.novel.read.model.protocol.RecommendListResp -import com.novel.read.model.protocol.SearchResp -import com.novel.read.model.protocol.UidResp -import com.novel.read.model.protocol.VersionResp - -import io.reactivex.Single -import okhttp3.RequestBody -import retrofit2.Call -import retrofit2.http.Body -import retrofit2.http.GET -import retrofit2.http.POST -import retrofit2.http.Url - -/** - * Created by Administrator on 2017/2/14. - */ - -interface AccountService { - - //获取推荐书籍 - @GET - fun getRecommendBook(@Url url: String): Call - - //获取书籍详情 - @GET - fun getBookDetail(@Url url: String): Call - - //获取书籍详情 - @GET - fun getBookDetails(@Url url: String): Single - - //小说类型 - @GET - fun getCategoryType(@Url url: String): Call - - //热搜 - @GET - fun getHotSearch(@Url url: String): Call - - //书籍章节 - @GET - fun getBookArticle(@Url url: String): Call - - //搜索 - @GET - fun getSearchList(@Url url: String): Call - - //获取推荐 - @GET - fun getRecommendList(@Url url: String): Call - - //获取最新排行 - @GET - fun getRankByUpdate(@Url url: String): Call - - //获取排行 - @GET - fun getRankList(@Url url: String): Call - - //获取新版本 - @GET - fun checkVersion(@Url url: String): Call - - //添加标签 - @POST - fun addSign(@Url url: String, @Body body: RequestBody): Call - - //删除标签 - @POST - fun deleteSign(@Url url: String, @Body body: RequestBody): Call - - //获取标签 - @GET - fun getSignList(@Url url: String): Call - - //登录 - @POST - fun login(@Url url: String, @Body body: RequestBody): Call - - //获取书籍章节详情 - @GET - fun getBookArticleDetail(@Url url: String): Single -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/inter/OnLoadMoreListener.kt b/app/src/main/java/com/novel/read/inter/OnLoadMoreListener.kt deleted file mode 100644 index aa211fa..0000000 --- a/app/src/main/java/com/novel/read/inter/OnLoadMoreListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.novel.read.inter - -/** - * create by zlj on 2019/10/14 - * describe: - */ -interface OnLoadMoreListener { - fun onLoadMore() -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/lib/ATH.kt b/app/src/main/java/com/novel/read/lib/ATH.kt new file mode 100644 index 0000000..36b0536 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/ATH.kt @@ -0,0 +1,254 @@ +package com.novel.read.lib + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.ActivityManager +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.os.Build +import android.view.View +import android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR +import android.view.Window +import android.widget.EdgeEffect +import android.widget.ScrollView +import androidx.annotation.ColorInt +import androidx.appcompat.app.AlertDialog +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager.widget.ViewPager +import com.google.android.material.bottomnavigation.BottomNavigationView +import com.novel.read.App +import com.novel.read.R +import com.novel.read.help.AppConfig +import com.novel.read.help.TintHelper +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.activity_main.view.* +import org.jetbrains.anko.backgroundColor + + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +@Suppress("unused", "MemberVisibilityCanBePrivate") +object ATH { + + @SuppressLint("CommitPrefEdits") + fun didThemeValuesChange(context: Context, since: Long): Boolean { + return ThemeStore.isConfigured(context) && ThemeStore.prefs(context).getLong( + ThemeStorePrefKeys.VALUES_CHANGED, + -1 + ) > since + } + + fun setStatusBarColorAuto(activity: Activity, fullScreen: Boolean) { + val isTransparentStatusBar = AppConfig.isTransparentStatusBar + setStatusBarColor( + activity, + ThemeStore.statusBarColor(activity, isTransparentStatusBar), + isTransparentStatusBar, fullScreen + ) + } + + fun setStatusBarColor( + activity: Activity, + color: Int, + isTransparentStatusBar: Boolean, + fullScreen: Boolean + ) { + if (fullScreen) { + if (isTransparentStatusBar) { + activity.window.statusBarColor = Color.TRANSPARENT + } else { + activity.window.statusBarColor = activity.getCompatColor(R.color.status_bar_bag) + } + } else { + activity.window.statusBarColor = color + } + setLightStatusBarAuto(activity.window, color) + } + + fun setLightStatusBarAuto(window: Window, bgColor: Int) { + setLightStatusBar(window, ColorUtils.isColorLight(bgColor)) + } + + fun setLightStatusBar(window: Window, enabled: Boolean) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val decorView = window.decorView + val systemUiVisibility = decorView.systemUiVisibility + if (enabled) { + decorView.systemUiVisibility = + systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + } else { + decorView.systemUiVisibility = + systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() + } + } + } + + fun setLightNavigationBar(activity: Activity, enabled: Boolean) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val decorView = activity.window.decorView + var systemUiVisibility = decorView.systemUiVisibility + systemUiVisibility = if (enabled) { + systemUiVisibility or SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR + } else { + systemUiVisibility and SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() + } + decorView.systemUiVisibility = systemUiVisibility + } + } + + fun setNavigationBarColorAuto( + activity: Activity, + color: Int = ThemeStore.navigationBarColor(activity) + ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.window.navigationBarColor = color + setLightNavigationBar(activity, ColorUtils.isColorLight(color)) + } + } + + fun setTaskDescriptionColorAuto(activity: Activity) { + setTaskDescriptionColor(activity, ThemeStore.primaryColor(activity)) + } + + fun setTaskDescriptionColor(activity: Activity, @ColorInt color: Int) { + val color1: Int + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + color1 = ColorUtils.stripAlpha(color) + @Suppress("DEPRECATION") + activity.setTaskDescription( + ActivityManager.TaskDescription( + activity.title as String, + null, + color1 + ) + ) + } + } + + fun setTint( + view: View, + @ColorInt color: Int, + isDark: Boolean = AppConfig.isNightTheme(view.context) + ) { + TintHelper.setTintAuto(view, color, false, isDark) + } + + fun setBackgroundTint( + view: View, @ColorInt color: Int, + isDark: Boolean = AppConfig.isNightTheme + ) { + TintHelper.setTintAuto(view, color, true, isDark) + } + + fun setAlertDialogTint(dialog: AlertDialog): AlertDialog { + dialog.window?.setBackgroundDrawable(getDialogBackground()) + val colorStateList = Selector.colorBuild() + .setDefaultColor(ThemeStore.accentColor(dialog.context)) + .setPressedColor(ColorUtils.darkenColor(ThemeStore.accentColor(dialog.context))) + .create() + if (dialog.getButton(AlertDialog.BUTTON_NEGATIVE) != null) { + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(colorStateList) + } + if (dialog.getButton(AlertDialog.BUTTON_POSITIVE) != null) { + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(colorStateList) + } + if (dialog.getButton(AlertDialog.BUTTON_NEUTRAL) != null) { + dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(colorStateList) + } + return dialog + } + + fun setEdgeEffectColor(view: RecyclerView?, @ColorInt color: Int) { + view?.edgeEffectFactory = object : RecyclerView.EdgeEffectFactory() { + override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect { + val edgeEffect = super.createEdgeEffect(view, direction) + edgeEffect.color = color + return edgeEffect + } + } + } + + fun setEdgeEffectColor(viewPager: ViewPager?, @ColorInt color: Int) { + try { + val clazz = ViewPager::class.java + for (name in arrayOf("mLeftEdge", "mRightEdge")) { + val field = clazz.getDeclaredField(name) + field.isAccessible = true + val edge = field.get(viewPager) + (edge as EdgeEffect).color = color + } + } catch (ignored: Exception) { + } + } + + fun setEdgeEffectColor(scrollView: ScrollView?, @ColorInt color: Int) { + try { + val clazz = ScrollView::class.java + for (name in arrayOf("mEdgeGlowTop", "mEdgeGlowBottom")) { + val field = clazz.getDeclaredField(name) + field.isAccessible = true + val edge = field.get(scrollView) + (edge as EdgeEffect).color = color + } + } catch (ignored: Exception) { + } + } + + //**************************************************************Directly*************************************************************// + + fun applyBottomNavigationColor(bottomBar: BottomNavigationView) { + bottomBar.apply { + val bgColor = context.bottomBackground + setBackgroundColor(bgColor) + val textIsDark = ColorUtils.isColorLight(bgColor) + val textColor = context.getSecondaryTextColor(textIsDark) + val colorStateList = Selector.colorBuild() + .setDefaultColor(textColor) + .setSelectedColor(ThemeStore.accentColor(bottom_navigation_view.context)).create() + itemIconTintList = colorStateList + itemTextColor = colorStateList + } + } + + fun applyAccentTint(view: View?) { + view?.apply { + setTint(this, context.accentColor) + } + } + + fun applyBackgroundTint(view: View?) { + view?.apply { + if (background == null) { + backgroundColor = context.backgroundColor + } else { + setBackgroundTint(this, context.backgroundColor) + } + } + } + + fun applyEdgeEffectColor(view: View?) { + when (view) { + is RecyclerView -> view.edgeEffectFactory = DEFAULT_EFFECT_FACTORY + is ViewPager -> setEdgeEffectColor(view, ThemeStore.primaryColor(view.context)) + is ScrollView -> setEdgeEffectColor(view, ThemeStore.primaryColor(view.context)) + } + } + + fun getDialogBackground(): GradientDrawable { + val background = GradientDrawable() + background.cornerRadius = 3F.dp + background.setColor(App.INSTANCE.backgroundColor) + return background + } + + private val DEFAULT_EFFECT_FACTORY = object : RecyclerView.EdgeEffectFactory() { + override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect { + val edgeEffect = super.createEdgeEffect(view, direction) + edgeEffect.color = ThemeStore.primaryColor(view.context) + return edgeEffect + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/lib/ATHUtils.kt b/app/src/main/java/com/novel/read/lib/ATHUtils.kt new file mode 100644 index 0000000..35171bb --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/ATHUtils.kt @@ -0,0 +1,34 @@ +package com.novel.read.lib + +import android.content.Context +import androidx.annotation.AttrRes + +/** + * @author Aidan Follestad (afollestad) + */ +object ATHUtils { + + @JvmOverloads + fun resolveColor(context: Context, @AttrRes attr: Int, fallback: Int = 0): Int { + val a = context.theme.obtainStyledAttributes(intArrayOf(attr)) + return try { + a.getColor(0, fallback) + } catch (e: Exception) { + fallback + } finally { + a.recycle() + } + } + + @JvmOverloads + fun resolveFloat(context: Context, @AttrRes attr: Int, fallback: Float = 0.0f): Float { + val a = context.theme.obtainStyledAttributes(intArrayOf(attr)) + return try { + a.getFloat(0, fallback) + } catch (e: Exception) { + fallback + } finally { + a.recycle() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/lib/Selector.kt b/app/src/main/java/com/novel/read/lib/Selector.kt new file mode 100644 index 0000000..630f7d2 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/Selector.kt @@ -0,0 +1,445 @@ +package com.novel.read.lib + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.GradientDrawable +import android.graphics.drawable.StateListDrawable +import androidx.annotation.ColorInt +import androidx.annotation.Dimension +import androidx.annotation.DrawableRes +import androidx.annotation.IntDef +import androidx.core.content.ContextCompat + +@Suppress("unused") +object Selector { + fun shapeBuild(): ShapeSelector { + return ShapeSelector() + } + + fun colorBuild(): ColorSelector { + return ColorSelector() + } + + fun drawableBuild(): DrawableSelector { + return DrawableSelector() + } + + /** + * 形状ShapeSelector + * + * @author hjy + * created at 2017/12/11 22:26 + */ + class ShapeSelector { + + private var mShape: Int = 0 //the shape of background + private var mDefaultBgColor: Int = 0 //default background color + private var mDisabledBgColor: Int = 0 //state_enabled = false + private var mPressedBgColor: Int = 0 //state_pressed = true + private var mSelectedBgColor: Int = 0 //state_selected = true + private var mFocusedBgColor: Int = 0 //state_focused = true + private var mCheckedBgColor: Int = 0 //state_checked = true + private var mStrokeWidth: Int = 0 //stroke width in pixel + private var mDefaultStrokeColor: Int = 0 //default stroke color + private var mDisabledStrokeColor: Int = 0 //state_enabled = false + private var mPressedStrokeColor: Int = 0 //state_pressed = true + private var mSelectedStrokeColor: Int = 0 //state_selected = true + private var mFocusedStrokeColor: Int = 0 //state_focused = true + private var mCheckedStrokeColor: Int = 0 //state_checked = true + private var mCornerRadius: Int = 0 //corner radius + + private var hasSetDisabledBgColor = false + private var hasSetPressedBgColor = false + private var hasSetSelectedBgColor = false + private val hasSetFocusedBgColor = false + private var hasSetCheckedBgColor = false + + private var hasSetDisabledStrokeColor = false + private var hasSetPressedStrokeColor = false + private var hasSetSelectedStrokeColor = false + private var hasSetFocusedStrokeColor = false + private var hasSetCheckedStrokeColor = false + + @IntDef(GradientDrawable.RECTANGLE, GradientDrawable.OVAL, GradientDrawable.LINE, GradientDrawable.RING) + private annotation class Shape + + init { + //initialize default values + mShape = GradientDrawable.RECTANGLE + mDefaultBgColor = Color.TRANSPARENT + mDisabledBgColor = Color.TRANSPARENT + mPressedBgColor = Color.TRANSPARENT + mSelectedBgColor = Color.TRANSPARENT + mFocusedBgColor = Color.TRANSPARENT + mStrokeWidth = 0 + mDefaultStrokeColor = Color.TRANSPARENT + mDisabledStrokeColor = Color.TRANSPARENT + mPressedStrokeColor = Color.TRANSPARENT + mSelectedStrokeColor = Color.TRANSPARENT + mFocusedStrokeColor = Color.TRANSPARENT + mCornerRadius = 0 + } + + fun setShape(@Shape shape: Int): ShapeSelector { + mShape = shape + return this + } + + fun setDefaultBgColor(@ColorInt color: Int): ShapeSelector { + mDefaultBgColor = color + if (!hasSetDisabledBgColor) + mDisabledBgColor = color + if (!hasSetPressedBgColor) + mPressedBgColor = color + if (!hasSetSelectedBgColor) + mSelectedBgColor = color + if (!hasSetFocusedBgColor) + mFocusedBgColor = color + return this + } + + fun setDisabledBgColor(@ColorInt color: Int): ShapeSelector { + mDisabledBgColor = color + hasSetDisabledBgColor = true + return this + } + + fun setPressedBgColor(@ColorInt color: Int): ShapeSelector { + mPressedBgColor = color + hasSetPressedBgColor = true + return this + } + + fun setSelectedBgColor(@ColorInt color: Int): ShapeSelector { + mSelectedBgColor = color + hasSetSelectedBgColor = true + return this + } + + fun setFocusedBgColor(@ColorInt color: Int): ShapeSelector { + mFocusedBgColor = color + hasSetPressedBgColor = true + return this + } + + fun setCheckedBgColor(@ColorInt color: Int): ShapeSelector { + mCheckedBgColor = color + hasSetCheckedBgColor = true + return this + } + + fun setStrokeWidth(@Dimension width: Int): ShapeSelector { + mStrokeWidth = width + return this + } + + fun setDefaultStrokeColor(@ColorInt color: Int): ShapeSelector { + mDefaultStrokeColor = color + if (!hasSetDisabledStrokeColor) + mDisabledStrokeColor = color + if (!hasSetPressedStrokeColor) + mPressedStrokeColor = color + if (!hasSetSelectedStrokeColor) + mSelectedStrokeColor = color + if (!hasSetFocusedStrokeColor) + mFocusedStrokeColor = color + return this + } + + fun setDisabledStrokeColor(@ColorInt color: Int): ShapeSelector { + mDisabledStrokeColor = color + hasSetDisabledStrokeColor = true + return this + } + + fun setPressedStrokeColor(@ColorInt color: Int): ShapeSelector { + mPressedStrokeColor = color + hasSetPressedStrokeColor = true + return this + } + + fun setSelectedStrokeColor(@ColorInt color: Int): ShapeSelector { + mSelectedStrokeColor = color + hasSetSelectedStrokeColor = true + return this + } + + fun setCheckedStrokeColor(@ColorInt color: Int): ShapeSelector { + mCheckedStrokeColor = color + hasSetCheckedStrokeColor = true + return this + } + + fun setFocusedStrokeColor(@ColorInt color: Int): ShapeSelector { + mFocusedStrokeColor = color + hasSetFocusedStrokeColor = true + return this + } + + fun setCornerRadius(@Dimension radius: Int): ShapeSelector { + mCornerRadius = radius + return this + } + + fun create(): StateListDrawable { + val selector = StateListDrawable() + + //enabled = false + if (hasSetDisabledBgColor || hasSetDisabledStrokeColor) { + val disabledShape = getItemShape( + mShape, mCornerRadius, + mDisabledBgColor, mStrokeWidth, mDisabledStrokeColor + ) + selector.addState(intArrayOf(-android.R.attr.state_enabled), disabledShape) + } + + //pressed = true + if (hasSetPressedBgColor || hasSetPressedStrokeColor) { + val pressedShape = getItemShape( + mShape, mCornerRadius, + mPressedBgColor, mStrokeWidth, mPressedStrokeColor + ) + selector.addState(intArrayOf(android.R.attr.state_pressed), pressedShape) + } + + //selected = true + if (hasSetSelectedBgColor || hasSetSelectedStrokeColor) { + val selectedShape = getItemShape( + mShape, mCornerRadius, + mSelectedBgColor, mStrokeWidth, mSelectedStrokeColor + ) + selector.addState(intArrayOf(android.R.attr.state_selected), selectedShape) + } + + //focused = true + if (hasSetFocusedBgColor || hasSetFocusedStrokeColor) { + val focusedShape = getItemShape( + mShape, mCornerRadius, + mFocusedBgColor, mStrokeWidth, mFocusedStrokeColor + ) + selector.addState(intArrayOf(android.R.attr.state_focused), focusedShape) + } + + //checked = true + if (hasSetCheckedBgColor || hasSetCheckedStrokeColor) { + val checkedShape = getItemShape( + mShape, mCornerRadius, + mCheckedBgColor, mStrokeWidth, mCheckedStrokeColor + ) + selector.addState(intArrayOf(android.R.attr.state_checked), checkedShape) + } + + //default + val defaultShape = getItemShape( + mShape, mCornerRadius, + mDefaultBgColor, mStrokeWidth, mDefaultStrokeColor + ) + selector.addState(intArrayOf(), defaultShape) + + return selector + } + + private fun getItemShape( + shape: Int, cornerRadius: Int, + solidColor: Int, strokeWidth: Int, strokeColor: Int + ): GradientDrawable { + val drawable = GradientDrawable() + drawable.shape = shape + drawable.setStroke(strokeWidth, strokeColor) + drawable.cornerRadius = cornerRadius.toFloat() + drawable.setColor(solidColor) + return drawable + } + } + + /** + * 资源DrawableSelector + * + * @author hjy + * created at 2017/12/11 22:34 + */ + @Suppress("MemberVisibilityCanBePrivate") + class DrawableSelector { + + private var mDefaultDrawable: Drawable? = null + private var mDisabledDrawable: Drawable? = null + private var mPressedDrawable: Drawable? = null + private var mSelectedDrawable: Drawable? = null + private var mFocusedDrawable: Drawable? = null + + private var hasSetDisabledDrawable = false + private var hasSetPressedDrawable = false + private var hasSetSelectedDrawable = false + private var hasSetFocusedDrawable = false + + init { + mDefaultDrawable = ColorDrawable(Color.TRANSPARENT) + } + + fun setDefaultDrawable(drawable: Drawable?): DrawableSelector { + mDefaultDrawable = drawable + if (!hasSetDisabledDrawable) + mDisabledDrawable = drawable + if (!hasSetPressedDrawable) + mPressedDrawable = drawable + if (!hasSetSelectedDrawable) + mSelectedDrawable = drawable + if (!hasSetFocusedDrawable) + mFocusedDrawable = drawable + return this + } + + fun setDisabledDrawable(drawable: Drawable?): DrawableSelector { + mDisabledDrawable = drawable + hasSetDisabledDrawable = true + return this + } + + fun setPressedDrawable(drawable: Drawable?): DrawableSelector { + mPressedDrawable = drawable + hasSetPressedDrawable = true + return this + } + + fun setSelectedDrawable(drawable: Drawable?): DrawableSelector { + mSelectedDrawable = drawable + hasSetSelectedDrawable = true + return this + } + + fun setFocusedDrawable(drawable: Drawable?): DrawableSelector { + mFocusedDrawable = drawable + hasSetFocusedDrawable = true + return this + } + + fun create(): StateListDrawable { + val selector = StateListDrawable() + if (hasSetDisabledDrawable) + selector.addState(intArrayOf(-android.R.attr.state_enabled), mDisabledDrawable) + if (hasSetPressedDrawable) + selector.addState(intArrayOf(android.R.attr.state_pressed), mPressedDrawable) + if (hasSetSelectedDrawable) + selector.addState(intArrayOf(android.R.attr.state_selected), mSelectedDrawable) + if (hasSetFocusedDrawable) + selector.addState(intArrayOf(android.R.attr.state_focused), mFocusedDrawable) + selector.addState(intArrayOf(), mDefaultDrawable) + return selector + } + + fun setDefaultDrawable(context: Context, @DrawableRes drawableRes: Int): DrawableSelector { + return setDefaultDrawable(ContextCompat.getDrawable(context, drawableRes)) + } + + fun setDisabledDrawable(context: Context, @DrawableRes drawableRes: Int): DrawableSelector { + return setDisabledDrawable(ContextCompat.getDrawable(context, drawableRes)) + } + + fun setPressedDrawable(context: Context, @DrawableRes drawableRes: Int): DrawableSelector { + return setPressedDrawable(ContextCompat.getDrawable(context, drawableRes)) + } + + fun setSelectedDrawable(context: Context, @DrawableRes drawableRes: Int): DrawableSelector { + return setSelectedDrawable(ContextCompat.getDrawable(context, drawableRes)) + } + + fun setFocusedDrawable(context: Context, @DrawableRes drawableRes: Int): DrawableSelector { + return setFocusedDrawable(ContextCompat.getDrawable(context, drawableRes)) + } + } + + /** + * 颜色ColorSelector + * + * @author hjy + * created at 2017/12/11 22:26 + */ + class ColorSelector { + + private var mDefaultColor: Int = 0 + private var mDisabledColor: Int = 0 + private var mPressedColor: Int = 0 + private var mSelectedColor: Int = 0 + private var mFocusedColor: Int = 0 + private var mCheckedColor: Int = 0 + + private var hasSetDisabledColor = false + private var hasSetPressedColor = false + private var hasSetSelectedColor = false + private var hasSetFocusedColor = false + private var hasSetCheckedColor = false + + init { + mDefaultColor = Color.BLACK + mDisabledColor = Color.GRAY + mPressedColor = Color.BLACK + mSelectedColor = Color.BLACK + mFocusedColor = Color.BLACK + } + + fun setDefaultColor(@ColorInt color: Int): ColorSelector { + mDefaultColor = color + if (!hasSetDisabledColor) + mDisabledColor = color + if (!hasSetPressedColor) + mPressedColor = color + if (!hasSetSelectedColor) + mSelectedColor = color + if (!hasSetFocusedColor) + mFocusedColor = color + return this + } + + fun setDisabledColor(@ColorInt color: Int): ColorSelector { + mDisabledColor = color + hasSetDisabledColor = true + return this + } + + fun setPressedColor(@ColorInt color: Int): ColorSelector { + mPressedColor = color + hasSetPressedColor = true + return this + } + + fun setSelectedColor(@ColorInt color: Int): ColorSelector { + mSelectedColor = color + hasSetSelectedColor = true + return this + } + + fun setFocusedColor(@ColorInt color: Int): ColorSelector { + mFocusedColor = color + hasSetFocusedColor = true + return this + } + + fun setCheckedColor(@ColorInt color: Int): ColorSelector { + mCheckedColor = color + hasSetCheckedColor = true + return this + } + + fun create(): ColorStateList { + val colors = intArrayOf( + if (hasSetDisabledColor) mDisabledColor else mDefaultColor, + if (hasSetPressedColor) mPressedColor else mDefaultColor, + if (hasSetSelectedColor) mSelectedColor else mDefaultColor, + if (hasSetFocusedColor) mFocusedColor else mDefaultColor, + if (hasSetCheckedColor) mCheckedColor else mDefaultColor, + mDefaultColor + ) + val states = arrayOfNulls(6) + states[0] = intArrayOf(-android.R.attr.state_enabled) + states[1] = intArrayOf(android.R.attr.state_pressed) + states[2] = intArrayOf(android.R.attr.state_selected) + states[3] = intArrayOf(android.R.attr.state_focused) + states[4] = intArrayOf(android.R.attr.state_checked) + states[5] = intArrayOf() + return ColorStateList(states, colors) + } + } +} diff --git a/app/src/main/java/com/novel/read/lib/ThemeStore.kt b/app/src/main/java/com/novel/read/lib/ThemeStore.kt new file mode 100644 index 0000000..4f335df --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/ThemeStore.kt @@ -0,0 +1,359 @@ +package com.novel.read.lib + +import android.annotation.SuppressLint +import android.content.Context +import android.content.SharedPreferences +import android.graphics.Color +import androidx.annotation.AttrRes +import androidx.annotation.CheckResult +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import androidx.core.content.ContextCompat +import com.novel.read.App +import com.novel.read.R +import com.novel.read.utils.ColorUtils +import io.legado.app.lib.theme.ThemeStoreInterface + +/** + * @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid) + */ +@Suppress("unused") +class ThemeStore @SuppressLint("CommitPrefEdits") +private constructor(private val mContext: Context) : ThemeStoreInterface { + private val mEditor: SharedPreferences.Editor + + init { + mEditor = prefs(mContext).edit() + } + + + override fun primaryColor(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_PRIMARY_COLOR, color) + if (autoGeneratePrimaryDark(mContext)) + primaryColorDark(ColorUtils.darkenColor(color)) + return this + } + + override fun primaryColorRes(@ColorRes colorRes: Int): ThemeStore { + return primaryColor(ContextCompat.getColor(mContext, colorRes)) + } + + override fun primaryColorAttr(@AttrRes colorAttr: Int): ThemeStore { + return primaryColor(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun primaryColorDark(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_PRIMARY_COLOR_DARK, color) + return this + } + + override fun primaryColorDarkRes(@ColorRes colorRes: Int): ThemeStore { + return primaryColorDark(ContextCompat.getColor(mContext, colorRes)) + } + + override fun primaryColorDarkAttr(@AttrRes colorAttr: Int): ThemeStore { + return primaryColorDark(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun accentColor(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_ACCENT_COLOR, color) + return this + } + + override fun accentColorRes(@ColorRes colorRes: Int): ThemeStore { + return accentColor(ContextCompat.getColor(mContext, colorRes)) + } + + override fun accentColorAttr(@AttrRes colorAttr: Int): ThemeStore { + return accentColor(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun statusBarColor(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_STATUS_BAR_COLOR, color) + return this + } + + override fun statusBarColorRes(@ColorRes colorRes: Int): ThemeStore { + return statusBarColor(ContextCompat.getColor(mContext, colorRes)) + } + + override fun statusBarColorAttr(@AttrRes colorAttr: Int): ThemeStore { + return statusBarColor(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun navigationBarColor(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_NAVIGATION_BAR_COLOR, color) + return this + } + + override fun navigationBarColorRes(@ColorRes colorRes: Int): ThemeStore { + return navigationBarColor(ContextCompat.getColor(mContext, colorRes)) + } + + override fun navigationBarColorAttr(@AttrRes colorAttr: Int): ThemeStore { + return navigationBarColor(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun textColorPrimary(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_TEXT_COLOR_PRIMARY, color) + return this + } + + override fun textColorPrimaryRes(@ColorRes colorRes: Int): ThemeStore { + return textColorPrimary(ContextCompat.getColor(mContext, colorRes)) + } + + override fun textColorPrimaryAttr(@AttrRes colorAttr: Int): ThemeStore { + return textColorPrimary(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun textColorPrimaryInverse(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_TEXT_COLOR_PRIMARY_INVERSE, color) + return this + } + + override fun textColorPrimaryInverseRes(@ColorRes colorRes: Int): ThemeStore { + return textColorPrimaryInverse(ContextCompat.getColor(mContext, colorRes)) + } + + override fun textColorPrimaryInverseAttr(@AttrRes colorAttr: Int): ThemeStore { + return textColorPrimaryInverse(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun textColorSecondary(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_TEXT_COLOR_SECONDARY, color) + return this + } + + override fun textColorSecondaryRes(@ColorRes colorRes: Int): ThemeStore { + return textColorSecondary(ContextCompat.getColor(mContext, colorRes)) + } + + override fun textColorSecondaryAttr(@AttrRes colorAttr: Int): ThemeStore { + return textColorSecondary(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun textColorSecondaryInverse(@ColorInt color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_TEXT_COLOR_SECONDARY_INVERSE, color) + return this + } + + override fun textColorSecondaryInverseRes(@ColorRes colorRes: Int): ThemeStore { + return textColorSecondaryInverse(ContextCompat.getColor(mContext, colorRes)) + } + + override fun textColorSecondaryInverseAttr(@AttrRes colorAttr: Int): ThemeStore { + return textColorSecondaryInverse(ATHUtils.resolveColor(mContext, colorAttr)) + } + + override fun backgroundColor(color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_BACKGROUND_COLOR, color) + return this + } + + override fun bottomBackground(color: Int): ThemeStore { + mEditor.putInt(ThemeStorePrefKeys.KEY_BOTTOM_BACKGROUND, color) + return this + } + + override fun coloredStatusBar(colored: Boolean): ThemeStore { + mEditor.putBoolean(ThemeStorePrefKeys.KEY_APPLY_PRIMARYDARK_STATUSBAR, colored) + return this + } + + override fun coloredNavigationBar(applyToNavBar: Boolean): ThemeStore { + mEditor.putBoolean(ThemeStorePrefKeys.KEY_APPLY_PRIMARY_NAVBAR, applyToNavBar) + return this + } + + override fun autoGeneratePrimaryDark(autoGenerate: Boolean): ThemeStore { + mEditor.putBoolean(ThemeStorePrefKeys.KEY_AUTO_GENERATE_PRIMARYDARK, autoGenerate) + return this + } + + // Commit method + + override fun apply() { + mEditor.putLong(ThemeStorePrefKeys.VALUES_CHANGED, System.currentTimeMillis()) + .putBoolean(ThemeStorePrefKeys.IS_CONFIGURED_KEY, true) + .apply() + } + + companion object { + + fun editTheme(context: Context): ThemeStore { + return ThemeStore(context) + } + + // Static getters + + @CheckResult + internal fun prefs(context: Context): SharedPreferences { + return context.getSharedPreferences( + ThemeStorePrefKeys.CONFIG_PREFS_KEY_DEFAULT, + Context.MODE_PRIVATE + ) + } + + fun markChanged(context: Context) { + ThemeStore(context).apply() + } + + @CheckResult + @ColorInt + fun primaryColor(context: Context = App.INSTANCE): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_PRIMARY_COLOR, + ATHUtils.resolveColor(context, R.attr.colorPrimary, Color.parseColor("#455A64")) + ) + } + + @CheckResult + @ColorInt + fun primaryColorDark(context: Context): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_PRIMARY_COLOR_DARK, + ATHUtils.resolveColor(context, R.attr.colorPrimaryDark, Color.parseColor("#37474F")) + ) + } + + @CheckResult + @ColorInt + fun accentColor(context: Context = App.INSTANCE): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_ACCENT_COLOR, + ATHUtils.resolveColor(context, R.attr.colorAccent, Color.parseColor("#263238")) + ) + } + + @CheckResult + @ColorInt + fun statusBarColor(context: Context, transparent: Boolean): Int { + return if (!coloredStatusBar(context)) { + Color.BLACK + } else if (transparent) { + prefs(context).getInt( + ThemeStorePrefKeys.KEY_STATUS_BAR_COLOR, + primaryColor(context) + ) + } else { + prefs(context).getInt( + ThemeStorePrefKeys.KEY_STATUS_BAR_COLOR, + primaryColorDark(context) + ) + } + } + + @CheckResult + @ColorInt + fun navigationBarColor(context: Context): Int { + return if (!coloredNavigationBar(context)) { + Color.BLACK + } else prefs(context).getInt( + ThemeStorePrefKeys.KEY_NAVIGATION_BAR_COLOR, + bottomBackground(context) + ) + } + + @CheckResult + @ColorInt + fun textColorPrimary(context: Context): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_TEXT_COLOR_PRIMARY, + ATHUtils.resolveColor(context, android.R.attr.textColorPrimary) + ) + } + + @CheckResult + @ColorInt + fun textColorPrimaryInverse(context: Context): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_TEXT_COLOR_PRIMARY_INVERSE, + ATHUtils.resolveColor(context, android.R.attr.textColorPrimaryInverse) + ) + } + + @CheckResult + @ColorInt + fun textColorSecondary(context: Context): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_TEXT_COLOR_SECONDARY, + ATHUtils.resolveColor(context, android.R.attr.textColorSecondary) + ) + } + + @CheckResult + @ColorInt + fun textColorSecondaryInverse(context: Context): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_TEXT_COLOR_SECONDARY_INVERSE, + ATHUtils.resolveColor(context, android.R.attr.textColorSecondaryInverse) + ) + } + + @CheckResult + @ColorInt + fun backgroundColor(context: Context = App.INSTANCE): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_BACKGROUND_COLOR, + ATHUtils.resolveColor(context, android.R.attr.colorBackground) + ) + } + + @SuppressLint("PrivateResource") + @CheckResult + fun elevation(context: Context): Float { + return prefs(context).getFloat( + ThemeStorePrefKeys.KEY_ELEVATION, + ATHUtils.resolveFloat( + context, + android.R.attr.elevation, + context.resources.getDimension(R.dimen.design_appbar_elevation) + ) + ) + } + + @CheckResult + @ColorInt + fun bottomBackground(context: Context = App.INSTANCE): Int { + return prefs(context).getInt( + ThemeStorePrefKeys.KEY_BOTTOM_BACKGROUND, + ATHUtils.resolveColor(context, android.R.attr.colorBackground) + ) + } + + @CheckResult + fun coloredStatusBar(context: Context): Boolean { + return prefs(context).getBoolean( + ThemeStorePrefKeys.KEY_APPLY_PRIMARYDARK_STATUSBAR, + true + ) + } + + @CheckResult + fun coloredNavigationBar(context: Context): Boolean { + return prefs(context).getBoolean(ThemeStorePrefKeys.KEY_APPLY_PRIMARY_NAVBAR, false) + } + + @CheckResult + fun autoGeneratePrimaryDark(context: Context): Boolean { + return prefs(context).getBoolean(ThemeStorePrefKeys.KEY_AUTO_GENERATE_PRIMARYDARK, true) + } + + @CheckResult + fun isConfigured(context: Context): Boolean { + return prefs(context).getBoolean(ThemeStorePrefKeys.IS_CONFIGURED_KEY, false) + } + + @SuppressLint("CommitPrefEdits") + fun isConfigured(context: Context, version: Int): Boolean { + val prefs = prefs(context) + val lastVersion = prefs.getInt(ThemeStorePrefKeys.IS_CONFIGURED_VERSION_KEY, -1) + if (version > lastVersion) { + prefs.edit().putInt(ThemeStorePrefKeys.IS_CONFIGURED_VERSION_KEY, version).apply() + return false + } + return true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/lib/ThemeStoreInterface.kt b/app/src/main/java/com/novel/read/lib/ThemeStoreInterface.kt new file mode 100644 index 0000000..ce2d6e8 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/ThemeStoreInterface.kt @@ -0,0 +1,97 @@ +package io.legado.app.lib.theme + + +import androidx.annotation.AttrRes +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import com.novel.read.lib.ThemeStore + +/** + * @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid) + */ +internal interface ThemeStoreInterface { + + // Primary colors + + fun primaryColor(@ColorInt color: Int): ThemeStore + + fun primaryColorRes(@ColorRes colorRes: Int): ThemeStore + + fun primaryColorAttr(@AttrRes colorAttr: Int): ThemeStore + + fun autoGeneratePrimaryDark(autoGenerate: Boolean): ThemeStore + + fun primaryColorDark(@ColorInt color: Int): ThemeStore + + fun primaryColorDarkRes(@ColorRes colorRes: Int): ThemeStore + + fun primaryColorDarkAttr(@AttrRes colorAttr: Int): ThemeStore + + // Accent colors + + fun accentColor(@ColorInt color: Int): ThemeStore + + fun accentColorRes(@ColorRes colorRes: Int): ThemeStore + + fun accentColorAttr(@AttrRes colorAttr: Int): ThemeStore + + // Status bar color + + fun statusBarColor(@ColorInt color: Int): ThemeStore + + fun statusBarColorRes(@ColorRes colorRes: Int): ThemeStore + + fun statusBarColorAttr(@AttrRes colorAttr: Int): ThemeStore + + // Navigation bar color + + fun navigationBarColor(@ColorInt color: Int): ThemeStore + + fun navigationBarColorRes(@ColorRes colorRes: Int): ThemeStore + + fun navigationBarColorAttr(@AttrRes colorAttr: Int): ThemeStore + + // Primary text color + + fun textColorPrimary(@ColorInt color: Int): ThemeStore + + fun textColorPrimaryRes(@ColorRes colorRes: Int): ThemeStore + + fun textColorPrimaryAttr(@AttrRes colorAttr: Int): ThemeStore + + fun textColorPrimaryInverse(@ColorInt color: Int): ThemeStore + + fun textColorPrimaryInverseRes(@ColorRes colorRes: Int): ThemeStore + + fun textColorPrimaryInverseAttr(@AttrRes colorAttr: Int): ThemeStore + + // Secondary text color + + fun textColorSecondary(@ColorInt color: Int): ThemeStore + + fun textColorSecondaryRes(@ColorRes colorRes: Int): ThemeStore + + fun textColorSecondaryAttr(@AttrRes colorAttr: Int): ThemeStore + + fun textColorSecondaryInverse(@ColorInt color: Int): ThemeStore + + fun textColorSecondaryInverseRes(@ColorRes colorRes: Int): ThemeStore + + fun textColorSecondaryInverseAttr(@AttrRes colorAttr: Int): ThemeStore + + // Background + + fun backgroundColor(@ColorInt color: Int): ThemeStore + + fun bottomBackground(@ColorInt color: Int): ThemeStore + + // Toggle configurations + + fun coloredStatusBar(colored: Boolean): ThemeStore + + fun coloredNavigationBar(applyToNavBar: Boolean): ThemeStore + + // Commit/apply + + fun apply() +} diff --git a/app/src/main/java/com/novel/read/lib/ThemeStorePrefKeys.kt b/app/src/main/java/com/novel/read/lib/ThemeStorePrefKeys.kt new file mode 100644 index 0000000..50fb152 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/ThemeStorePrefKeys.kt @@ -0,0 +1,32 @@ +package com.novel.read.lib + +/** + * @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid) + */ +object ThemeStorePrefKeys { + + const val CONFIG_PREFS_KEY_DEFAULT = "app_themes" + const val IS_CONFIGURED_KEY = "is_configured" + const val IS_CONFIGURED_VERSION_KEY = "is_configured_version" + const val VALUES_CHANGED = "values_changed" + + const val KEY_PRIMARY_COLOR = "primary_color" + const val KEY_PRIMARY_COLOR_DARK = "primary_color_dark" + const val KEY_ACCENT_COLOR = "accent_color" + const val KEY_STATUS_BAR_COLOR = "status_bar_color" + const val KEY_NAVIGATION_BAR_COLOR = "navigation_bar_color" + + const val KEY_TEXT_COLOR_PRIMARY = "text_color_primary" + const val KEY_TEXT_COLOR_PRIMARY_INVERSE = "text_color_primary_inverse" + const val KEY_TEXT_COLOR_SECONDARY = "text_color_secondary" + const val KEY_TEXT_COLOR_SECONDARY_INVERSE = "text_color_secondary_inverse" + + const val KEY_BACKGROUND_COLOR = "backgroundColor" + const val KEY_BOTTOM_BACKGROUND = "bottomBackground" + + const val KEY_APPLY_PRIMARYDARK_STATUSBAR = "apply_primarydark_statusbar" + const val KEY_APPLY_PRIMARY_NAVBAR = "apply_primary_navbar" + const val KEY_AUTO_GENERATE_PRIMARYDARK = "auto_generate_primarydark" + + const val KEY_ELEVATION = "elevation" +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/lib/dialogs/AlertBuilder.kt b/app/src/main/java/com/novel/read/lib/dialogs/AlertBuilder.kt new file mode 100644 index 0000000..8034d46 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/dialogs/AlertBuilder.kt @@ -0,0 +1,118 @@ +/* + * Copyright 2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:Suppress("NOTHING_TO_INLINE", "unused") + +package com.novel.read.lib.dialogs + +import android.annotation.SuppressLint +import android.content.Context +import android.content.DialogInterface +import android.graphics.drawable.Drawable +import android.view.KeyEvent +import android.view.View +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import com.novel.read.R +import org.jetbrains.anko.internals.AnkoInternals.NO_GETTER +import kotlin.DeprecationLevel.ERROR + +@SuppressLint("SupportAnnotationUsage") +interface AlertBuilder { + val ctx: Context + + var title: CharSequence + @Deprecated(NO_GETTER, level = ERROR) get + + var titleResource: Int + @Deprecated(NO_GETTER, level = ERROR) get + + var message: CharSequence + @Deprecated(NO_GETTER, level = ERROR) get + + var messageResource: Int + @Deprecated(NO_GETTER, level = ERROR) get + + var icon: Drawable + @Deprecated(NO_GETTER, level = ERROR) get + + @setparam:DrawableRes + var iconResource: Int + @Deprecated(NO_GETTER, level = ERROR) get + + var customTitle: View + @Deprecated(NO_GETTER, level = ERROR) get + + var customView: View + @Deprecated(NO_GETTER, level = ERROR) get + + var isCancelable: Boolean + @Deprecated(NO_GETTER, level = ERROR) get + + fun positiveButton(buttonText: String, onClicked: ((dialog: DialogInterface) -> Unit)? = null) + fun positiveButton(@StringRes buttonTextResource: Int, onClicked: ((dialog: DialogInterface) -> Unit)? = null) + + fun negativeButton(buttonText: String, onClicked: ((dialog: DialogInterface) -> Unit)? = null) + fun negativeButton(@StringRes buttonTextResource: Int, onClicked: ((dialog: DialogInterface) -> Unit)? = null) + + fun neutralButton(buttonText: String, onClicked: ((dialog: DialogInterface) -> Unit)? = null) + fun neutralButton(@StringRes buttonTextResource: Int, onClicked: ((dialog: DialogInterface) -> Unit)? = null) + + fun onCancelled(handler: (dialog: DialogInterface) -> Unit) + + fun onKeyPressed(handler: (dialog: DialogInterface, keyCode: Int, e: KeyEvent) -> Boolean) + + fun items(items: List, onItemSelected: (dialog: DialogInterface, index: Int) -> Unit) + fun items( + items: List, + onItemSelected: (dialog: DialogInterface, item: T, index: Int) -> Unit + ) + + fun multiChoiceItems( + items: Array, + checkedItems: BooleanArray, + onClick: (dialog: DialogInterface, which: Int, isChecked: Boolean) -> Unit + ) + + fun singleChoiceItems( + items: Array, + checkedItem: Int = 0, + onClick: ((dialog: DialogInterface, which: Int) -> Unit)? = null + ) + + fun build(): D + fun show(): D +} + +fun AlertBuilder<*>.customTitle(view: () -> View) { + customTitle = view() +} + +fun AlertBuilder<*>.customView(view: () -> View) { + customView = view() +} + +inline fun AlertBuilder<*>.okButton(noinline handler: ((dialog: DialogInterface) -> Unit)? = null) = + positiveButton(android.R.string.ok, handler) + +inline fun AlertBuilder<*>.cancelButton(noinline handler: ((dialog: DialogInterface) -> Unit)? = null) = + negativeButton(android.R.string.cancel, handler) + +inline fun AlertBuilder<*>.yesButton(noinline handler: ((dialog: DialogInterface) -> Unit)? = null) = + positiveButton(R.string.yes, handler) + +inline fun AlertBuilder<*>.noButton(noinline handler: ((dialog: DialogInterface) -> Unit)? = null) = + negativeButton(R.string.no, handler) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/lib/dialogs/AndroidAlertBuilder.kt b/app/src/main/java/com/novel/read/lib/dialogs/AndroidAlertBuilder.kt new file mode 100644 index 0000000..b4de991 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/dialogs/AndroidAlertBuilder.kt @@ -0,0 +1,140 @@ +/* + * Copyright 2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.novel.read.lib.dialogs + +import android.content.Context +import android.content.DialogInterface +import android.graphics.drawable.Drawable +import android.view.KeyEvent +import android.view.View +import androidx.appcompat.app.AlertDialog +import org.jetbrains.anko.internals.AnkoInternals +import org.jetbrains.anko.internals.AnkoInternals.NO_GETTER +import kotlin.DeprecationLevel.ERROR + +val Android: AlertBuilderFactory = ::AndroidAlertBuilder + +internal class AndroidAlertBuilder(override val ctx: Context) : AlertBuilder { + private val builder = AlertDialog.Builder(ctx) + + override var title: CharSequence + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setTitle(value) } + + override var titleResource: Int + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setTitle(value) } + + override var message: CharSequence + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setMessage(value) } + + override var messageResource: Int + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setMessage(value) } + + override var icon: Drawable + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setIcon(value) } + + override var iconResource: Int + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setIcon(value) } + + override var customTitle: View + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setCustomTitle(value) } + + override var customView: View + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setView(value) } + + override var isCancelable: Boolean + @Deprecated(NO_GETTER, level = ERROR) get() = AnkoInternals.noGetter() + set(value) { builder.setCancelable(value) } + + override fun onCancelled(handler: (DialogInterface) -> Unit) { + builder.setOnCancelListener(handler) + } + + override fun onKeyPressed(handler: (dialog: DialogInterface, keyCode: Int, e: KeyEvent) -> Boolean) { + builder.setOnKeyListener(handler) + } + + override fun positiveButton(buttonText: String, onClicked: ((dialog: DialogInterface) -> Unit)?) { + builder.setPositiveButton(buttonText) { dialog, _ -> onClicked?.invoke(dialog) } + } + + override fun positiveButton(buttonTextResource: Int, onClicked: ((dialog: DialogInterface) -> Unit)?) { + builder.setPositiveButton(buttonTextResource) { dialog, _ -> onClicked?.invoke(dialog) } + } + + override fun negativeButton(buttonText: String, onClicked: ((dialog: DialogInterface) -> Unit)?) { + builder.setNegativeButton(buttonText) { dialog, _ -> onClicked?.invoke(dialog) } + } + + override fun negativeButton(buttonTextResource: Int, onClicked: ((dialog: DialogInterface) -> Unit)?) { + builder.setNegativeButton(buttonTextResource) { dialog, _ -> onClicked?.invoke(dialog) } + } + + override fun neutralButton(buttonText: String, onClicked: ((dialog: DialogInterface) -> Unit)?) { + builder.setNeutralButton(buttonText) { dialog, _ -> onClicked?.invoke(dialog) } + } + + override fun neutralButton(buttonTextResource: Int, onClicked: ((dialog: DialogInterface) -> Unit)?) { + builder.setNeutralButton(buttonTextResource) { dialog, _ -> onClicked?.invoke(dialog) } + } + + override fun items(items: List, onItemSelected: (dialog: DialogInterface, index: Int) -> Unit) { + builder.setItems(Array(items.size) { i -> items[i].toString() }) { dialog, which -> + onItemSelected(dialog, which) + } + } + + override fun items( + items: List, + onItemSelected: (dialog: DialogInterface, item: T, index: Int) -> Unit + ) { + builder.setItems(Array(items.size) { i -> items[i].toString() }) { dialog, which -> + onItemSelected(dialog, items[which], which) + } + } + + override fun multiChoiceItems( + items: Array, + checkedItems: BooleanArray, + onClick: (dialog: DialogInterface, which: Int, isChecked: Boolean) -> Unit + ) { + builder.setMultiChoiceItems(items, checkedItems) { dialog, which, isChecked -> + onClick(dialog, which, isChecked) + } + } + + override fun singleChoiceItems( + items: Array, + checkedItem: Int, + onClick: ((dialog: DialogInterface, which: Int) -> Unit)? + ) { + builder.setSingleChoiceItems(items, checkedItem) { dialog, which -> + onClick?.invoke(dialog, which) + } + } + + override fun build(): AlertDialog = builder.create() + + override fun show(): AlertDialog = builder.show() +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/lib/dialogs/AndroidDialogs.kt b/app/src/main/java/com/novel/read/lib/dialogs/AndroidDialogs.kt new file mode 100644 index 0000000..ab24d15 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/dialogs/AndroidDialogs.kt @@ -0,0 +1,142 @@ +/* + * Copyright 2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:Suppress("NOTHING_TO_INLINE", "unused", "DEPRECATION") + +package com.novel.read.lib.dialogs + +import android.app.ProgressDialog +import android.content.Context +import android.content.DialogInterface +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment +import org.jetbrains.anko.AnkoContext + +inline fun Fragment.alert( + title: CharSequence? = null, + message: CharSequence? = null, + noinline init: (AlertBuilder.() -> Unit)? = null +) = requireActivity().alert(title, message, init) + +fun Context.alert( + title: CharSequence? = null, + message: CharSequence? = null, + init: (AlertBuilder.() -> Unit)? = null +): AlertBuilder { + return AndroidAlertBuilder(this).apply { + if (title != null) { + this.title = title + } + if (message != null) { + this.message = message + } + if (init != null) init() + } +} + +inline fun Fragment.alert( + titleResource: Int? = null, + message: Int? = null, + noinline init: (AlertBuilder.() -> Unit)? = null +) = requireActivity().alert(titleResource, message, init) + +fun Context.alert( + titleResource: Int? = null, + messageResource: Int? = null, + init: (AlertBuilder.() -> Unit)? = null +): AlertBuilder { + return AndroidAlertBuilder(this).apply { + if (titleResource != null) { + this.titleResource = titleResource + } + if (messageResource != null) { + this.messageResource = messageResource + } + if (init != null) init() + } +} + + +inline fun AnkoContext<*>.alert(noinline init: AlertBuilder.() -> Unit) = ctx.alert(init) +inline fun Fragment.alert(noinline init: AlertBuilder.() -> Unit) = requireContext().alert(init) + +fun Context.alert(init: AlertBuilder.() -> Unit): AlertBuilder = + AndroidAlertBuilder(this).apply { init() } + +inline fun Fragment.progressDialog( + title: Int? = null, + message: Int? = null, + noinline init: (ProgressDialog.() -> Unit)? = null +) = requireActivity().progressDialog(title, message, init) + +fun Context.progressDialog( + title: Int? = null, + message: Int? = null, + init: (ProgressDialog.() -> Unit)? = null +) = progressDialog(title?.let { getString(it) }, message?.let { getString(it) }, false, init) + + +inline fun Fragment.indeterminateProgressDialog( + title: Int? = null, + message: Int? = null, + noinline init: (ProgressDialog.() -> Unit)? = null +) = requireActivity().indeterminateProgressDialog(title, message, init) + +fun Context.indeterminateProgressDialog( + title: Int? = null, + message: Int? = null, + init: (ProgressDialog.() -> Unit)? = null +) = progressDialog(title?.let { getString(it) }, message?.let { getString(it) }, true, init) + +inline fun Fragment.progressDialog( + title: CharSequence? = null, + message: CharSequence? = null, + noinline init: (ProgressDialog.() -> Unit)? = null +) = requireActivity().progressDialog(title, message, init) + +fun Context.progressDialog( + title: CharSequence? = null, + message: CharSequence? = null, + init: (ProgressDialog.() -> Unit)? = null +) = progressDialog(title, message, false, init) + + +inline fun Fragment.indeterminateProgressDialog( + title: CharSequence? = null, + message: CharSequence? = null, + noinline init: (ProgressDialog.() -> Unit)? = null +) = requireActivity().indeterminateProgressDialog(title, message, init) + +fun Context.indeterminateProgressDialog( + title: CharSequence? = null, + message: CharSequence? = null, + init: (ProgressDialog.() -> Unit)? = null +) = progressDialog(title, message, true, init) + + +private fun Context.progressDialog( + title: CharSequence? = null, + message: CharSequence? = null, + indeterminate: Boolean, + init: (ProgressDialog.() -> Unit)? = null +) = ProgressDialog(this).apply { + isIndeterminate = indeterminate + if (!indeterminate) setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + if (message != null) setMessage(message) + if (title != null) setTitle(title) + if (init != null) init() + show() +} diff --git a/app/src/main/java/com/novel/read/lib/dialogs/AndroidSelectors.kt b/app/src/main/java/com/novel/read/lib/dialogs/AndroidSelectors.kt new file mode 100644 index 0000000..bf3c903 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/dialogs/AndroidSelectors.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:Suppress("NOTHING_TO_INLINE", "unused") + +package com.novel.read.lib.dialogs + +import android.content.Context +import android.content.DialogInterface +import androidx.fragment.app.Fragment +import com.novel.read.utils.ext.applyTint + +inline fun Fragment.selector( + title: CharSequence? = null, + items: List, + noinline onClick: (DialogInterface, Int) -> Unit +) = activity?.selector(title, items, onClick) + +fun Context.selector( + title: CharSequence? = null, + items: List, + onClick: (DialogInterface, Int) -> Unit +) { + with(AndroidAlertBuilder(this)) { + if (title != null) { + this.title = title + } + items(items, onClick) + show().applyTint() + } +} + +fun Context.selector( + titleSource: Int? = null, + items: List, + onClick: (DialogInterface, Int) -> Unit +) { + with(AndroidAlertBuilder(this)) { + if (titleSource != null) { + this.title = getString(titleSource) + } + items(items, onClick) + show().applyTint() + } +} diff --git a/app/src/main/java/com/novel/read/lib/dialogs/Dialogs.kt b/app/src/main/java/com/novel/read/lib/dialogs/Dialogs.kt new file mode 100644 index 0000000..5509d49 --- /dev/null +++ b/app/src/main/java/com/novel/read/lib/dialogs/Dialogs.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@file:Suppress("NOTHING_TO_INLINE", "unused") + +package com.novel.read.lib.dialogs + +import android.content.Context +import android.content.DialogInterface +import androidx.fragment.app.Fragment + +typealias AlertBuilderFactory = (Context) -> AlertBuilder + +inline fun Fragment.alert( + noinline factory: AlertBuilderFactory, + title: String? = null, + message: String? = null, + noinline init: (AlertBuilder.() -> Unit)? = null +) = activity?.alert(factory, title, message, init) + +fun Context.alert( + factory: AlertBuilderFactory, + title: String? = null, + message: String? = null, + init: (AlertBuilder.() -> Unit)? = null +): AlertBuilder { + return factory(this).apply { + if (title != null) { + this.title = title + } + if (message != null) { + this.message = message + } + if (init != null) init() + } +} + +inline fun Fragment.alert( + noinline factory: AlertBuilderFactory, + titleResource: Int? = null, + messageResource: Int? = null, + noinline init: (AlertBuilder.() -> Unit)? = null +) = requireActivity().alert(factory, titleResource, messageResource, init) + +fun Context.alert( + factory: AlertBuilderFactory, + titleResource: Int? = null, + messageResource: Int? = null, + init: (AlertBuilder.() -> Unit)? = null +): AlertBuilder { + return factory(this).apply { + if (titleResource != null) { + this.titleResource = titleResource + } + if (messageResource != null) { + this.messageResource = messageResource + } + if (init != null) init() + } +} + +inline fun Fragment.alert( + noinline factory: AlertBuilderFactory, + noinline init: AlertBuilder.() -> Unit +) = requireActivity().alert(factory, init) + +fun Context.alert( + factory: AlertBuilderFactory, + init: AlertBuilder.() -> Unit +): AlertBuilder = factory(this).apply { init() } diff --git a/app/src/main/java/com/novel/read/model/db/BookChapterBean.java b/app/src/main/java/com/novel/read/model/db/BookChapterBean.java deleted file mode 100644 index a325c20..0000000 --- a/app/src/main/java/com/novel/read/model/db/BookChapterBean.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.novel.read.model.db; - -import org.litepal.crud.LitePalSupport; - -import java.io.Serializable; - -/** - * Created by zlj - * 书的章节链接(作为下载的进度数据) - * 同时作为网络章节和本地章节 (没有找到更好分离两者的办法) - */ -public class BookChapterBean extends LitePalSupport implements Serializable { - /** - * title : 第一章 他叫白小纯 - * link : http://read.qidian.com/chapter/rJgN8tJ_cVdRGoWu-UQg7Q2/6jr-buLIUJSaGfXRMrUjdw2 - * unreadble : false - */ - private String chapterId; - - private String link; - - private String title; - - //所属的下载任务 - private String taskName; - - private boolean unreadble; - - //所属的书籍 - private String bookId; - - //本地书籍参数 - private CollBookBean collBookBean; - - //本地下载参数 - private DownloadTaskBean downloadTaskBean; - - //在书籍文件中的起始位置 - private long start; - - //在书籍文件中的终止位置 - private long end; - - public BookChapterBean(String id, String link, String title, String taskName, - boolean unreadble, String bookId, long start, long end) { - this.chapterId = id; - this.link = link; - this.title = title; - this.taskName = taskName; - this.unreadble = unreadble; - this.bookId = bookId; - this.start = start; - this.end = end; - } - public BookChapterBean(String id,String title) { - this.chapterId = id; - this.title = title; - } - - 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 chapterId; - } - - public void setId(String id) { - this.chapterId = 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; - } - - public CollBookBean getCollBookBean() { - return collBookBean; - } - - public void setCollBookBean(CollBookBean collBookBean) { - this.collBookBean = collBookBean; - } - - public DownloadTaskBean getDownloadTaskBean() { - return downloadTaskBean; - } - - public void setDownloadTaskBean(DownloadTaskBean downloadTaskBean) { - this.downloadTaskBean = downloadTaskBean; - } - - @Override - public String toString() { - return "BookChapterBean{" + - "chapterId='" + chapterId + '\'' + - ", 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/novel/read/model/db/BookRecordBean.kt b/app/src/main/java/com/novel/read/model/db/BookRecordBean.kt deleted file mode 100644 index 09ff07b..0000000 --- a/app/src/main/java/com/novel/read/model/db/BookRecordBean.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.novel.read.model.db - -import org.litepal.crud.LitePalSupport - -import java.io.Serializable - -/** - * Created by zlj - */ -class BookRecordBean : LitePalSupport(), Serializable { - //所属的书的id - var bookId: String = "" - //阅读到了第几章 - var chapter: Int = 0 - //当前的页码 - var pagePos: Int = 0 -} diff --git a/app/src/main/java/com/novel/read/model/db/BookSignTable.kt b/app/src/main/java/com/novel/read/model/db/BookSignTable.kt deleted file mode 100644 index 530cf2a..0000000 --- a/app/src/main/java/com/novel/read/model/db/BookSignTable.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.novel.read.model.db - -import org.litepal.crud.LitePalSupport - -import java.io.Serializable - -/** - * create by zlj on 2019/11/6 - * describe: 书签数据库 - */ -class BookSignTable(val bookId: String, val articleId: String, val content: String) : - LitePalSupport(), Serializable { - val saveTime: Long = System.currentTimeMillis() - var edit: Boolean = false -} diff --git a/app/src/main/java/com/novel/read/model/db/ChapterInfoBean.java b/app/src/main/java/com/novel/read/model/db/ChapterInfoBean.java deleted file mode 100644 index 76ffd48..0000000 --- a/app/src/main/java/com/novel/read/model/db/ChapterInfoBean.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.novel.read.model.db; - -public class ChapterInfoBean { - /** - * title : 第一章 他叫白小纯 - * content : 帽儿山,位于东林山脉中,山下有一个村子,民风淳朴,以耕田为生,与世隔绝。 - 清晨,村庄的大门前,整个村子里的乡亲,正为一个十五六岁少年送别,这少年瘦弱,但却白白净净,看起来很是乖巧,衣着尽管是寻常的青衫,可却洗的泛白,穿在这少年的身上,与他目中的纯净搭配在一起,透出一股子灵动。 - 他叫白小纯。 - “父老乡亲们,我要去修仙了,可我舍不得你们啊。”少年满脸不舍,原本就乖巧的样子,此刻看起来更为纯朴。 - 四周的乡亲,面面相觑,顿时摆出难舍之色。 - “小纯,你爹娘走的早,你是个……好孩子!!难道你不想长生了么,成为仙人就可以长生,能活的很久很久,走吧,雏鹰长大,总有飞出去的那一天。”人群内走出一个头发花白的老者,说道好孩子三个字时,他顿了一下。 - “在外面遇到任何事情,都要坚持下去,走出村子,就不要回来,因为你的路在前方!”老人神色慈祥,拍了拍少年的肩膀。 - “长生……”白小纯身体一震,目中慢慢坚定起来,在老者以及四周乡亲鼓励的目光下,他重重的点了点头,深深的看了一眼四周的乡亲,转身迈着大步,渐渐走出了村子。 - 眼看少年的身影远去,村中的众人,一个个都激动起来,目中的难舍刹那就被喜悦代替,那之前满脸慈祥的老者,此刻也在颤抖,眼中流下泪水。 - “苍天有眼,这白鼠狼,他终于……终于走了,是谁告诉他在附近看到仙人的,你为村子立下了大功!” - “这白鼠狼终于肯离开了,可怜我家的几只鸡,就因为这白鼠狼怕鸡打鸣,不知用了什么方法,唆使一群孩子吃鸡肉,把全村的鸡都给吃的干干净净……” - “今天过年了!”欢呼之声,立刻在这不大的村子里,沸腾而起,甚至有人拿出了锣鼓,高兴的敲打起来。 - 村子外,白小纯还没等走远,他就听到了身后村子内,传出了敲锣打鼓的声音,还夹着欢呼。 - 白小纯脚步一顿,神色有些古怪,干咳一声,伴随着耳边传来的锣鼓,白小纯顺着山路,走上了帽儿山。 - 这帽儿山虽不高,却灌木杂多,虽是清晨,可看起来也是黑压压一片,很是安静。 - “听二狗说,他前几天在这里被一头野猪追赶时,看到天上有仙人飞过……”白小纯走在山路上,心脏怦怦跳动时,忽然一旁的灌林中传来阵阵哗哗声,似野猪一样,这声音来的突然,让本就紧张的白小纯,顿时背后发凉。 - “谁,谁在那里!”白小纯右手快速从行囊中拿出四把斧头,六把柴刀,还觉得不放心,又从怀里取出了一小根黑色的香,死死的抓住。 - “别出来,千万别出来,我有斧头,有柴刀,手里的香还可以召唤天雷,能引仙人降临,你敢出来,就劈死你!”白小纯哆嗦的大喊,连滚带爬的夹着那些武器,赶紧顺着山路跑去,沿途叮当乱响,斧头柴刀掉了一地。 - 或许是真的被他给吓住了,很快的哗哗声就消失,没有什么野兽跑出来,白小纯面色苍白,擦了擦冷汗,有心放弃继续上山,可一想到手中这根香是他爹娘去世前留给他的,据说是祖上曾偶然的救下一个落魄的仙人,那仙人离去时留下这根香作为报答,曾言会收下白家血脉一人为弟子,只要点燃,仙人就会到来。 - 可至今为止,这根香他点过十多次,始终不见仙人到来,让白小纯开始怀疑仙人是不是真的会来,这一次之所以下定决心,一方面是香所剩不多,另一方面是他听村子里人说,头几天在这看到有仙人从天上飞过。 - 所以他这才到来,想着距离仙人近一些,或许仙人就察觉到了也说不定。 - 踌躇一番,白小纯咬牙继续,好在此山不高,不久他气喘吁吁的到了山顶,站在那里,他遥望山下的村庄,神色颇为感慨,又低头看着手中的只有指甲盖大小的黑香,此香似乎被燃烧了好多次,所剩不多。 - “三年了,爹娘保佑我,这次一定要成功!”白小纯深吸口气,小心的将香点燃,立刻四周狂风顿起,天空更是眨眼间乌云密布,一道道闪电划过,还有震耳欲聋的雷鸣在白小纯耳边直接炸开。 - 声音之大,气势之强,让白小纯身体哆嗦,有种随时会被雷劈死的感觉,下意识的就想要吐口唾沫将那根香灭掉,但却挣扎忍住。 - “三年了,我点这根香点了十二次,这是第十三次,这次一定要忍住,小纯不怕,应该不会被劈死……”白小纯想起了这三年的经历,不算这次,点了十二次,每次都是这样的雷鸣闪电,仙人也没有到来,吓的本就怕死的他每次都吐口唾沫将其熄灭,说来也怪,这根香看似不凡,可实际上一样是浇水就灭。 - 在白小纯这里心惊肉跳,艰难的于那雷声中等待时,距离这里不远处的天空上,有一道长虹正急速的呼啸而来。 - 长虹内是一个中年男子,这男子衣着华丽,仙风道骨,可偏偏风尘仆仆,甚至仔细去看,可以看到他神色内深深的疲惫。 - “我倒要看看,到底是个什么样的人,竟然点根香点了三年!” - 一想到自己这三年的经历,中年男子就气恼,三年前他察觉有人点燃自己还是凝气时送出的香药,想起了当年在凡俗中的一段人情。 - 这才飞出寻来,原本按照他的打算,很快就会回来,可没成想,刚寻着香气过去,还没等多远,那气息就瞬间消失,断了联系。若是一次也就罢了,这三年,气息出现了十多次。 - 使得他这里,多次在寻找时中断,就这样来来回回,折腾了三年…… - 此刻他遥遥的看到了帽儿山,看到了山顶上白小纯,气不打一处来,一瞬飞出,直接就站在了山顶,大手一挥,那根所剩不多的香,直接熄灭。 - 雷声刹那消失,白小纯愣了一下,抬头一看,看到了自己的身边多了一个中年男子。 - “仙人?”白小纯小心翼翼的开口,有些拿不准,背后偷偷捡起一把斧头。 - “本座李青候,你是白家后人?”中年修士目光如电,无视白小纯身后的斧子,打量了白小纯一番,觉得眼前此子眉清目秀,依稀与当年的故人相似,资质也不错,心底的恼意,也不由缓了一些。 - “晚辈正是白家后人,白小纯。”白小纯眨了眨眼,小声说道,虽然心中有些畏惧,但还是挺了挺腰板。 - “我问你,点一根香,为什么点了三年!”中年修士淡淡开口,问出了他这三年里,最想要知道的问题。 - 白小纯听到这个问题,脑筋飞速转动,然后脸上摆出惆怅,遥望山下的村庄。 - “晚辈是一个重情重义的人,舍不得那些乡亲们,每一次我点燃香,他们也都不舍得我离去,如今山下的他们,还在因为我的离去而悲伤呢。” - 中年修士一愣,这个缘由,是他之前没想到的,目中的恼色又少了一些,单单从话语上看,此子的本性还是不错的。 - 可当他的目光落在山下的村子时,他的神识随之扫过,听到了村子里的敲锣打鼓以及那一句句欢呼白鼠狼离去的话语,面色立刻难看起来,有些头疼,看着眼前这个外表乖巧纯朴,人畜无害的白小纯,已心底明朗对方实际上一肚子坏水。 - “说实话!”中年修士一瞪眼,声音如同雷声一样,白小纯吓得一个哆嗦。 - “这不怨我啊,你那什么破香啊,每次点燃都会打雷,好几次都差点劈死我,我躲过了十三次,已经很不容易了。”白小纯可怜兮兮的说道。 - 中年修士看着白小纯,半晌无语。 - “既然你这么害怕,为什么还要强行去点香十多次?”中年修士缓缓开口。 - “我怕死啊,修仙不是能长生么,我想长生啊。”白小纯委屈的说道。 - 中年修士再次无语,不过觉得此子总算执念可嘉,扔到门派里磨炼一番,或可在性子上改变一二。 - 于是略一思索,大袖一甩卷着白小纯化作一道长虹,直奔天边而去。 - “跟我走吧。” - “去哪?这也太高了吧……”白小纯看到自己在天上飞,下面是万丈深渊,立刻脸色苍白,斧头一扔,死死的抱住仙人的大腿。 - 中年修士看了眼自己的腿,无奈开口。 - “灵溪宗。” - 兄弟姐妹们,阔别2个月,你们想不想我啊,我非常想你们! - 这本书,我做了详细的大纲,每次回顾大纲里的情节,都很兴奋,有种燃烧的感觉,我非常满意,明天,正式更新,依旧是中午一章,晚上一章! - 很兴奋,我们已沉寂了数月,如今归来,要……再战起点! - 新书期,兄弟姐妹,别忘了收藏与推荐啊,收藏与推荐至关重要! - 求收藏!!求推荐!! - 让众人知晓,我们……归来了! - 我们的目标,依旧是……点击榜,推荐榜,第一! - */ - - private String title; - private String content; - private int words; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getBody() { - return content; - } - - public void setBody(String body) { - this.content = body; - } - - public int getWords() { - return words; - } - - public void setWords(int words) { - this.words = words; - } -} diff --git a/app/src/main/java/com/novel/read/model/db/CollBookBean.java b/app/src/main/java/com/novel/read/model/db/CollBookBean.java deleted file mode 100644 index f53a0fb..0000000 --- a/app/src/main/java/com/novel/read/model/db/CollBookBean.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.novel.read.model.db; - -import com.novel.read.base.MyApp; -import com.novel.read.utlis.StringUtils; - -import org.litepal.crud.LitePalSupport; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 收藏的书籍 - */ -public class CollBookBean extends LitePalSupport implements Serializable { - - - /** - * _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章 朱长老 - */ - private String bookId; // 本地书籍中,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; - private boolean isSelect = false; - private int include_image; - - public boolean isSelect() { - return isSelect; - } - - public void setSelect(boolean select) { - isSelect = select; - } - - private List bookChapterList = new ArrayList(); - - - public String getId() { - return bookId == null ? "" : bookId; - } - - public void setId(String id) { - this.bookId = id; - } - - public String getTitle() { - return title == null ? "" : StringUtils.INSTANCE.convertCC(title); - } - - public void setTitle(String title) { - this.title = title; - } - - public String getAuthor() { - return author == null ? "" : StringUtils.INSTANCE.convertCC(author); - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getShortIntro() { - return shortIntro == null ? "" : StringUtils.INSTANCE.convertCC(shortIntro); - } - - public void setShortIntro(String shortIntro) { - this.shortIntro = shortIntro; - } - - public String getCover() { - return cover == null ? "" : cover; - } - - 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 updated == null ? "" : updated; - } - - public void setUpdated(String updated) { - this.updated = updated; - } - - public String getLastRead() { - return lastRead == null ? "" : lastRead; - } - - public void setLastRead(String lastRead) { - this.lastRead = lastRead; - } - - public int getChaptersCount() { - return chaptersCount; - } - - public void setChaptersCount(int chaptersCount) { - this.chaptersCount = chaptersCount; - } - - public String getLastChapter() { - return lastChapter == null ? "" : StringUtils.INSTANCE.convertCC(lastChapter); - } - - public void setLastChapter(String lastChapter) { - this.lastChapter = lastChapter; - } - - public boolean isUpdate() { - return isUpdate; - } - - public void setIsUpdate(boolean update) { - isUpdate = update; - } - - public boolean isLocal() { - return isLocal; - } - - public void setLocal(boolean local) { - isLocal = local; - } - - public int getInclude_image() { - return include_image; - } - - public void setInclude_image(int include_image) { - this.include_image = include_image; - } - - public List getBookChapters() { - if (bookChapterList == null) { - return new ArrayList<>(); - } - return bookChapterList; - } - - public void setBookChapters(List bookChapterList) { - this.bookChapterList = bookChapterList; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/model/db/DownloadTaskBean.java b/app/src/main/java/com/novel/read/model/db/DownloadTaskBean.java deleted file mode 100644 index dc64f21..0000000 --- a/app/src/main/java/com/novel/read/model/db/DownloadTaskBean.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.novel.read.model.db; - -import org.litepal.LitePal; -import org.litepal.crud.LitePalSupport; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by zlj - */ -public class DownloadTaskBean extends LitePalSupport { - 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; - - //任务名称 -> 名称唯一不重复 - private String taskName; - //所属的bookId(外健) - private String bookId; - - private List bookChapterList = new ArrayList<>(); - //章节的下载进度,默认为初始状态 - private int currentChapter = 0; - //最后的章节 - private int lastChapter = 0; - //状态:正在下载、下载完成、暂停、等待、下载错误。 - - private volatile int status = STATUS_WAIT; - //总大小 -> (完成之后才会赋值) - private long size = 0; - private CollBookBean collBookBean; - - - 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; - } - - 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()); - } - } - } - - public List getBookChapterList() { - if (bookChapterList == null) { - List bookChapterListNew = LitePal - .where("taskName=?", taskName).find(BookChapterBean.class); - - 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(){ - return bookChapterList; - - } - - 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; - } - - public synchronized void resetBookChapterList() { - bookChapterList = null; - } - - - public CollBookBean getCollBookBean() { - - List list = LitePal.where("bookId=?", bookId).find(CollBookBean.class); - if (list!=null&&list.size()>0){ - return list.get(0); - }else { - return collBookBean; - } - } - - public void setCollBookBean(CollBookBean collBookBean) { - this.collBookBean = collBookBean; - } -} diff --git a/app/src/main/java/com/novel/read/model/db/dbManage/BookManager.java b/app/src/main/java/com/novel/read/model/db/dbManage/BookManager.java deleted file mode 100644 index b28cfa2..0000000 --- a/app/src/main/java/com/novel/read/model/db/dbManage/BookManager.java +++ /dev/null @@ -1,217 +0,0 @@ -package com.novel.read.model.db.dbManage; - -import com.novel.read.constants.Constant; -import com.novel.read.utlis.FileUtils; - -import java.io.File; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.Map; - -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/novel/read/model/db/dbManage/BookRepository.java b/app/src/main/java/com/novel/read/model/db/dbManage/BookRepository.java deleted file mode 100644 index dab723b..0000000 --- a/app/src/main/java/com/novel/read/model/db/dbManage/BookRepository.java +++ /dev/null @@ -1,348 +0,0 @@ -package com.novel.read.model.db.dbManage; - -import android.content.ContentValues; -import android.util.Log; - -import com.novel.read.constants.Constant; -import com.novel.read.model.db.BookChapterBean; -import com.novel.read.model.db.BookRecordBean; -import com.novel.read.model.db.BookSignTable; -import com.novel.read.model.db.ChapterInfoBean; -import com.novel.read.model.db.CollBookBean; -import com.novel.read.model.db.DownloadTaskBean; -import com.novel.read.utlis.FileUtils; -import com.novel.read.utlis.IOUtils; -import com.novel.read.utlis.SpUtil; -import com.novel.read.widget.page.Void; - -import org.litepal.LitePal; -import org.litepal.crud.callback.SaveCallback; - -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.ArrayList; -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(记录),BookSignTable书签) - */ - -public class BookRepository { - private static final String TAG = "CollBookManager"; - private static volatile BookRepository sInstance; - - private BookRepository() { - } - - public static BookRepository getInstance() { - if (sInstance == null) { - synchronized (BookRepository.class) { - if (sInstance == null) { - sInstance = new BookRepository(); - } - } - } - return sInstance; - } - - //存储已收藏书籍 - public void saveCollBookWithAsync(CollBookBean bean) { - - bean.saveOrUpdate("bookId=?", bean.getId()); - for (int i = 0; i < bean.getBookChapters().size(); i++) { - bean.getBookChapters().get(i).setCollBookBean(bean); - } - LitePal.saveAllAsync(bean.getBookChapters()).listen(new SaveCallback() { - @Override - public void onFinish(boolean success) { - Log.e(TAG, "saveCollBookWithAsync: " + success); - } - }); - } - - /** - * 异步存储。 - * 同时保存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) { - ContentValues values = new ContentValues(); - values.put("isUpdate", bean.isUpdate()); - values.put("lastRead", bean.getLastRead()); - values.put("lastChapter", bean.getLastChapter()); - LitePal.updateAll(CollBookBean.class, values, "bookId=?", bean.getId()); - } - - public void saveCollBooks(List beans) { - for (int i = 0; i < beans.size(); i++) { - ContentValues values = new ContentValues(); - values.put("isUpdate", beans.get(i).isUpdate()); - values.put("lastRead", beans.get(i).getLastRead()); - values.put("lastChapter", beans.get(i).getLastChapter()); - values.put("updated", beans.get(i).getUpdated()); - LitePal.updateAll(CollBookBean.class, values, "bookId=?", beans.get(i).getId()); - } - } - - /** - * 异步存储BookChapter - * - * @param beans - */ - public void saveBookChaptersWithAsync(List beans, CollBookBean collBookBean) { - LitePal.deleteAll(CollBookBean.class, "bookId=?", collBookBean.getId()); - collBookBean.setBookChapters(beans); - collBookBean.saveOrUpdate("bookId=?", collBookBean.getId()); - for (int i = 0; i < collBookBean.getBookChapters().size(); i++) { - collBookBean.getBookChapters().get(i).setCollBookBean(collBookBean); - } - LitePal.saveAllAsync(collBookBean.getBookChapters()).listen(new SaveCallback() { - @Override - public void onFinish(boolean success) { - Log.e(TAG, "saveCollBookWithAsync: " + success); - } - }); - } - - /** - * 存储章节 - * - * @param folderName - * @param fileName - * @param content - */ - public void saveChapterInfo(String folderName, String fileName, String content) { - String str = content.replaceAll("\\\\n\\\\n", "\n"); - File file = BookManager.getBookFile(folderName, fileName); - //获取流并存储 - Writer writer = null; - try { - writer = new BufferedWriter(new FileWriter(file)); - writer.write(str); - writer.flush(); - } catch (IOException e) { - e.printStackTrace(); - IOUtils.INSTANCE.close(writer); - } - } - - public void saveBookRecord(BookRecordBean bean) { - bean.saveOrUpdateAsync("bookId=?", bean.getBookId()).listen(new SaveCallback() { - @Override - public void onFinish(boolean success) { - Log.e("saveBookRecord", "onFinish: " + success); - } - }); - } - - /*****************************get************************************************/ - public CollBookBean getCollBook(String bookId) { - List bean = LitePal.where("bookId =?", bookId).find(CollBookBean.class); - if (bean != null && bean.size() > 0) { - return bean.get(0); - } else { - return null; - } - } - - - public List getCollBooks() { - List collBookBeans; - if (SpUtil.getBooleanValue(Constant.BookSort, false)) { //默认根据阅读时间排序 - collBookBeans = LitePal.order("updated desc").find(CollBookBean.class); - } else { - collBookBeans = LitePal.order("lastRead desc").find(CollBookBean.class); - } - return collBookBeans; - } - - - //获取书籍列表 - public List getBookChaptersInRx(String bookId) { - List bookBeans = LitePal.where("bookId=?", bookId).find(CollBookBean.class, true); - if (bookBeans != null && bookBeans.size() > 0) { - return bookBeans.get(0).getBookChapters(); - } else { - return new ArrayList<>(); - } - } - - //获取阅读记录 - public BookRecordBean getBookRecord(String bookId) { - List beans = LitePal.where("bookId=?", bookId).find(BookRecordBean.class); - if (beans != null && beans.size() > 0) { - return beans.get(0); - } else { - return null; - } - } - - //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.INSTANCE.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.getId()); - //删除任务 - deleteDownloadTask(bean.getId()); - //删除目录 - deleteBookChapter(bean.getId()); - //删除CollBook - LitePal.deleteAll(CollBookBean.class, "bookId=?", bean.getId()); - 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.INSTANCE.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 List getDownloadTaskList() { - return LitePal.findAll(DownloadTaskBean.class); - } - - - public void saveDownloadTask(DownloadTaskBean bean) { - bean.saveOrUpdate("bookId=?", bean.getBookId()); - CollBookBean collBookBean = bean.getCollBookBean(); - for (int i = 0; i < bean.getBookChapters().size(); i++) { - bean.getBookChapters().get(i).setDownloadTaskBean(bean); - bean.getBookChapters().get(i).setCollBookBean(collBookBean); - bean.getBookChapters().get(i).saveOrUpdate("chapterId=?", bean.getBookChapters().get(i).getId()); - - } - } - - /** - * 获取本地书签 - * - * @param bookId 书籍Id - * @return 书签 - */ - public List getSign(String bookId) { - return LitePal.where("bookId=?", bookId).find(BookSignTable.class); - } - - /** - * 添加书签 - * - * @param bookId bookId - * @param articleId articleId - * @param content content - */ - public void addSign(String bookId, String articleId, String content) { - BookSignTable bookSignTable = new BookSignTable(bookId, articleId, content); - bookSignTable.save(); - } - - /** - * 删除书签 - * - * @param articleId articleId - */ - public void deleteSign(String articleId) { - LitePal.deleteAll(BookSignTable.class, "articleId=?", articleId); - } - - /** - * 根据id查询书签是否存在 - * - * @param articleId - */ - public boolean getSignById(String articleId) { - List mList = LitePal.where("articleId=?", articleId).find(BookSignTable.class); - return mList.size() > 0; - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/BookArticleResp.java b/app/src/main/java/com/novel/read/model/protocol/BookArticleResp.java deleted file mode 100644 index a5b0807..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/BookArticleResp.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.novel.read.model.protocol; - -import com.novel.read.model.db.BookChapterBean; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -public class BookArticleResp implements Serializable { - - - private List article; - private List bookChapterBean; - - public List getArticle() { - return article; - } - - public void setArticle(List article) { - this.article = article; - } - - public static class ArticleBean { - /** - * id : 1 - * title : 第一章 我为帝辛!【求支持】 - * words : 4272 - * create_time : 1560048488 - */ - - private int id; - private String title; - private int words; - private int create_time; - private String volume; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getTitle() { - return getVolume()+title; - } - - public void setTitle(String title) { - this.title = title; - } - - public int getWords() { - return words; - } - - public void setWords(int words) { - this.words = words; - } - - public int getCreate_time() { - return create_time; - } - - public void setCreate_time(int create_time) { - this.create_time = create_time; - } - - public String getVolume() { - return volume == null ? "" : volume; - } - - public void setVolume(String volume) { - this.volume = volume; - } - } - - public List getChapterBean() { - if (bookChapterBean == null) { - bookChapterBean = createChapterBean(); - } - return bookChapterBean; - } - - private List createChapterBean() { - List mList = new ArrayList<>(); - for (ArticleBean articleBean:getArticle()){ - mList.add(new BookChapterBean(String.valueOf(articleBean.getId()),articleBean.getTitle())); - } - return mList; - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/BookDetailResp.java b/app/src/main/java/com/novel/read/model/protocol/BookDetailResp.java deleted file mode 100644 index 981d7ca..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/BookDetailResp.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.novel.read.model.protocol; - -import com.novel.read.model.db.CollBookBean; -import com.novel.read.utlis.StringUtils; - -/** - * create by zlj on 2019/6/18 - * describe: - */ -public class BookDetailResp { - - /** - * book : {"id":1,"title":"帝逆洪荒","cover":"http://dev.duoduvip.com/uploads/20190609/408f516e930518df187acc911208f004.png","description":" 【群号536o626o6】人族至宝崆峒印逆天回到未来,带来周天附身殷商人皇纣王之身!帝辛怒吼:人族要自强,人族要自立,人族要自主!但随即帝辛现了洪荒并不是那么简单,洪荒在亘古居然被打碎了,有蛮荒,莽荒,大荒三荒并存,四荒合并成就洪荒大世界!兽皇神逆,魔祖罗T,阴阳老祖,乾坤老祖,扬眉大仙,洪荒大能纷纷出世!真龙老祖,凤凰老母,瑞麒麟三族老祖出世,镇压三族!东皇太一,妖皇帝俊设计假死,瞒过众圣,如今万妖齐聚!且看帝辛如何在万族夹击之中求生存,成就一代人族大帝,庇佑人族!
各位书友要是觉得《帝逆洪荒》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!帝逆洪荒最新章节,帝逆洪荒无弹窗,帝逆洪荒全文阅读.","hot":100,"like":20,"author":"天子辉","create_time":1560048488,"words":4637684} - * last_article : {"id":1,"title":"第一章 我为帝辛!【求支持】","create_time":1560048488} - */ - - private BookBean book; - private LastArticleBean last_article; - private CollBookBean collBookBean; - - public BookBean getBook() { - return book; - } - - public void setBook(BookBean book) { - this.book = book; - } - - public LastArticleBean getLast_article() { - return last_article; - } - - public void setLast_article(LastArticleBean last_article) { - this.last_article = last_article; - } - - public static class BookBean { - /** - * id : 1 - * title : 帝逆洪荒 - * cover : http://dev.duoduvip.com/uploads/20190609/408f516e930518df187acc911208f004.png - * description : 【群号536o626o6】人族至宝崆峒印逆天回到未来,带来周天附身殷商人皇纣王之身!帝辛怒吼:人族要自强,人族要自立,人族要自主!但随即帝辛现了洪荒并不是那么简单,洪荒在亘古居然被打碎了,有蛮荒,莽荒,大荒三荒并存,四荒合并成就洪荒大世界!兽皇神逆,魔祖罗T,阴阳老祖,乾坤老祖,扬眉大仙,洪荒大能纷纷出世!真龙老祖,凤凰老母,瑞麒麟三族老祖出世,镇压三族!东皇太一,妖皇帝俊设计假死,瞒过众圣,如今万妖齐聚!且看帝辛如何在万族夹击之中求生存,成就一代人族大帝,庇佑人族!
各位书友要是觉得《帝逆洪荒》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!帝逆洪荒最新章节,帝逆洪荒无弹窗,帝逆洪荒全文阅读. - * hot : 100 - * like : 20 - * author : 天子辉 - * create_time : 1560048488 - * words : 4637684 - */ - - private int id; - private String title; - private String cover; - private String description; - private int hot; - private int like; - private String author; - private int create_time; - private int words; - private int include_image; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getCover() { - return cover; - } - - public void setCover(String cover) { - this.cover = cover; - } - - public String getDescription() { - return description == null ? "" : StringUtils.INSTANCE.delete160(description); - } - - public void setDescription(String description) { - this.description = description; - } - - public int getHot() { - return hot; - } - - public void setHot(int hot) { - this.hot = hot; - } - - public String getLike() { - return like+"%"; - } - - public void setLike(int like) { - this.like = like; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public int getCreate_time() { - return create_time; - } - - public void setCreate_time(int create_time) { - this.create_time = create_time; - } - - public int getWords() { - return words; - } - - public void setWords(int words) { - this.words = words; - } - - public int getInclude_image() { - return include_image; - } - - public void setInclude_image(int include_image) { - this.include_image = include_image; - } - } - - public static class LastArticleBean { - /** - * id : 1 - * title : 第一章 我为帝辛!【求支持】 - * create_time : 1560048488 - */ - - private int id; - private String title; - private long create_time; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getTitle() { - return title == null ? "" : title; - } - - public void setTitle(String title) { - this.title = title; - } - - public long getCreate_time() { - return create_time; - } - - public void setCreate_time(long create_time) { - this.create_time = create_time; - } - } - - public CollBookBean getCollBookBean(){ - if (collBookBean == null){ - collBookBean = createCollBookBean(); - } - return collBookBean; - } - - private CollBookBean createCollBookBean(){ - CollBookBean bean = new CollBookBean(); - bean.setId(String.valueOf(getBook().getId())); - bean.setTitle(getBook().getTitle()); - bean.setAuthor(getBook().getAuthor()); - bean.setShortIntro(getBook().getDescription()); - bean.setCover(getBook().getCover()); - bean.setInclude_image(getBook().getInclude_image()); - if (getLast_article()!=null){ - bean.setUpdated(String.valueOf(getLast_article().getCreate_time())); - bean.setLastChapter(getLast_article().getTitle()); - } - return bean; - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/CategoryTypeResp.kt b/app/src/main/java/com/novel/read/model/protocol/CategoryTypeResp.kt deleted file mode 100644 index 634bbcc..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/CategoryTypeResp.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.novel.read.model.protocol - -import com.novel.read.base.MyApp -import com.novel.read.utlis.StringUtils - -import java.io.Serializable - -class CategoryTypeResp : Serializable { - - - var category: List = arrayListOf() - - class CategoryBean { - /** - * id : 1 - * title : 玄幻奇幻 - * cover : - */ - - var id: Int = 0 - var title: String = "" - get() = StringUtils.convertCC(field) - var cover: String = "" - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/ChapterInfoPackage.kt b/app/src/main/java/com/novel/read/model/protocol/ChapterInfoPackage.kt deleted file mode 100644 index c8177f3..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/ChapterInfoPackage.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.novel.read.model.protocol - -import com.novel.read.model.db.ChapterInfoBean - -import java.io.Serializable - -class ChapterInfoPackage : Serializable { - - var article: List = ArrayList() - - -} diff --git a/app/src/main/java/com/novel/read/model/protocol/HotSearchResp.kt b/app/src/main/java/com/novel/read/model/protocol/HotSearchResp.kt deleted file mode 100644 index 4f0b97a..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/HotSearchResp.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.novel.read.model.protocol - -import java.io.Serializable -import java.util.ArrayList - -class HotSearchResp : Serializable { - - - var key: List = arrayListOf() -} diff --git a/app/src/main/java/com/novel/read/model/protocol/MarkResp.kt b/app/src/main/java/com/novel/read/model/protocol/MarkResp.kt deleted file mode 100644 index b9a0209..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/MarkResp.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.novel.read.model.protocol - -class MarkResp { - - var sign: List? = null - - class SignBean { - /** - * id : 8 - * uid : 1 - * book_id : 1 - * article_id : 1 - * words : 0 - * create_time : 1561450031 - * update_time : 1561450031 - * delete_time : null - */ - - var id: Int = 0 - var uid: Int = 0 - var book_id: Int = 0 - var article_id: Int = 0 - var words: Int = 0 - var create_time: Int = 0 - var update_time: Int = 0 - var delete_time: Any? = null - var content: String? = null - get() = if (field == null) "" else field - var isEdit: Boolean = false - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/RankByUpdateResp.java b/app/src/main/java/com/novel/read/model/protocol/RankByUpdateResp.java deleted file mode 100644 index 43aee00..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/RankByUpdateResp.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.novel.read.model.protocol; - -import com.novel.read.base.MyApp; -import com.novel.read.utlis.StringUtils; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * create by zlj on 2019/6/20 - * describe: - */ -public class RankByUpdateResp implements Serializable { - - - private List book; - - public List getBook() { - if (book == null) { - return new ArrayList<>(); - } - return book; - } - - public void setBook(List book) { - this.book = book; - } - - public static class BookBean { - /** - * id : 2446 - * title : 吞天记 - * cover : http://api.duoduvip.com/uploads/nocover.jpg - * description :     炎黄古域,浩瀚无边,无尽岁月中诞生诸多太古仙妖,撕裂天地,脱三界五行。更有万物神灵,天生神体,穿梭虚空,逆乱阴阳,无所不能。
    当今乃仙道盛世,万法通天,众生修道,妖孽横行!
    东吴太子吴煜,于绝境中得东方绝世战仙之衣钵,自此横空出世,逆天崛起。
    亿万世人心中,他是普渡众生的帝仙!
    漫天仙佛眼中,他是吞噬天地的妖魔!
    ……
    想和作者探讨剧情,加入讨论群,请加我微信:fengqingyang17k。或搜风青阳。
    各位书友要是觉得《吞天记》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!吞天记最新章节,吞天记无弹窗,吞天记全文阅读. - * hot : 41926 - * like : 65 - * author : 风青阳 - * create_time : 1561001132 - */ - - private int id; - private String title; - private String cover; - private String description; - private int hot; - private int like; - private String author; - private int create_time; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getTitle() { - return title == null ? "" : StringUtils.INSTANCE.convertCC(title); - } - - public void setTitle(String title) { - this.title = title; - } - - public String getCover() { - return cover; - } - - public void setCover(String cover) { - this.cover = cover; - } - - public String getDescription() { - return description == null ? "" : StringUtils.INSTANCE.convertCC(StringUtils.INSTANCE.delete160(description)); - } - - public void setDescription(String description) { - this.description = description; - } - - public int getHot() { - return hot; - } - - public void setHot(int hot) { - this.hot = hot; - } - - public int getLike() { - return like; - } - - public void setLike(int like) { - this.like = like; - } - - public String getAuthor() { - return author == null ? "" : StringUtils.INSTANCE.convertCC(author); - } - - public void setAuthor(String author) { - this.author = author; - } - - public int getCreate_time() { - return create_time; - } - - public void setCreate_time(int create_time) { - this.create_time = create_time; - } - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/RecommendBookResp.kt b/app/src/main/java/com/novel/read/model/protocol/RecommendBookResp.kt deleted file mode 100644 index ac4d6cf..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/RecommendBookResp.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.novel.read.model.protocol - - -import com.novel.read.base.MyApp -import com.novel.read.utlis.StringUtils - -import java.io.Serializable -import java.util.ArrayList - -/** - * create by zlj on 2019/6/18 - * describe: - */ -class RecommendBookResp : Serializable { - - - var book: List = ArrayList() - - class BookBean { - /** - * id : 139 - * title : 丹师剑宗 - * cover : http://dev.duoduvip.com/uploads/20190611/b81d831d3310041846444dacca57cef9.png - * description : - * hot : 83146 - * like : 64 - * author : 伯爵 - * create_time : 1560191131 - */ - - var id: Int = 0 - var title: String? = null - get() = if (field == null) "" else StringUtils.convertCC(field!!) - var cover: String? = null - var description: String? = null - get() = if (field == null) "" else StringUtils.convertCC(StringUtils.delete160(field!!)) - var hot: Int = 0 - var like: Int = 0 - var author: String? = null - get() = if (field == null) "" else StringUtils.convertCC(field!!) - var create_time: Int = 0 - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/RecommendListResp.kt b/app/src/main/java/com/novel/read/model/protocol/RecommendListResp.kt deleted file mode 100644 index e7b808c..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/RecommendListResp.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.novel.read.model.protocol - -import com.novel.read.base.MyApp -import com.novel.read.utlis.StringUtils - -import java.io.Serializable -import java.util.ArrayList - -/** - * create by zlj on 2019/6/19 - * describe: - */ -class RecommendListResp : Serializable { - - - var list: List = ArrayList() - - class ListBean { - /** - * id : 5 - * book_id : 10 - * type : 1 - * gender : 1 - * sort : 10 - * create_time : 1560129944 - * update_time : 1560129944 - * delete_time : null - * book_title : 重生之末世宝典 - * book_cover : http://api.duoduvip.com/uploads/nocover.jpg - */ - - var id: Int = 0 - var book_id: Int = 0 - var type: Int = 0 - var gender: Int = 0 - var sort: Int = 0 - var create_time: Int = 0 - var update_time: Int = 0 - var delete_time: Any? = null - var book_title: String? = null - get() = if (field == null) "" else StringUtils.convertCC(field!!) - var book_cover: String? = null - get() = if (field == null) "" else field - var author: String? = null - get() = if (field == null) "" else StringUtils.convertCC(field!!) - var description: String? = null - get() = if (field == null) "" else StringUtils.convertCC(StringUtils.delete160(field!!)) - private var hot: Int = 0 - private var like: Int = 0 - - fun getHot(): String { - return hot.toString() - } - - fun setHot(hot: Int) { - this.hot = hot - } - - fun getLike(): String { - return "$like%" - } - - fun setLike(like: Int) { - this.like = like - } - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/SearchResp.kt b/app/src/main/java/com/novel/read/model/protocol/SearchResp.kt deleted file mode 100644 index 3065eb3..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/SearchResp.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.novel.read.model.protocol - -import com.novel.read.utlis.StringUtils - -import java.io.Serializable -import java.util.ArrayList - -class SearchResp : Serializable { - - - /** - * book : [{"id":92,"title":"极品全能狂少","category_id":3,"cover":"http://dev.duoduvip.com/uploads/20190610/64512ebcd7e79923bc59ffc1d3afb597.png","description":"","hot":99437,"like":41,"author":"一支烟的快感","create_time":1560159443},{"id":170,"title":"抬棺匠","category_id":1,"cover":"http://dev.duoduvip.com/uploads/20190611/19cfa1ff96a4bec66b14e16b997ffba9.png","description":"","hot":99184,"like":54,"author":"陈八仙","create_time":1560205316},{"id":47,"title":"都市超级医圣","category_id":3,"cover":"http://dev.duoduvip.com/uploads/20190610/868b69fdf75dc303ca70fef4ccc8bc87.png","description":" 财法侣地,修行其实是一项非常耗钱的奢侈运动。无意中得到传说中道教学家,炼丹家,医药家葛洪的传承,淳朴的山里人葛东旭开始努力赚钱。当大多数人还在读高中时,他为了炼丹修行已经开始一边读书一边赚钱。当大多数人读大学还在为交女朋友的开销愁时,他已经是一名老板。当大多数人大学毕业在为找工作四处投简历,当富二代开着跑车,在美女面前炫耀时,他已经是一名级富一代,当然还是一名大隐隐于市的至尊医圣。

各位书友要是觉得《都市超级医圣》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!都市超级医圣最新章节,都市超级医圣无弹窗,都市超级医圣全文阅读.","hot":99056,"like":21,"author":"断桥残雪","create_time":1560129236},{"id":105,"title":"神医高手在都市","category_id":3,"cover":"http://dev.duoduvip.com/uploads/20190610/ccab1913cdaf9aee2cfeaef84910a700.png","description":"","hot":98517,"like":28,"author":"复仇","create_time":1560167691},{"id":21,"title":"夜少的心尖宝贝","category_id":1,"cover":"http://dev.duoduvip.com/uploads/20190609/c0f5c2ff7fa532e4bd399625e5edacf3.png","description":" 简介:

为了能正大光明的睡乔小姐,夜少不惜采用了108种追妻方式结果有两个小萝卜头冒了出来,对他说,\u201c帅叔叔,你想追我妈咪吗我们可以教你哦\u201d夜少掀桌,\u201c叫什么叔叔乖,叫爹地\u201d夜少一生最风光得意的事情就是睡了乔小姐,留下了种,让她给自己生了两个宝贝儿子,在她的身上永恒的打上了自己的烙印夜少漫漫追妻之旅,甜甜甜,超甜宠文,1v1

各位书友要是觉得《夜少的心尖宝贝》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!夜少的心尖宝贝最新章节,夜少的心尖宝贝无弹窗,夜少的心尖宝贝全文阅读.","hot":97296,"like":64,"author":"慕欢颜","create_time":1560095819},{"id":102,"title":"万域灵神","category_id":4,"cover":"http://dev.duoduvip.com/uploads/20190610/847703596e2af187311bb9f5ab7c26b4.png","description":"","hot":97157,"like":56,"author":"乾多多","create_time":1560165904},{"id":87,"title":"至尊剑皇","category_id":4,"cover":"http://dev.duoduvip.com/uploads/20190610/711a87b0df3446885739845fba33fce4.png","description":"","hot":96684,"like":23,"author":"半步沧桑","create_time":1560156886},{"id":166,"title":"生活在美利坚的森林游侠","category_id":3,"cover":"http://dev.duoduvip.com/uploads/20190611/d663219f43a8bbba3d0718637fa0724a.png","description":"","hot":96427,"like":77,"author":"酱疙瘩","create_time":1560203771},{"id":171,"title":"三界红包群","category_id":3,"cover":"http://dev.duoduvip.com/uploads/nocover.jpg","description":"","hot":96362,"like":47,"author":"小教主","create_time":1560205922},{"id":131,"title":"命之途","category_id":2,"cover":"http://dev.duoduvip.com/uploads/nocover.jpg","description":"","hot":94835,"like":27,"author":"莫若梦兮","create_time":1560186387}] - * limit : 10 - */ - - var limit: Int = 0 - var book: List = ArrayList() - - class BookBean { - /** - * id : 92 - * title : 极品全能狂少 - * category_id : 3 - * cover : http://dev.duoduvip.com/uploads/20190610/64512ebcd7e79923bc59ffc1d3afb597.png - * description : - * hot : 99437 - * like : 41 - * author : 一支烟的快感 - * create_time : 1560159443 - */ - - var id: Int = 0 - var title: String? = null - get() = if (field == null) "" else StringUtils.convertCC(field!!) - var category_id: Int = 0 - var cover: String? = null - get() = if (field == null) "" else field - var description: String? = null - get() = if (field == null) "" else StringUtils.convertCC(StringUtils.delete160(field!!)) - var hot: Int = 0 - var like: Int = 0 - var author: String? = null - get() = if (field == null) "" else StringUtils.convertCC(field!!) - var create_time: Int = 0 - } -} diff --git a/app/src/main/java/com/novel/read/model/protocol/UidResp.kt b/app/src/main/java/com/novel/read/model/protocol/UidResp.kt deleted file mode 100644 index 32c6468..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/UidResp.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.novel.read.model.protocol - -class UidResp { - - /** - * uid : 3 - */ - - var uid: Int = 0 -} diff --git a/app/src/main/java/com/novel/read/model/protocol/VersionResp.kt b/app/src/main/java/com/novel/read/model/protocol/VersionResp.kt deleted file mode 100644 index aa214d7..0000000 --- a/app/src/main/java/com/novel/read/model/protocol/VersionResp.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.novel.read.model.protocol - -/** - * create by 赵利君 on 2019/6/25 - * describe: - */ -class VersionResp { - - /** - * version : {"id":2,"version":"1.0.0","size":"5096","content":"正式上线","download":"https://play.google.com/store/apps/details?id=com.freebook.bookreader","coerce":1,"status":1,"push_time":1560060702,"create_time":1560060772,"update_time":1560752842,"delete_time":null} - */ - - var version: VersionBean = VersionBean() - - class VersionBean { - /** - * id : 2 - * version : 1.0.0 - * size : 5096 - * content : 正式上线 - * download : https://play.google.com/store/apps/details?id=com.freebook.bookreader - * coerce : 1 - * status : 1 - * push_time : 1560060702 - * create_time : 1560060772 - * update_time : 1560752842 - * delete_time : null - */ - - var id: Int = 0 - var version: String? = null - var size: String? = null - var content: String? = null - var download: String? = null - var coerce: Int = 0 - var status: Int = 0 - var push_time: Int = 0 - var create_time: Int = 0 - var update_time: Int = 0 - var delete_time: Any? = null - } -} diff --git a/app/src/main/java/com/novel/read/network/ServiceCreator.kt b/app/src/main/java/com/novel/read/network/ServiceCreator.kt new file mode 100644 index 0000000..97a8828 --- /dev/null +++ b/app/src/main/java/com/novel/read/network/ServiceCreator.kt @@ -0,0 +1,143 @@ +package com.novel.read.network + +import android.util.Log +import com.novel.read.network.api.BookService +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import okio.Buffer +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.scalars.ScalarsConverterFactory +import java.io.IOException +import java.net.URLEncoder +import java.nio.charset.Charset +import java.util.* +import java.util.concurrent.TimeUnit +import kotlin.jvm.Throws + + +object ServiceCreator { + + private const val BASE_URL = "http://172.104.61.64:8009/" + + private val httpClient = OkHttpClient.Builder() + .connectTimeout(15, TimeUnit.SECONDS) + .writeTimeout(15, TimeUnit.SECONDS) + .readTimeout(15, TimeUnit.SECONDS) + .addInterceptor(LoggingInterceptor()) + .addInterceptor(HeaderInterceptor()) + + private val builder = Retrofit.Builder() + .baseUrl(BASE_URL) + .client(httpClient.build()) + .addConverterFactory(ScalarsConverterFactory.create()) + .addConverterFactory(GsonConverterFactory.create()) + + + private val retrofit = builder.build() + + fun create(serviceClass: Class): T = retrofit.create(serviceClass) + + /**ApiService*/ + val apiService: BookService = retrofit.create(BookService::class.java) + + private val builder1 = Retrofit.Builder() + .baseUrl("http://yijianda8.com/") + .client(httpClient.build()) + .addConverterFactory(ScalarsConverterFactory.create()) + .addConverterFactory(GsonConverterFactory.create()) + + private val retrofit1 = builder1.build() + val apiService1: BookService = retrofit1.create(BookService::class.java) + + class LoggingInterceptor : Interceptor { + + @Throws(IOException::class) + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val t1 = System.nanoTime() + Log.e(TAG, "request: ${request.url()} \n ${getRequestInfo(request)}") + + val response = chain.proceed(request) + + val t2 = System.nanoTime() + Log.e( + TAG, + "response for ${response.request() + .url()} in ${(t2 - t1) / 1e6} ms\n${getResponseInfo(response)}" + ) + return response + } + + /** + * 打印返回消息 + * @param response 返回的对象 + */ + private fun getResponseInfo(response: Response?): String? { + var str = "" + if (response == null || !response.isSuccessful) { + return str + } + val responseBody = response.body() + val contentLength = responseBody!!.contentLength() + val source = responseBody.source() + try { + source.request(Long.MAX_VALUE) // Buffer the entire body. + } catch (e: IOException) { + e.printStackTrace() + } + val buffer: Buffer = source.buffer + val charset: Charset = Charset.forName("utf-8") + if (contentLength != 0L) { + str = buffer.clone().readString(charset) + } + return str + } + + /** + * 打印请求体 + * @param request 请求的对象 + */ + private fun getRequestInfo(request: Request?): String? { + val requestBody = request!!.body() + val buffer = Buffer() + try { + if(requestBody!=null) { + requestBody.writeTo(buffer) + }else{ + return "" + } + } catch (e: IOException) { + e.printStackTrace() + return "" + } + + var charset = Charset.forName("UTF-8") + val contentType = requestBody!!.contentType() + if (contentType != null) { + charset = contentType.charset(Charset.forName("UTF-8")) + } + + return buffer.readString(charset) + } + + companion object { + const val TAG = "LoggingInterceptor" + } + } + + class HeaderInterceptor : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val original = chain.request() + val request = original.newBuilder().apply { + header("model", "Android") + header("If-Modified-Since", URLEncoder.encode("${Date()}", "utf-8")) + header("User-Agent", System.getProperty("http.agent") ?: "unknown") + }.build() + return chain.proceed(request) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/network/api/ApiException.kt b/app/src/main/java/com/novel/read/network/api/ApiException.kt new file mode 100644 index 0000000..116a6fe --- /dev/null +++ b/app/src/main/java/com/novel/read/network/api/ApiException.kt @@ -0,0 +1,3 @@ +package com.novel.read.network.api + +class ApiException(var code: Int, override var message: String) : RuntimeException() \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/network/api/ApiResult.kt b/app/src/main/java/com/novel/read/network/api/ApiResult.kt new file mode 100644 index 0000000..67eefea --- /dev/null +++ b/app/src/main/java/com/novel/read/network/api/ApiResult.kt @@ -0,0 +1,18 @@ +package com.novel.read.network.api + +import androidx.annotation.Keep + +@Keep +data class ApiResult( + val code: Int, + val message: String, + private val data: T? +) { + fun apiData(): T { + if (code == 200 && data != null) { + return data + } else { + throw ApiException(code, message) + } + } +} diff --git a/app/src/main/java/com/novel/read/network/api/BookService.kt b/app/src/main/java/com/novel/read/network/api/BookService.kt new file mode 100644 index 0000000..2f08735 --- /dev/null +++ b/app/src/main/java/com/novel/read/network/api/BookService.kt @@ -0,0 +1,60 @@ +package com.novel.read.network.api + +import com.novel.read.data.model.* +import okhttp3.RequestBody +import okhttp3.ResponseBody +import retrofit2.http.* + +interface BookService { + + @POST("api/book/bookSearch") + suspend fun searchBook( + @Body body: RequestBody + ): ApiResult> + + @POST("api/book/searchTermsList") + suspend fun hotKey(): ApiResult> + + @POST("api/book/bookHome") + suspend fun getHomeInfo(@Body body: RequestBody): ApiResult + + @POST("api/book/bookDetail") + suspend fun getBookInfo(@Body body: RequestBody):ApiResult + + @POST("api/book/bookChapterList") + suspend fun getDirectory(@Body body: RequestBody):ApiResult + + @POST("api/book/bookChapterDetail") + suspend fun getChapterContent(@Body body: RequestBody):ApiResult + + @POST("api/book/typeList") + suspend fun getChannelList(): ApiResult + + @POST("api/book/BookList") + suspend fun getBookList(@Body body: RequestBody): ApiResult> + + @POST("api/book/bookRankQuery") + suspend fun getBooRank(@Body body: RequestBody): ApiResult> + + @POST("api/book/similarRecommend") + suspend fun getSimilarRecommend(@Body body: RequestBody): ApiResult> + + @POST("api/book/feedback") + suspend fun feedback(@Body body: RequestBody): ApiResult + + @POST("api/edition/editionUpdate") + suspend fun appUpdate(@Body body: RequestBody): ApiResult + + @POST("api/user/googleLogin") + suspend fun googleLogin(@Body loginReq: LoginReq): ApiResult + + @POST("api/order/getCommodityList") + suspend fun getGoods(): ApiResult> + + @POST("api/order/addBookOrder") + suspend fun buyVip(): ApiResult> + + @Streaming + @GET() + suspend fun getImage(@Url fileUrl: String): ResponseBody +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/network/repository/BookRepository.kt b/app/src/main/java/com/novel/read/network/repository/BookRepository.kt new file mode 100644 index 0000000..744094f --- /dev/null +++ b/app/src/main/java/com/novel/read/network/repository/BookRepository.kt @@ -0,0 +1,126 @@ +package com.novel.read.network.repository + +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.data.model.ChapterContentResp +import com.novel.read.data.model.LoginReq +import com.novel.read.network.ServiceCreator +import com.novel.read.utils.ext.GSON +import com.novel.read.help.coroutine.Coroutine +import kotlinx.coroutines.* +import okhttp3.MediaType +import okhttp3.RequestBody +import kotlin.coroutines.CoroutineContext + +class BookRepository { + + suspend fun getChannelList() = withContext(Dispatchers.IO) { + ServiceCreator.apiService.getChannelList().apiData() + } + + suspend fun getBookInfo(bookId: Long) = withContext(Dispatchers.IO) { + val map = HashMap() + map["bookId"] = bookId + ServiceCreator.apiService.getBookInfo(mapToBody(map)).apiData() + } + + suspend fun getDirectory(bookId: Long) = withContext(Dispatchers.IO) { + val map = HashMap() + map["bookId"] = bookId + ServiceCreator.apiService.getDirectory(mapToBody(map)).apiData() + } + + + fun getContents( + scope: CoroutineScope, + book: Book, + bookChapter: BookChapter, + context: CoroutineContext = Dispatchers.IO + ): Coroutine { + return Coroutine.async(scope, context) { + val map = HashMap() + map["bookId"] = book.bookId + map["chapterId"] = bookChapter.chapterId + getChapterContent(book.bookId, bookChapter.chapterId) + } + } + + private suspend fun getChapterContent(bookId: Long, chapterId: Long): ChapterContentResp { + val map = HashMap() + map["bookId"] = bookId + map["chapterId"] = chapterId + return ServiceCreator.apiService.getChapterContent(mapToBody(map)).apiData() + } + + + suspend fun getBookList(channelId: Long, pageNum: Int, pageSize: Int) = + withContext(Dispatchers.IO) { + val map = HashMap() + map["bookTypeId"] = channelId.toString() + map["pageNum"] = pageNum.toString() + map["pageSize"] = pageSize.toString() + ServiceCreator.apiService.getBookList(mapToBody(map)).apiData() + } + + suspend fun getDailyList(pageNum: Int, pageSize: Int) = + withContext(Dispatchers.IO) { + val map = HashMap() + map["hotStatus"] = "1" + map["pageNum"] = pageNum.toString() + map["pageSize"] = pageSize.toString() + ServiceCreator.apiService.getBookList(mapToBody(map)).apiData() + } + + suspend fun getEndList(pageNum: Int, pageSize: Int) = + withContext(Dispatchers.IO) { + val map = HashMap() + map["endStatus"] = "1" + map["pageNum"] = pageNum.toString() + map["pageSize"] = pageSize.toString() + ServiceCreator.apiService.getBookList(mapToBody(map)).apiData() + } + + + suspend fun getBooRank(pageNum: Int, pageSize: Int, rankType: Int) = + withContext(Dispatchers.IO) { + val map = HashMap() + map["rankType"] = rankType.toString() + map["pageNum"] = pageNum.toString() + map["pageSize"] = pageSize.toString() + ServiceCreator.apiService.getBooRank(mapToBody(map)).apiData() + } + + suspend fun getSimilarRecommend(bookTypeId: Int) = + withContext(Dispatchers.IO) { + val map = HashMap() + map["bookTypeId"] = bookTypeId + ServiceCreator.apiService.getSimilarRecommend(mapToBody(map)).apiData() + } + + suspend fun feedback(content: String) = + withContext(Dispatchers.IO) { + val map = HashMap() + map["content"] = content + ServiceCreator.apiService.feedback(mapToBody(map)).apiData() + } + + suspend fun login(loginReq: LoginReq) = withContext(Dispatchers.IO) { + ServiceCreator.apiService.googleLogin(loginReq).apiData() + } + + suspend fun getGoods() = withContext(Dispatchers.IO) { + ServiceCreator.apiService.getGoods().apiData() + } + + suspend fun buyVip() = withContext(Dispatchers.IO) { + ServiceCreator.apiService.buyVip().apiData() + } + + private fun mapToBody(map: HashMap): RequestBody { + return RequestBody.create( + MediaType.parse("application/json;charset=UTF-8"), + GSON.toJson(map) + ) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/network/repository/HomeRepository.kt b/app/src/main/java/com/novel/read/network/repository/HomeRepository.kt new file mode 100644 index 0000000..544f5f9 --- /dev/null +++ b/app/src/main/java/com/novel/read/network/repository/HomeRepository.kt @@ -0,0 +1,35 @@ +package com.novel.read.network.repository + +import com.novel.read.App +import com.novel.read.constant.AppConst +import com.novel.read.network.ServiceCreator +import com.novel.read.utils.ext.GSON +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.MediaType +import okhttp3.RequestBody + +class HomeRepository { + + + suspend fun getHomeBook(bookClass: Int) = withContext(Dispatchers.IO) { + val map = HashMap() + val books = ServiceCreator.apiService.getHomeInfo(mapToBody(map)).apiData() + books + } + + suspend fun appUpdate() = withContext(Dispatchers.IO) { + val map = HashMap() + map["shellName"] = AppConst.shellName + map["editionCode"] = App.versionName + ServiceCreator.apiService.appUpdate(mapToBody(map)).apiData() + } + + private fun mapToBody(map: HashMap): RequestBody { + return RequestBody.create( + MediaType.parse("application/json;charset=UTF-8"), + GSON.toJson(map) + ) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/network/repository/ImageRepository.kt b/app/src/main/java/com/novel/read/network/repository/ImageRepository.kt new file mode 100644 index 0000000..b1677a4 --- /dev/null +++ b/app/src/main/java/com/novel/read/network/repository/ImageRepository.kt @@ -0,0 +1,12 @@ +package com.novel.read.network.repository + +import com.novel.read.network.ServiceCreator +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class ImageRepository { + + suspend fun getImage(src: String) = withContext(Dispatchers.IO) { + ServiceCreator.apiService1.getImage(src) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/network/repository/SearchRepository.kt b/app/src/main/java/com/novel/read/network/repository/SearchRepository.kt new file mode 100644 index 0000000..498b9a6 --- /dev/null +++ b/app/src/main/java/com/novel/read/network/repository/SearchRepository.kt @@ -0,0 +1,33 @@ +package com.novel.read.network.repository + +import com.hankcs.hanlp.HanLP +import com.novel.read.network.ServiceCreator +import com.novel.read.utils.ext.GSON +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.MediaType +import okhttp3.RequestBody + +class SearchRepository { + + + + suspend fun searchBook(page: Int, pageSize: Int, key: String) = withContext(Dispatchers.IO) { + val map = HashMap() + val key1 = HanLP.convertToSimplifiedChinese(key) + map["pageNum"] = page.toString() + map["pageSize"] = pageSize.toString() + map["searchTerms"] = key1 + val body: RequestBody = + RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), GSON.toJson(map)) + val books = ServiceCreator.apiService.searchBook(body).apiData() + books + } + + suspend fun hotKey() = withContext(Dispatchers.IO) { + val books = ServiceCreator.apiService.hotKey().apiData() + books + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/receiver/MediaButtonReceiver.kt b/app/src/main/java/com/novel/read/receiver/MediaButtonReceiver.kt new file mode 100644 index 0000000..c3d5060 --- /dev/null +++ b/app/src/main/java/com/novel/read/receiver/MediaButtonReceiver.kt @@ -0,0 +1,92 @@ +package com.novel.read.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.view.KeyEvent +import com.novel.read.App +import com.novel.read.constant.EventBus +import com.novel.read.data.db.entity.Book +import com.novel.read.help.ActivityHelp +import com.novel.read.service.BaseReadAloudService +import com.novel.read.service.help.ReadAloud +import com.novel.read.ui.MainActivity +import com.novel.read.ui.read.ReadBookActivity +import com.novel.read.utils.ext.* +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Dispatchers.Main +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + + +/** + * Created by zlj on 2019/1/6. + * 监听耳机键 + */ + +class MediaButtonReceiver : BroadcastReceiver() { + + companion object { + + fun handleIntent(context: Context, intent: Intent): Boolean { + val intentAction = intent.action + if (Intent.ACTION_MEDIA_BUTTON == intentAction) { + val keyEvent = + intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) ?: return false + val keycode: Int = keyEvent.keyCode + val action: Int = keyEvent.action + if (action == KeyEvent.ACTION_DOWN) { + when (keycode) { + KeyEvent.KEYCODE_MEDIA_PREVIOUS -> { + } + KeyEvent.KEYCODE_MEDIA_NEXT -> { + } + else -> readAloud(context) + } + } + } + return true + } + + private fun readAloud(context: Context) { + when { + BaseReadAloudService.isRun -> if (BaseReadAloudService.isPlay()) { + ReadAloud.pause(context) + } else { + ReadAloud.resume(context) + } + + ActivityHelp.isExist(ReadBookActivity::class.java) -> + postEvent(EventBus.MEDIA_BUTTON, true) + else -> if (context.getPrefBoolean("mediaButtonOnExit", true)) { + GlobalScope.launch(Main) { + val lastBook: Book? = withContext(IO) { + App.db.getBookDao().lastReadBook() + } + lastBook?.let { + if (!ActivityHelp.isExist(MainActivity::class.java)) { + Intent(context, MainActivity::class.java).let { + it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(it) + } + } + Intent(context, ReadBookActivity::class.java).let { + it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + it.putExtra("readAloud", true) + context.startActivity(it) + } + } + } + } + } + } + } + + override fun onReceive(context: Context, intent: Intent) { + if (handleIntent(context, intent) && isOrderedBroadcast) { + abortBroadcast() + } + } + +} diff --git a/app/src/main/java/com/novel/read/service/BaseReadAloudService.kt b/app/src/main/java/com/novel/read/service/BaseReadAloudService.kt new file mode 100644 index 0000000..dd55ab7 --- /dev/null +++ b/app/src/main/java/com/novel/read/service/BaseReadAloudService.kt @@ -0,0 +1,344 @@ +package com.novel.read.service + +import android.app.PendingIntent +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.BitmapFactory +import android.media.AudioFocusRequest +import android.media.AudioManager +import android.os.Handler +import android.support.v4.media.session.MediaSessionCompat +import android.support.v4.media.session.PlaybackStateCompat +import androidx.annotation.CallSuper +import androidx.core.app.NotificationCompat +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BaseService +import com.novel.read.constant.* +import com.novel.read.data.read.TextChapter +import com.novel.read.help.IntentDataHelp +import com.novel.read.help.IntentHelp +import com.novel.read.help.MediaHelp +import com.novel.read.receiver.MediaButtonReceiver +import com.novel.read.service.help.ReadBook +import com.novel.read.ui.read.ReadBookActivity +import com.novel.read.utils.ext.* + + +abstract class BaseReadAloudService : BaseService(), + AudioManager.OnAudioFocusChangeListener { + + companion object { + var isRun = false + var timeMinute: Int = 0 + var pause = true + + fun isPlay(): Boolean { + return isRun && !pause + } + } + + internal val handler = Handler() + private lateinit var audioManager: AudioManager + private var mFocusRequest: AudioFocusRequest? = null + private var broadcastReceiver: BroadcastReceiver? = null + private lateinit var mediaSessionCompat: MediaSessionCompat + private var title: String = "" + private var subtitle: String = "" + internal val contentList = arrayListOf() + internal var nowSpeak: Int = 0 + internal var readAloudNumber: Int = 0 + internal var textChapter: TextChapter? = null + internal var pageIndex = 0 + private val dsRunnable: Runnable = Runnable { doDs() } + + override fun onCreate() { + super.onCreate() + isRun = true + audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager + mFocusRequest = MediaHelp.getFocusRequest(this) + mediaSessionCompat = MediaSessionCompat(this, "readAloud") + initMediaSession() + initBroadcastReceiver() + upNotification() + upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) + } + + override fun onDestroy() { + super.onDestroy() + isRun = false + pause = true + unregisterReceiver(broadcastReceiver) + postEvent(EventBus.ALOUD_STATE, Status.STOP) + upMediaSessionPlaybackState(PlaybackStateCompat.STATE_STOPPED) + mediaSessionCompat.release() + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + intent?.action?.let { action -> + when (action) { + IntentAction.play -> { + title = intent.getStringExtra("title") ?: "" + subtitle = intent.getStringExtra("subtitle") ?: "" + pageIndex = intent.getIntExtra("pageIndex", 0) + newReadAloud( + intent.getStringExtra("dataKey"), + intent.getBooleanExtra("play", true) + ) + } + IntentAction.pause -> pauseReadAloud(true) + IntentAction.resume -> resumeReadAloud() + IntentAction.upTtsSpeechRate -> upSpeechRate(true) + IntentAction.prevParagraph -> prevP() + IntentAction.nextParagraph -> nextP() + IntentAction.addTimer -> addTimer() + IntentAction.setTimer -> setTimer(intent.getIntExtra("minute", 0)) + else -> stopSelf() + } + } + return super.onStartCommand(intent, flags, startId) + } + + @CallSuper + open fun newReadAloud(dataKey: String?, play: Boolean) { + dataKey?.let { + textChapter = IntentDataHelp.getData(dataKey) + textChapter?.let { textChapter -> + nowSpeak = 0 + readAloudNumber = textChapter.getReadLength(pageIndex) + contentList.clear() + if (getPrefBoolean(PreferKey.readAloudByPage)) { + for (index in pageIndex..textChapter.lastIndex) { + textChapter.page(index)?.text?.split("\n")?.let { + contentList.addAll(it) + } + } + } else { + textChapter.getUnRead(pageIndex).split("\n").forEach { + if (it.isNotEmpty()) { + contentList.add(it) + } + } + } + if (play) play() + } ?: stopSelf() + } ?: stopSelf() + } + + open fun play() { + pause = false + upNotification() + postEvent(EventBus.ALOUD_STATE, Status.PLAY) + } + + @CallSuper + open fun pauseReadAloud(pause: Boolean) { + BaseReadAloudService.pause = pause + upNotification() + upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PAUSED) + postEvent(EventBus.ALOUD_STATE, Status.PAUSE) + } + + @CallSuper + open fun resumeReadAloud() { + pause = false + upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) + if (timeMinute > 1) { + doDs() + } + } + + abstract fun upSpeechRate(reset: Boolean = false) + + abstract fun prevP() + + abstract fun nextP() + + private fun setTimer(minute: Int) { + timeMinute = minute + if (minute > 0) { + handler.removeCallbacks(dsRunnable) + handler.postDelayed(dsRunnable, 60000) + } + upNotification() + } + + private fun addTimer() { + if (timeMinute == 180) { + timeMinute = 0 + handler.removeCallbacks(dsRunnable) + } else { + timeMinute += 10 + if (timeMinute > 180) timeMinute = 180 + handler.removeCallbacks(dsRunnable) + handler.postDelayed(dsRunnable, 60000) + } + postEvent(EventBus.TTS_DS, timeMinute) + upNotification() + } + + /** + * 定时 + */ + private fun doDs() { + if (!pause) { + timeMinute-- + if (timeMinute == 0) { + stopSelf() + } else if (timeMinute > 0) { + handler.postDelayed(dsRunnable, 60000) + } + } + postEvent(EventBus.TTS_DS, timeMinute) + upNotification() + } + + /** + * @return 音频焦点 + */ + fun requestFocus(): Boolean { + return MediaHelp.requestFocus(audioManager, this, mFocusRequest) + } + + /** + * 更新媒体状态 + */ + private fun upMediaSessionPlaybackState(state: Int) { + mediaSessionCompat.setPlaybackState( + PlaybackStateCompat.Builder() + .setActions(MediaHelp.MEDIA_SESSION_ACTIONS) + .setState(state, nowSpeak.toLong(), 1f) + .build() + ) + } + + /** + * 初始化MediaSession, 注册多媒体按钮 + */ + private fun initMediaSession() { + mediaSessionCompat.setCallback(object : MediaSessionCompat.Callback() { + override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { + return MediaButtonReceiver.handleIntent(this@BaseReadAloudService, mediaButtonEvent) + } + }) + mediaSessionCompat.setMediaButtonReceiver( + PendingIntent.getBroadcast( + this, + 0, + Intent( + Intent.ACTION_MEDIA_BUTTON, + null, + App.INSTANCE, + MediaButtonReceiver::class.java + ), + PendingIntent.FLAG_CANCEL_CURRENT + ) + ) + mediaSessionCompat.isActive = true + } + + /** + * 断开耳机监听 + */ + private fun initBroadcastReceiver() { + broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (AudioManager.ACTION_AUDIO_BECOMING_NOISY == intent.action) { + pauseReadAloud(true) + } + } + } + val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY) + registerReceiver(broadcastReceiver, intentFilter) + } + + /** + * 音频焦点变化 + */ + override fun onAudioFocusChange(focusChange: Int) { + when (focusChange) { + AudioManager.AUDIOFOCUS_GAIN -> { + // 重新获得焦点, 可做恢复播放,恢复后台音量的操作 + if (!pause) resumeReadAloud() + } + AudioManager.AUDIOFOCUS_LOSS -> { + // 永久丢失焦点除非重新主动获取,这种情况是被其他播放器抢去了焦点, 为避免与其他播放器混音,可将音乐暂停 + } + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { + // 暂时丢失焦点,这种情况是被其他应用申请了短暂的焦点,可压低后台音量 + if (!pause) pauseReadAloud(false) + } + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { + // 短暂丢失焦点,这种情况是被其他应用申请了短暂的焦点希望其他声音能压低音量(或者关闭声音)凸显这个声音(比如短信提示音), + } + } + } + + /** + * 更新通知 + */ + private fun upNotification() { + var nTitle: String = when { + pause -> getString(R.string.read_aloud_pause) + timeMinute in 1..180 -> getString( + R.string.read_aloud_timer, + timeMinute + ) + else -> getString(R.string.read_aloud_t) + } + nTitle += ": $title" + var nSubtitle = subtitle + if (subtitle.isEmpty()) + nSubtitle = getString(R.string.read_aloud_s) + val builder = NotificationCompat.Builder(this, AppConst.channelIdReadAloud) + .setSmallIcon(R.drawable.ic_volume_up) + .setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.icon_read_book)) + .setOngoing(true) + .setContentTitle(nTitle) + .setContentText(nSubtitle) + .setContentIntent( + IntentHelp.activityPendingIntent(this, "activity") + ) + if (pause) { + builder.addAction( + R.drawable.ic_play_24dp, + getString(R.string.resume), + aloudServicePendingIntent(IntentAction.resume) + ) + } else { + builder.addAction( + R.drawable.ic_pause_24dp, + getString(R.string.pause), + aloudServicePendingIntent(IntentAction.pause) + ) + } + builder.addAction( + R.drawable.ic_stop_black_24dp, + getString(R.string.stop), + aloudServicePendingIntent(IntentAction.stop) + ) + builder.addAction( + R.drawable.ic_time_add_24dp, + getString(R.string.set_timer), + aloudServicePendingIntent(IntentAction.addTimer) + ) + builder.setStyle( + androidx.media.app.NotificationCompat.MediaStyle() + .setShowActionsInCompactView(0, 1, 2) + ) + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + val notification = builder.build() + startForeground(AppConst.notificationIdRead, notification) + } + + abstract fun aloudServicePendingIntent(actionStr: String): PendingIntent? + + open fun nextChapter() { + ReadBook.upReadStartTime() + if (!ReadBook.moveToNextChapter(true)) { + stopSelf() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/service/CacheBookService.kt b/app/src/main/java/com/novel/read/service/CacheBookService.kt new file mode 100644 index 0000000..9e349fc --- /dev/null +++ b/app/src/main/java/com/novel/read/service/CacheBookService.kt @@ -0,0 +1,281 @@ +package com.novel.read.service + +import android.content.Intent +import android.os.Handler +import android.os.Looper +import androidx.core.app.NotificationCompat +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BaseService +import com.novel.read.constant.AppConst +import com.novel.read.constant.EventBus +import com.novel.read.constant.IntentAction +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.help.AppConfig +import com.novel.read.help.BookHelp +import com.novel.read.help.IntentHelp +import com.novel.read.service.help.CacheBook +import com.novel.read.utils.ext.postEvent +import com.novel.read.help.coroutine.CompositeCoroutine +import com.novel.read.help.coroutine.Coroutine +import com.novel.read.network.repository.BookRepository +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.isActive +import org.jetbrains.anko.toast +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArraySet +import java.util.concurrent.Executors + +class CacheBookService : BaseService() { + private val threadCount = AppConfig.threadCount + private var searchPool = + Executors.newFixedThreadPool(threadCount).asCoroutineDispatcher() + private var tasks = CompositeCoroutine() + private val handler = Handler(Looper.getMainLooper()) + private var runnable: Runnable = Runnable { upDownload() } + private val bookMap = ConcurrentHashMap() + private val downloadMap = ConcurrentHashMap>() + private val downloadCount = ConcurrentHashMap() + private val finalMap = ConcurrentHashMap>() + private val downloadingList = CopyOnWriteArraySet() + private val bookRepository by lazy { BookRepository() } + + @Volatile + private var downloadingCount = 0 + private var notificationContent = App.INSTANCE.getString(R.string.starting_download) + + private val notificationBuilder by lazy { + val builder = NotificationCompat.Builder(this, AppConst.channelIdDownload) + .setSmallIcon(R.drawable.ic_download) + .setOngoing(true) + .setContentTitle(getString(R.string.offline_cache)) + builder.addAction( + R.drawable.ic_stop_black_24dp, + getString(R.string.cancel), + IntentHelp.servicePendingIntent(this, IntentAction.stop) + ) + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + } + + override fun onCreate() { + super.onCreate() + updateNotification(notificationContent) + handler.postDelayed(runnable, 1000) + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + intent?.action?.let { action -> + when (action) { + IntentAction.start -> addDownloadData( + intent.getLongExtra("bookId", 0), + intent.getIntExtra("start", 0), + intent.getIntExtra("end", 0) + ) + IntentAction.remove -> removeDownload(intent.getLongExtra("bookId", 0)) + IntentAction.stop -> stopDownload() + } + } + return super.onStartCommand(intent, flags, startId) + } + + override fun onDestroy() { + tasks.clear() + searchPool.close() + handler.removeCallbacks(runnable) + downloadMap.clear() + finalMap.clear() + super.onDestroy() + postEvent(EventBus.UP_DOWNLOAD, downloadMap) + } + + private fun getBook(bookId: Long): Book? { + var book = bookMap[bookId] + if (book == null) { + synchronized(this) { + book = bookMap[bookId] + if (book == null) { + book = App.db.getBookDao().getBook(bookId.toString()) + if (book == null) { + removeDownload(bookId) + } + } + } + } + return book + } + + private fun addDownloadData(bookId: Long, start: Int, end: Int) { + bookId ?: return + if (downloadMap.containsKey(bookId)) { + updateNotification(getString(R.string.already_in_download)) + toast(R.string.already_in_download) + return + } + downloadCount[bookId] = DownloadCount() + execute { + App.db.getChapterDao().getChapterList(bookId, start, end).let { + if (it.isNotEmpty()) { + val chapters = CopyOnWriteArraySet() + chapters.addAll(it) + downloadMap[bookId] = chapters + } else { + CacheBook.addLog("${getBook(bookId)?.bookName} is empty") + } + } + for (i in 0 until threadCount) { + if (downloadingCount < threadCount) { + download() + } + } + } + } + + private fun removeDownload(bookId: Long?) { + downloadMap.remove(bookId) + finalMap.remove(bookId) + } + + private fun download() { + downloadingCount += 1 + val task = Coroutine.async(this, context = searchPool) { + if (!isActive) return@async + val bookChapter: BookChapter? = synchronized(this@CacheBookService) { + downloadMap.forEach { + it.value.forEach { chapter -> + if (!downloadingList.contains(chapter.chapterId)) { + downloadingList.add(chapter.chapterId) + return@synchronized chapter + } + } + } + return@synchronized null + } + if (bookChapter == null) { + postDownloading(false) + } else { + val book = getBook(bookChapter.bookId) + if (book == null) { + postDownloading(true) + return@async + } + if (!BookHelp.hasContent(book, bookChapter)) { + + bookRepository.getContents(this, book, bookChapter) + .timeout(60000L) + .onSuccess { + val content = it.chapter.chapterContent + if (content.isNotBlank()) { + BookHelp.saveContent(book, bookChapter, content) + } + synchronized(this@CacheBookService) { + downloadCount[book.bookId]?.increaseSuccess() + downloadCount[book.bookId]?.increaseFinished() + downloadCount[book.bookId]?.let { + updateNotification( + it, + downloadMap[book.bookId]?.size, + bookChapter.chapterName + ) + } + val chapterMap = + finalMap[book.bookId] + ?: CopyOnWriteArraySet().apply { + finalMap[book.bookId] = this + } + chapterMap.add(bookChapter) + if (chapterMap.size == downloadMap[book.bookId]?.size) { + downloadMap.remove(book.bookId) + finalMap.remove(book.bookId) + downloadCount.remove(book.bookId) + } + } + }.onError { + synchronized(this) { + downloadingList.remove(bookChapter.chapterId) + } + notificationContent = "getContentError${it.localizedMessage}" + upNotification() + }.onFinally { + postDownloading(true) + } + } else { + //无需下载的,设置为增加成功 + downloadCount[book.bookId]?.increaseSuccess() + downloadCount[book.bookId]?.increaseFinished() + postDownloading(true) + } + } + }.onError { + CacheBook.addLog("ERROR:${it.localizedMessage}") + updateNotification("ERROR:${it.localizedMessage}") + } + tasks.add(task) + } + + /** + * 更新通知 + */ + private fun upNotification() { + notificationBuilder.setContentText(notificationContent) + val notification = notificationBuilder.build() + startForeground(AppConst.notificationIdDownload, notification) + } + + private fun postDownloading(hasChapter: Boolean) { + downloadingCount -= 1 + if (hasChapter) { + download() + } else { + if (downloadingCount < 1) { + stopDownload() + } + } + } + + private fun stopDownload() { + tasks.clear() + stopSelf() + } + + private fun upDownload() { + updateNotification(notificationContent) + postEvent(EventBus.UP_DOWNLOAD, downloadMap) + handler.removeCallbacks(runnable) + handler.postDelayed(runnable, 1000) + } + + private fun updateNotification( + downloadCount: DownloadCount, + totalCount: Int?, + content: String + ) { + notificationContent = + "进度:" + downloadCount.downloadFinishedCount + "/" + totalCount + ",成功:" + downloadCount.successCount + "," + content + } + + /** + * 更新通知 + */ + private fun updateNotification(content: String) { + notificationBuilder.setContentText(content) + val notification = notificationBuilder.build() + startForeground(AppConst.notificationIdDownload, notification) + } + + class DownloadCount { + @Volatile + var downloadFinishedCount = 0 // 下载完成的条目数量 + + @Volatile + var successCount = 0 //下载成功的条目数量 + + fun increaseSuccess() { + ++successCount + } + + fun increaseFinished() { + ++downloadFinishedCount + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/service/DownloadMessage.java b/app/src/main/java/com/novel/read/service/DownloadMessage.java deleted file mode 100644 index 6b35680..0000000 --- a/app/src/main/java/com/novel/read/service/DownloadMessage.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.novel.read.service; - -import com.mango.mangolib.event.BaseEvent; - -public class DownloadMessage extends BaseEvent { - - public String message; - - public DownloadMessage(String message){ - this.message = message; - } -} diff --git a/app/src/main/java/com/novel/read/service/DownloadService.java b/app/src/main/java/com/novel/read/service/DownloadService.java deleted file mode 100644 index ba880f4..0000000 --- a/app/src/main/java/com/novel/read/service/DownloadService.java +++ /dev/null @@ -1,444 +0,0 @@ -package com.novel.read.service; - -import android.content.Context; -import android.content.Intent; -import android.os.Binder; -import android.os.Handler; -import android.os.IBinder; -import android.text.TextUtils; -import android.util.Log; - -import androidx.annotation.Nullable; - -import com.mango.mangolib.event.EventManager; -import com.novel.read.R; -import com.novel.read.base.BaseService; -import com.novel.read.event.DeleteResponseEvent; -import com.novel.read.event.DeleteTaskEvent; -import com.novel.read.event.RxBus; -import com.novel.read.http.AccountManager; -import com.novel.read.model.db.BookChapterBean; -import com.novel.read.model.db.DownloadTaskBean; -import com.novel.read.model.db.dbManage.BookManager; -import com.novel.read.model.db.dbManage.BookRepository; -import com.novel.read.utlis.LocalManageUtil; -import com.novel.read.utlis.NetworkUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; - -public class DownloadService extends BaseService { - private static final String TAG = "DownloadService"; - //加载状态 - private static final int LOAD_ERROR = -1; - private static final int LOAD_NORMAL = 0; - private static final int LOAD_PAUSE = 1; - private static final int LOAD_DELETE = 2; //正在加载时候,用户删除收藏书籍的情况。 - - //下载状态 - public static final int STATUS_CONTINUE = DownloadTaskBean.STATUS_LOADING; - public static final int STATUS_PAUSE = DownloadTaskBean.STATUS_PAUSE; - - //线程池 - private final ExecutorService mSingleExecutor = Executors.newSingleThreadExecutor(); - //加载队列 - private final List mDownloadTaskQueue = Collections.synchronizedList(new ArrayList<>()); - //Handler - private Handler mHandler; - - //包含所有的DownloadTask - private List mDownloadTaskList; - - private OnDownloadListener mDownloadListener; - private boolean isBusy = false; - private boolean isCancel = false; - - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(LocalManageUtil.setLocal(base)); - } - - @Override - public void onCreate() { - super.onCreate(); - mHandler = new Handler(getMainLooper()); - //从数据库中获取所有的任务 - mDownloadTaskList = BookRepository - .getInstance() - .getDownloadTaskList(); - } - - @Nullable - @Override - public IBinder onBind(Intent intent) { - return new TaskBuilder(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - - //接受创建的DownloadTask - Disposable disposable = RxBus.getInstance() - .toObservable(DownloadTaskBean.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - (event) -> { - //判断任务是否为轮询标志 - //判断任务是否存在,并修改任务 - if (TextUtils.isEmpty(event.getBookId()) || !checkAndAlterDownloadTask(event)) { - addToExecutor(event); - } - } - ); - addDisposable(disposable); - - //是否删除数据的问题 - Disposable deleteDisp = RxBus.getInstance() - .toObservable(DeleteTaskEvent.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - (event) -> { - //判断是否该数据存在加载列表中 - boolean isDelete = true; - for (DownloadTaskBean bean : mDownloadTaskQueue) { - if (bean.getBookId().equals(event.getCollBook().getId())) { - isDelete = false; - break; - } - } - //如果不存在则删除List中的task - if (isDelete) { - // - Iterator taskIt = mDownloadTaskList.iterator(); - while (taskIt.hasNext()) { - DownloadTaskBean task = taskIt.next(); - if (task.getBookId().equals(event.getCollBook().getId())) { - taskIt.remove(); - } - } - } - //返回状态 - RxBus.getInstance().post(new DeleteResponseEvent(isDelete, event.getCollBook())); - } - ); - addDisposable(deleteDisp); - return super.onStartCommand(intent, flags, startId); - } - - - /** - * 1. 查看是否任务已存在 - * 2. 修改DownloadTask的 taskName 和 list - * - * @return - */ - private boolean checkAndAlterDownloadTask(DownloadTaskBean newTask) { - boolean isExist = false; - for (DownloadTaskBean downloadTask : mDownloadTaskList) { - //如果不相同则不往下执行,往下执行都是存在相同的情况 - if (!downloadTask.getTaskName().equals(newTask.getTaskName())) continue; - - if (downloadTask.getStatus() == DownloadTaskBean.STATUS_FINISH) { - //判断是否newTask是已完成 - if (downloadTask.getLastChapter() == newTask.getLastChapter()) { - isExist = true; - //发送回去已缓存 - postMessage(getString(R.string.cached)); - } - //判断,是否已完成的章节的起始点比新Task大,如果更大则表示新Task中的该章节已被加载,所以需要剪切 - else if (downloadTask.getLastChapter() > (newTask.getLastChapter() - newTask.getBookChapterList().size())) { - if (downloadTask.getLastChapter() > newTask.getLastChapter()) { - isExist = true; - //发送回去已缓存 - postMessage(getString(R.string.cached)); - } else { - //删除掉已经完成的章节 - List remainChapterBeans = newTask.getBookChapterList().subList(downloadTask.getLastChapter(), newTask.getLastChapter()); - String taskName = newTask.getTaskName() - + getString(R.string.download_chapter_scope, - downloadTask.getLastChapter(), newTask.getLastChapter()); - //重置任务 - newTask.setBookChapters(remainChapterBeans); - newTask.setTaskName(taskName); - - //发送添加到任务的提示 - postMessage(getString(R.string.cache_success)); - } - } - } - //表示该任务已经在 下载、等待、暂停、网络错误中 - else { - isExist = true; - //发送回去:已经在加载队列中。 - postMessage(getString(R.string.task_exist)); - } - } - //重置名字 - if (!isExist) { - String taskName = newTask.getTaskName() - + getString(R.string.download_chapter_scope, - 1, newTask.getLastChapter()); - newTask.setTaskName(taskName); - postMessage(getString(R.string.cache_success)); - } - return isExist; - } - - private void addToExecutor(DownloadTaskBean taskEvent) { - - //判断是否为轮询请求 - if (!TextUtils.isEmpty(taskEvent.getBookId())) { - - if (!mDownloadTaskList.contains(taskEvent)) { - //加入总列表中,表示创建,修改CollBean的状态。 - mDownloadTaskList.add(taskEvent); - } - // 添加到下载队列 - mDownloadTaskQueue.add(taskEvent); - } - - // 从队列顺序取出第一条下载 - if (mDownloadTaskQueue.size() > 0 && !isBusy) { - isBusy = true; - executeTask(mDownloadTaskQueue.get(0)); - } - } - - private void executeTask(DownloadTaskBean taskEvent) { - Runnable runnable = () -> { - - taskEvent.setStatus(DownloadTaskBean.STATUS_LOADING); - - int result = LOAD_NORMAL; - List bookChapterBeans = taskEvent.getBookChapters(); - - //调用for循环,下载数据 //todo -// for (int i=taskEvent.getCurrentChapter(); i { - //TODO:这里文件的名字用的是BookChapter的title,而不是chapter的title。 - //原因是Chapter的title可能重复,但是BookChapter的title不会重复 - //BookChapter的title = 卷名 + 章节名 chapter 的 title 就是章节名。。 - BookRepository.getInstance().saveChapterInfo(folderName, bean.getTitle(), chapterInfo.getBody()); - }, - e -> { - //当前进度加载错误(这里需要判断是什么问题,根据相应的问题做出相应的回答) - Log.e(TAG, "loadChapter: " + e); - //设置加载结果 - result[0] = LOAD_ERROR; - } - ); - addDisposable(disposable); - return result[0]; - } - - private void postDownloadChange(DownloadTaskBean task, int status, String msg) { - if (mDownloadListener != null && msg != null) { - int position = mDownloadTaskList.indexOf(task); - //通过handler,切换回主线程 - mHandler.post(() -> mDownloadListener.onDownloadChange( - position, status, msg) - ); - } - } - - private void postMessage(String msg) { -// RxBus.getInstance().post(new DownloadMessage(msg)); - EventManager.Companion.getInstance().postEvent(new DownloadMessage(msg)); - } - - private void post(DownloadTaskBean task) { - RxBus.getInstance().post(task); - } - - - @Override - public boolean onUnbind(Intent intent) { - - mDownloadListener = null; - return super.onUnbind(intent); - } - - class TaskBuilder extends Binder implements IDownloadManager { - @Override - public List getDownloadTaskList() { - return Collections.unmodifiableList(mDownloadTaskList); - } - - @Override - public void setOnDownloadListener(OnDownloadListener listener) { - mDownloadListener = listener; - } - - @Override - public void setDownloadStatus(String taskName, int status) { - //修改某个Task的状态 - switch (status) { - //加入缓存队列 - case DownloadTaskBean.STATUS_WAIT: - for (int i = 0; i < mDownloadTaskList.size(); ++i) { - DownloadTaskBean bean = mDownloadTaskList.get(i); - if (taskName.equals(bean.getTaskName())) { - bean.setStatus(DownloadTaskBean.STATUS_WAIT); - mDownloadListener.onDownloadResponse(i, DownloadTaskBean.STATUS_WAIT); - addToExecutor(bean); - break; - } - } - break; - //从缓存队列中删除 - case DownloadTaskBean.STATUS_PAUSE: - Iterator it = mDownloadTaskQueue.iterator(); - while (it.hasNext()) { - DownloadTaskBean bean = it.next(); - if (bean.getTaskName().equals(taskName)) { - if (bean.getStatus() == DownloadTaskBean.STATUS_LOADING - && bean.getTaskName().equals(taskName)) { - isCancel = true; - break; - } else { - bean.setStatus(DownloadTaskBean.STATUS_PAUSE); - mDownloadTaskQueue.remove(bean); - int position = mDownloadTaskList.indexOf(bean); - mDownloadListener.onDownloadResponse(position, DownloadTaskBean.STATUS_PAUSE); - break; - } - } - } - break; - } - } - - @Override - public void setAllDownloadStatus(int status) { - //修改所有Task的状态 - } - - //首先判断是否在加载队列中。 - //如果在加载队列中首先判断是否正在下载, - //然后判断是否在完成队列中。 - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - - - public interface IDownloadManager { - List getDownloadTaskList(); - - void setOnDownloadListener(OnDownloadListener listener); - - void setDownloadStatus(String taskName, int status); - - void setAllDownloadStatus(int status); - } - - public interface OnDownloadListener { - /** - * @param pos : Task在item中的位置 - * @param status : Task的状态 - * @param msg: 传送的Msg - */ - void onDownloadChange(int pos, int status, String msg); - - /** - * 回复 - */ - void onDownloadResponse(int pos, int status); - } -} diff --git a/app/src/main/java/com/novel/read/service/HttpReadAloudService.kt b/app/src/main/java/com/novel/read/service/HttpReadAloudService.kt new file mode 100644 index 0000000..0024595 --- /dev/null +++ b/app/src/main/java/com/novel/read/service/HttpReadAloudService.kt @@ -0,0 +1,203 @@ +package com.novel.read.service + +import android.app.PendingIntent +import android.content.Intent +import android.media.MediaPlayer +import com.novel.read.constant.EventBus +import com.novel.read.help.IntentHelp +import com.novel.read.service.help.ReadBook +import com.novel.read.utils.FileUtils +import com.novel.read.utils.ext.* +import com.novel.read.help.coroutine.Coroutine +import kotlinx.coroutines.isActive +import java.io.File +import java.io.FileDescriptor +import java.io.FileInputStream + +class HttpReadAloudService : BaseReadAloudService(), + MediaPlayer.OnPreparedListener, + MediaPlayer.OnErrorListener, + MediaPlayer.OnCompletionListener { + + private val mediaPlayer = MediaPlayer() + private lateinit var ttsFolder: String + private var task: Coroutine<*>? = null + private var playingIndex = -1 + + override fun onCreate() { + super.onCreate() + ttsFolder = externalCacheDir!!.absolutePath + File.separator + "httpTTS" + mediaPlayer.setOnErrorListener(this) + mediaPlayer.setOnPreparedListener(this) + mediaPlayer.setOnCompletionListener(this) + } + + override fun onTaskRemoved(rootIntent: Intent?) { + super.onTaskRemoved(rootIntent) + stopSelf() + } + + override fun onDestroy() { + super.onDestroy() + task?.cancel() + mediaPlayer.release() + } + + override fun newReadAloud(dataKey: String?, play: Boolean) { + mediaPlayer.reset() + playingIndex = -1 + super.newReadAloud(dataKey, play) + } + + override fun play() { + if (contentList.isEmpty()) return + if (nowSpeak == 0) { + downloadAudio() + } else { + val file = getSpeakFile(nowSpeak) + if (file.exists()) { + playAudio(FileInputStream(file).fd) + } + } + } + + private fun downloadAudio() { + task?.cancel() + task = execute { + FileUtils.deleteFile(ttsFolder) + for (index in 0 until contentList.size) { + if (isActive) { +// ReadAloud.httpTTS?.let { +// AnalyzeUrl( +// it.url, +// speakText = contentList[index], +// speakSpeed = AppConfig.ttsSpeechRate +// ).getResponseBytes()?.let { bytes -> +// if (isActive) { +// val file = getSpeakFile(index) +// file.writeBytes(bytes) +// if (index == nowSpeak) { +// @Suppress("BlockingMethodInNonBlockingContext") +// val fis = FileInputStream(file) +// playAudio(fis.fd) +// } +// } +// } +// } + } else { + break + } + } + } + } + + @Synchronized + private fun playAudio(fd: FileDescriptor) { + if (playingIndex != nowSpeak && requestFocus()) { + try { + mediaPlayer.reset() + mediaPlayer.setDataSource(fd) + mediaPlayer.prepareAsync() + playingIndex = nowSpeak + postEvent(EventBus.TTS_PROGRESS, readAloudNumber + 1) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + private fun getSpeakFile(index: Int = nowSpeak): File { + return FileUtils.createFileIfNotExist("${ttsFolder}${File.separator}${index}.mp3") + } + + override fun pauseReadAloud(pause: Boolean) { + super.pauseReadAloud(pause) + mediaPlayer.pause() + } + + override fun resumeReadAloud() { + super.resumeReadAloud() + if (playingIndex == -1) { + play() + } else { + mediaPlayer.start() + } + } + + /** + * 更新朗读速度 + */ + override fun upSpeechRate(reset: Boolean) { + task?.cancel() + mediaPlayer.stop() + playingIndex = -1 + downloadAudio() + } + + /** + * 上一段 + */ + override fun prevP() { + if (nowSpeak > 0) { + mediaPlayer.stop() + nowSpeak-- + readAloudNumber -= contentList[nowSpeak].length.minus(1) + play() + } + } + + /** + * 下一段 + */ + override fun nextP() { + if (nowSpeak < contentList.size - 1) { + mediaPlayer.stop() + readAloudNumber += contentList[nowSpeak].length.plus(1) + nowSpeak++ + play() + } + } + + override fun onPrepared(mp: MediaPlayer?) { + super.play() + if (pause) return + mp?.start() + textChapter?.let { + if (readAloudNumber + 1 > it.getReadLength(pageIndex + 1)) { + pageIndex++ + ReadBook.moveToNextPage() + } + } + postEvent(EventBus.TTS_PROGRESS, readAloudNumber + 1) + } + + override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean { + if (what == -38 && extra == 0) { + return true + } + handler.postDelayed({ + readAloudNumber += contentList[nowSpeak].length + 1 + if (nowSpeak < contentList.lastIndex) { + nowSpeak++ + play() + } else { + nextChapter() + } + }, 50) + return true + } + + override fun onCompletion(mp: MediaPlayer?) { + readAloudNumber += contentList[nowSpeak].length + 1 + if (nowSpeak < contentList.lastIndex) { + nowSpeak++ + play() + } else { + nextChapter() + } + } + + override fun aloudServicePendingIntent(actionStr: String): PendingIntent? { + return IntentHelp.servicePendingIntent(this, actionStr) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/service/TTSReadAloudService.kt b/app/src/main/java/com/novel/read/service/TTSReadAloudService.kt new file mode 100644 index 0000000..1094dec --- /dev/null +++ b/app/src/main/java/com/novel/read/service/TTSReadAloudService.kt @@ -0,0 +1,193 @@ +package com.novel.read.service + +import android.app.PendingIntent +import android.content.Intent +import android.speech.tts.TextToSpeech +import android.speech.tts.UtteranceProgressListener +import com.novel.read.R +import com.novel.read.constant.AppConst +import com.novel.read.constant.EventBus +import com.novel.read.help.AppConfig +import com.novel.read.help.IntentHelp +import com.novel.read.help.MediaHelp +import com.novel.read.service.help.ReadBook +import com.novel.read.utils.ext.* +import kotlinx.coroutines.launch +import org.jetbrains.anko.toast +import java.util.* + +class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener { + + companion object { + private var textToSpeech: TextToSpeech? = null + private var ttsInitFinish = false + + fun clearTTS() { + textToSpeech?.let { + it.stop() + it.shutdown() + } + textToSpeech = null + ttsInitFinish = false + } + } + + private val ttsUtteranceListener = TTSUtteranceListener() + + override fun onCreate() { + super.onCreate() + initTts() + upSpeechRate() + } + + override fun onTaskRemoved(rootIntent: Intent?) { + super.onTaskRemoved(rootIntent) + clearTTS() + stopSelf() + } + + private fun initTts() { + ttsInitFinish = false + textToSpeech = TextToSpeech(this, this) + } + + override fun onDestroy() { + super.onDestroy() + clearTTS() + } + + override fun onInit(status: Int) { + if (status == TextToSpeech.SUCCESS) { + textToSpeech?.let { + it.setOnUtteranceProgressListener(ttsUtteranceListener) + it.language = Locale.CHINA + ttsInitFinish = true + play() + } + } else { + launch { + toast(R.string.tts_init_failed) + } + } + } + + @Synchronized + override fun play() { + if (contentList.isNotEmpty() && ttsInitFinish && requestFocus()) { + super.play() + execute { + MediaHelp.playSilentSound(this@TTSReadAloudService) + textToSpeech?.let { + it.speak("", TextToSpeech.QUEUE_FLUSH, null, null) + for (i in nowSpeak until contentList.size) { + it.speak( + contentList[i], + TextToSpeech.QUEUE_ADD, + null, + AppConst.APP_TAG + i + ) + } + } + } + } + } + + /** + * 更新朗读速度 + */ + override fun upSpeechRate(reset: Boolean) { + if (this.getPrefBoolean("ttsFollowSys", true)) { + if (reset) { + clearTTS() + initTts() + } + } else { + textToSpeech?.setSpeechRate((AppConfig.ttsSpeechRate + 5) / 10f) + } + } + + /** + * 上一段 + */ + override fun prevP() { + if (nowSpeak > 0) { + textToSpeech?.stop() + nowSpeak-- + readAloudNumber -= contentList[nowSpeak].length.minus(1) + play() + } + } + + /** + * 下一段 + */ + override fun nextP() { + if (nowSpeak < contentList.size - 1) { + textToSpeech?.stop() + readAloudNumber += contentList[nowSpeak].length.plus(1) + nowSpeak++ + play() + } + } + + /** + * 暂停朗读 + */ + override fun pauseReadAloud(pause: Boolean) { + super.pauseReadAloud(pause) + textToSpeech?.stop() + } + + /** + * 恢复朗读 + */ + override fun resumeReadAloud() { + super.resumeReadAloud() + play() + } + + /** + * 朗读监听 + */ + private inner class TTSUtteranceListener : UtteranceProgressListener() { + + override fun onStart(s: String) { + textChapter?.let { + if (readAloudNumber + 1 > it.getReadLength(pageIndex + 1)) { + pageIndex++ + ReadBook.moveToNextPage() + } + postEvent(EventBus.TTS_PROGRESS, readAloudNumber + 1) + } + } + + override fun onDone(s: String) { + readAloudNumber += contentList[nowSpeak].length + 1 + nowSpeak++ + if (nowSpeak >= contentList.size) { + nextChapter() + } + } + + override fun onRangeStart(utteranceId: String?, start: Int, end: Int, frame: Int) { + super.onRangeStart(utteranceId, start, end, frame) + textChapter?.let { + if (readAloudNumber + start > it.getReadLength(pageIndex + 1)) { + pageIndex++ + ReadBook.moveToNextPage() + postEvent(EventBus.TTS_PROGRESS, readAloudNumber + start) + } + } + } + + override fun onError(s: String) { + //nothing + } + + } + + override fun aloudServicePendingIntent(actionStr: String): PendingIntent? { + return IntentHelp.servicePendingIntent(this, actionStr) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/service/help/CacheBook.kt b/app/src/main/java/com/novel/read/service/help/CacheBook.kt new file mode 100644 index 0000000..0f1fb79 --- /dev/null +++ b/app/src/main/java/com/novel/read/service/help/CacheBook.kt @@ -0,0 +1,110 @@ +package com.novel.read.service.help + +import android.content.Context +import android.content.Intent +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.IntentAction +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.help.BookHelp +import com.novel.read.network.repository.BookRepository +import com.novel.read.service.CacheBookService +import kotlinx.coroutines.CoroutineScope +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArraySet + +object CacheBook { + val logs = arrayListOf() + private val downloadMap = ConcurrentHashMap>() + private val bookRepository by lazy { BookRepository() } + fun addLog(log: String?) { + log ?: return + synchronized(this) { + if (logs.size > 1000) { + logs.removeAt(0) + } + logs.add(log) + } + } + + fun start(context: Context, bookId: Long, start: Int, end: Int) { + Intent(context, CacheBookService::class.java).let { + it.action = IntentAction.start + it.putExtra("bookId", bookId) + it.putExtra("start", start) + it.putExtra("end", end) + context.startService(it) + } + } + + fun remove(context: Context, bookUrl: String) { + Intent(context, CacheBookService::class.java).let { + it.action = IntentAction.remove + it.putExtra("bookUrl", bookUrl) + context.startService(it) + } + } + + fun stop(context: Context) { + Intent(context, CacheBookService::class.java).let { + it.action = IntentAction.stop + context.startService(it) + } + } + + fun downloadCount(): Int { + var count = 0 + downloadMap.forEach { + count += it.value.size + } + return count + } + + fun download( + scope: CoroutineScope, + book: Book, + chapter: BookChapter, + resetPageOffset: Boolean = false + ) { + if (downloadMap[book.bookId]?.contains(chapter.chapterIndex) == true) { + return + } + if (downloadMap[book.bookId] == null) { + downloadMap[book.bookId] = CopyOnWriteArraySet() + } + downloadMap[book.bookId]?.add(chapter.chapterIndex) + + bookRepository.getContents(scope,book,chapter).onSuccess { bookContent-> + val content = bookContent.chapter.chapterContent + + if (content.isNotBlank()) { + BookHelp.saveContent(book, chapter, content) + } + if (ReadBook.book?.bookId == book.bookId) { + ReadBook.contentLoadFinish( + book, + chapter, + content.ifBlank { App.INSTANCE.getString(R.string.content_empty) }, + resetPageOffset = resetPageOffset + ) + } + }.onError { + if (ReadBook.book?.bookId == book.bookId) { + ReadBook.contentLoadFinish( + book, + chapter, + it.message!!, + resetPageOffset = resetPageOffset + ) + } + }.onFinally { + downloadMap[book.bookId]?.remove(chapter.chapterIndex) + if (downloadMap[book.bookId].isNullOrEmpty()) { + downloadMap.remove(book.bookId) + } + ReadBook.removeLoading(chapter.chapterIndex) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/service/help/ReadAloud.kt b/app/src/main/java/com/novel/read/service/help/ReadAloud.kt new file mode 100644 index 0000000..d5c606d --- /dev/null +++ b/app/src/main/java/com/novel/read/service/help/ReadAloud.kt @@ -0,0 +1,108 @@ +package com.novel.read.service.help + +import android.content.Context +import android.content.Intent +import com.novel.read.App +import com.novel.read.constant.IntentAction +import com.novel.read.constant.PreferKey +import com.novel.read.data.db.entity.HttpTTS +import com.novel.read.service.BaseReadAloudService +import com.novel.read.service.HttpReadAloudService +import com.novel.read.service.TTSReadAloudService +import com.novel.read.utils.ext.* + +object ReadAloud { + private var aloudClass: Class<*> = getReadAloudClass() + var httpTTS: HttpTTS? = null + + private fun getReadAloudClass(): Class<*> { + val spId = App.INSTANCE.getPrefLong(PreferKey.speakEngine) +// httpTTS = App.db.httpTTSDao().get(spId) + return if (httpTTS != null) { + HttpReadAloudService::class.java + } else { + TTSReadAloudService::class.java + } + } + + fun upReadAloudClass() { + stop(App.INSTANCE) + aloudClass = getReadAloudClass() + } + + fun play( + context: Context, + title: String, + subtitle: String, + pageIndex: Int, + dataKey: String, + play: Boolean = true + ) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.play + intent.putExtra("title", title) + intent.putExtra("subtitle", subtitle) + intent.putExtra("pageIndex", pageIndex) + intent.putExtra("dataKey", dataKey) + intent.putExtra("play", play) + context.startService(intent) + } + + fun pause(context: Context) { + if (BaseReadAloudService.isRun) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.pause + context.startService(intent) + } + } + + fun resume(context: Context) { + if (BaseReadAloudService.isRun) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.resume + context.startService(intent) + } + } + + fun stop(context: Context) { + if (BaseReadAloudService.isRun) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.stop + context.startService(intent) + } + } + + fun prevParagraph(context: Context) { + if (BaseReadAloudService.isRun) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.prevParagraph + context.startService(intent) + } + } + + fun nextParagraph(context: Context) { + if (BaseReadAloudService.isRun) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.nextParagraph + context.startService(intent) + } + } + + fun upTtsSpeechRate(context: Context) { + if (BaseReadAloudService.isRun) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.upTtsSpeechRate + context.startService(intent) + } + } + + fun setTimer(context: Context, minute: Int) { + if (BaseReadAloudService.isRun) { + val intent = Intent(context, aloudClass) + intent.action = IntentAction.setTimer + intent.putExtra("minute", minute) + context.startService(intent) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/service/help/ReadBook.kt b/app/src/main/java/com/novel/read/service/help/ReadBook.kt new file mode 100644 index 0000000..ad12f61 --- /dev/null +++ b/app/src/main/java/com/novel/read/service/help/ReadBook.kt @@ -0,0 +1,444 @@ +package com.novel.read.service.help + +import androidx.lifecycle.MutableLiveData +import com.hankcs.hanlp.HanLP +import com.novel.read.App +import com.novel.read.constant.AppConst +import com.novel.read.constant.BookType +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.data.db.entity.ReadRecord +import com.novel.read.data.read.TextChapter +import com.novel.read.data.read.TextPage +import com.novel.read.help.AppConfig +import com.novel.read.help.BookHelp +import com.novel.read.help.IntentDataHelp +import com.novel.read.help.ReadBookConfig +import com.novel.read.service.BaseReadAloudService +import com.novel.read.help.coroutine.Coroutine +import io.legado.app.ui.book.read.page.provider.ChapterProvider +import io.legado.app.ui.book.read.page.provider.ImageProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import org.jetbrains.anko.getStackTraceString +import org.jetbrains.anko.toast + + +object ReadBook { + var titleDate = MutableLiveData() + var book: Book? = null + var inBookshelf = false + var chapterSize = 0 + var durChapterIndex = 0 + var durPageIndex = 0 + var isLocalBook = true + var callBack: CallBack? = null + var prevTextChapter: TextChapter? = null + var curTextChapter: TextChapter? = null + var nextTextChapter: TextChapter? = null + var msg: String? = null + private val loadingChapters = arrayListOf() + private val readRecord = ReadRecord() + var readStartTime: Long = System.currentTimeMillis() + + fun resetData(book: Book) { + this.book = book + readRecord.bookName = book.bookName + readRecord.readTime = App.db.getReadRecordDao().getReadTime(book.bookName) ?: 0 + durChapterIndex = book.durChapterIndex + durPageIndex = book.durChapterPos + isLocalBook = book.origin == BookType.local + chapterSize = 0 + prevTextChapter = null + curTextChapter = null + nextTextChapter = null + titleDate.postValue(book.bookName) + ImageProvider.clearAllCache() + synchronized(this) { + loadingChapters.clear() + } + } + + + fun upReadStartTime() { + Coroutine.async { + readRecord.readTime = readRecord.readTime + System.currentTimeMillis() - readStartTime + readStartTime = System.currentTimeMillis() + App.db.getReadRecordDao().insert(readRecord) + } + } + + fun upMsg(msg: String?) { + if (this.msg != msg) { + this.msg = msg + callBack?.upContent() + } + } + + fun moveToNextPage() { + durPageIndex++ + callBack?.upContent() + saveRead() + } + + fun moveToNextChapter(upContent: Boolean): Boolean { + if (durChapterIndex < chapterSize - 1) { + durPageIndex = 0 + durChapterIndex++ + prevTextChapter = curTextChapter + curTextChapter = nextTextChapter + nextTextChapter = null + book?.let { + if (curTextChapter == null) { + loadContent(durChapterIndex, upContent, false) + } else if (upContent) { + callBack?.upContent() + } + loadContent(durChapterIndex.plus(1), upContent, false) + GlobalScope.launch(Dispatchers.IO) { + for (i in 2..10) { + delay(100) + download(durChapterIndex + i) + } + } + } + saveRead() + callBack?.upView() + curPageChanged() + return true + } else { + return false + } + } + + fun moveToPrevChapter(upContent: Boolean, toLast: Boolean = true): Boolean { + if (durChapterIndex > 0) { + durPageIndex = if (toLast) prevTextChapter?.lastIndex ?: 0 else 0 + durChapterIndex-- + nextTextChapter = curTextChapter + curTextChapter = prevTextChapter + prevTextChapter = null + book?.let { + if (curTextChapter == null) { + loadContent(durChapterIndex, upContent, false) + } else if (upContent) { + callBack?.upContent() + } + loadContent(durChapterIndex.minus(1), upContent, false) + GlobalScope.launch(Dispatchers.IO) { + for (i in -5..-2) { + delay(100) + download(durChapterIndex + i) + } + } + } + saveRead() + callBack?.upView() + curPageChanged() + return true + } else { + return false + } + } + + fun skipToPage(page: Int) { + durPageIndex = page + callBack?.upContent() + curPageChanged() + saveRead() + } + + fun setPageIndex(pageIndex: Int) { + durPageIndex = pageIndex + saveRead() + curPageChanged() + } + + private fun curPageChanged() { + callBack?.pageChanged() + if (BaseReadAloudService.isRun) { + readAloud(!BaseReadAloudService.pause) + } + upReadStartTime() + } + + /** + * 朗读 + */ + fun readAloud(play: Boolean = true) { + val book = book + val textChapter = curTextChapter + if (book != null && textChapter != null) { + val key = IntentDataHelp.putData(textChapter) + ReadAloud.play( + App.INSTANCE, + book.bookName, + textChapter.title, + durPageIndex, + key, + play + ) + } + } + + fun durChapterPos(): Int { + curTextChapter?.let { + if (durPageIndex < it.pageSize) { + return durPageIndex + } + return it.pageSize - 1 + } + return durPageIndex + } + + /** + * chapterOnDur: 0为当前页,1为下一页,-1为上一页 + */ + fun textChapter(chapterOnDur: Int = 0): TextChapter? { + return when (chapterOnDur) { + 0 -> curTextChapter + 1 -> nextTextChapter + -1 -> prevTextChapter + else -> null + } + } + + /** + * 加载章节内容 + */ + fun loadContent(resetPageOffset: Boolean) { + loadContent(durChapterIndex, resetPageOffset = resetPageOffset) + loadContent(durChapterIndex + 1, resetPageOffset = resetPageOffset) + loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset) + } + + fun loadContent(index: Int, upContent: Boolean = true, resetPageOffset: Boolean) { + book?.let { book -> + if (addLoading(index)) { + Coroutine.async { + App.db.getChapterDao().getChapter(book.bookId, index)?.let { chapter -> + BookHelp.getContent(book, chapter)?.let { + contentLoadFinish(book, chapter, it, upContent, resetPageOffset) + removeLoading(chapter.chapterIndex) + } ?: download(chapter, resetPageOffset = resetPageOffset) + } ?: removeLoading(index) + }.onError { + removeLoading(index) + } + } + } + } + + private fun download(index: Int) { + book?.let { book -> + if (book.isLocalBook()) return + if (addLoading(index)) { + Coroutine.async { + App.db.getChapterDao().getChapter(book.bookId, index)?.let { chapter -> + if (BookHelp.hasContent(book, chapter)) { + removeLoading(chapter.chapterIndex) + } else { + download(chapter, false) + } + } ?: removeLoading(index) + }.onError { + removeLoading(index) + } + } + } + } + + private fun download(chapter: BookChapter, resetPageOffset: Boolean) { + val book = book + if (book != null) { + CacheBook.download(Coroutine.DEFAULT,book, chapter) + } else if (book != null) { + contentLoadFinish( + book, + chapter, + "没有书源", + resetPageOffset = resetPageOffset + ) + removeLoading(chapter.chapterIndex) + } else { + removeLoading(chapter.chapterIndex) + } + } + + private fun addLoading(index: Int): Boolean { + synchronized(this) { + if (loadingChapters.contains(index)) return false + loadingChapters.add(index) + return true + } + } + + fun removeLoading(index: Int) { + synchronized(this) { + loadingChapters.remove(index) + } + } + + fun searchResultPositions( + pages: List, + indexWithinChapter: Int, + query: String + ): Array { + // calculate search result's pageIndex + var content = "" + pages.map { + content += it.text + } + var count = 1 + var index = content.indexOf(query) + while (count != indexWithinChapter) { + index = content.indexOf(query, index + 1) + count += 1 + } + val contentPosition = index + var pageIndex = 0 + var length = pages[pageIndex].text.length + while (length < contentPosition) { + pageIndex += 1 + if (pageIndex > pages.size) { + pageIndex = pages.size + break + } + length += pages[pageIndex].text.length + } + + // calculate search result's lineIndex + val currentPage = pages[pageIndex] + var lineIndex = 0 + length = length - currentPage.text.length + currentPage.textLines[lineIndex].text.length + while (length < contentPosition) { + lineIndex += 1 + if (lineIndex > currentPage.textLines.size) { + lineIndex = currentPage.textLines.size + break + } + length += currentPage.textLines[lineIndex].text.length + } + + // charIndex + val currentLine = currentPage.textLines[lineIndex] + length -= currentLine.text.length + val charIndex = contentPosition - length + var addLine = 0 + var charIndex2 = 0 + // change line + if ((charIndex + query.length) > currentLine.text.length) { + addLine = 1 + charIndex2 = charIndex + query.length - currentLine.text.length - 1 + } + // changePage + if ((lineIndex + addLine + 1) > currentPage.textLines.size) { + addLine = -1 + charIndex2 = charIndex + query.length - currentLine.text.length - 1 + } + return arrayOf(pageIndex, lineIndex, charIndex, addLine, charIndex2) + } + + /** + * 内容加载完成 + */ + fun contentLoadFinish( + book: Book, + chapter: BookChapter, + content: String, + upContent: Boolean = true, + resetPageOffset: Boolean + ) { + Coroutine.async { + if (chapter.chapterIndex in durChapterIndex - 1..durChapterIndex + 1) { + chapter.chapterName = when (AppConfig.chineseConverterType) { + 1 -> HanLP.convertToSimplifiedChinese(chapter.chapterName) + 2 -> HanLP.convertToTraditionalChinese(chapter.chapterName) + else -> chapter.chapterName + } + val contents = BookHelp.disposeContent( + book, + chapter.chapterName, + content + ) + when (chapter.chapterIndex) { + durChapterIndex -> { + curTextChapter = + ChapterProvider.getTextChapter( + book, + chapter, + contents, + chapterSize, + "" + ) + if (upContent) callBack?.upContent(resetPageOffset = resetPageOffset) + callBack?.upView() + curPageChanged() + callBack?.contentLoadFinish() + ImageProvider.clearOut(durChapterIndex) + } + durChapterIndex - 1 -> { + prevTextChapter = + ChapterProvider.getTextChapter( + book, + chapter, + contents, + chapterSize, + "" + ) + if (upContent) callBack?.upContent(-1, resetPageOffset) + } + durChapterIndex + 1 -> { + nextTextChapter = + ChapterProvider.getTextChapter( + book, + chapter, + contents, + chapterSize, + "" + ) + if (upContent) callBack?.upContent(1, resetPageOffset) + } + } + } + }.onError { + it.printStackTrace() + App.INSTANCE.toast("ChapterProvider ERROR:\n${it.getStackTraceString()}") + } + } + + fun pageAnim(): Int { +// book?.let { +// return if (it.getPageAnim() < 0) +// ReadBookConfig.pageAnim +// else +// it.getPageAnim() +// } + return ReadBookConfig.pageAnim + } + + fun saveRead() { + Coroutine.async { + book?.let { book -> + book.durChapterTime = System.currentTimeMillis() + book.durChapterIndex = durChapterIndex + book.durChapterPos = durPageIndex + App.db.getChapterDao().getChapter(book.bookId, durChapterIndex)?.let { + book.durChapterTitle = it.chapterName + } + App.db.getBookDao().update(book) + } + } + } + + interface CallBack { + fun loadChapterList(book: Book) + fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true) + fun upView() + fun pageChanged() + fun contentLoadFinish() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/MainActivity.kt b/app/src/main/java/com/novel/read/ui/MainActivity.kt new file mode 100644 index 0000000..c438612 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/MainActivity.kt @@ -0,0 +1,195 @@ +package com.novel.read.ui + +import android.os.Bundle +import android.view.KeyEvent +import android.view.MenuItem +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter +import androidx.lifecycle.observe +import androidx.viewpager.widget.ViewPager +import com.allenliu.versionchecklib.v2.AllenVersionChecker +import com.allenliu.versionchecklib.v2.builder.UIData +import com.google.android.material.bottomnavigation.BottomNavigationView +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.EventBus +import com.novel.read.data.model.AppUpdateResp +import com.novel.read.help.AppConfig +import com.novel.read.lib.ATH +import com.novel.read.service.BaseReadAloudService +import com.novel.read.ui.main.bookshelf.BookshelfFragment +import com.novel.read.ui.main.mail.MailFragment +import com.novel.read.ui.main.my.MyFragment +import com.novel.read.ui.widget.dialog.AppraiseDialog +import com.novel.read.user.VipHelper +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.activity_main.* +import org.jetbrains.anko.toast + +class MainActivity : VMBaseActivity(R.layout.activity_main), + BottomNavigationView.OnNavigationItemSelectedListener, + BottomNavigationView.OnNavigationItemReselectedListener, + ViewPager.OnPageChangeListener by ViewPager.SimpleOnPageChangeListener() { + + override val viewModel: MainViewModel + get() = getViewModel(MainViewModel::class.java) + + private var bookshelfReselected: Long = 0 + private var exitTime: Long = 0 + private var pagePosition = 0 + private val fragmentMap = hashMapOf() + + override fun onActivityCreated(savedInstanceState: Bundle?) { + ATH.applyEdgeEffectColor(view_pager_main) + ATH.applyBottomNavigationColor(bottom_navigation_view) + + view_pager_main.offscreenPageLimit = 3 + view_pager_main.adapter = TabFragmentPageAdapter(supportFragmentManager) + view_pager_main.addOnPageChangeListener(this) + bottom_navigation_view.elevation = + if (AppConfig.elevation < 0) elevation else AppConfig.elevation.toFloat() + bottom_navigation_view.setOnNavigationItemSelectedListener(this) + bottom_navigation_view.setOnNavigationItemReselectedListener(this) + initData() + } + + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + viewModel.appUpdate() + viewModel.checkCount() + //自动更新书籍 + view_pager_main.postDelayed({ + viewModel.upAllBookToc() + }, 1000) + } + + + private fun initData() { + VipHelper.notifyUser() + viewModel.appResp.observe(this) { + updateApk(it) + } + viewModel.showEvaluate.observe(this) { + val dialog = AppraiseDialog(this) + dialog.appraiseDialog { + goShop() + dialog.dismiss() + } + dialog.show() + } + } + + override fun onPageSelected(position: Int) { + view_pager_main.hideSoftInput() + pagePosition = position + when (position) { + 0, 1, 2 -> bottom_navigation_view.menu.getItem(position).isChecked = true + } + } + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + event?.let { + when (keyCode) { + KeyEvent.KEYCODE_BACK -> if (event.isTracking && !event.isCanceled) { + if (pagePosition != 0) { + view_pager_main.currentItem = 0 + return true + } + if (System.currentTimeMillis() - exitTime > 2000) { + toast(R.string.double_click_exit) + exitTime = System.currentTimeMillis() + } else { + if (BaseReadAloudService.pause) { + finish() + } else { + moveTaskToBack(true) + } + } + return true + } + } + } + return super.onKeyUp(keyCode, event) + } + + override fun onNavigationItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_mail -> view_pager_main.setCurrentItem(0, false) + R.id.menu_bookshelf -> view_pager_main.setCurrentItem(1, false) + R.id.menu_my_config -> view_pager_main.setCurrentItem(2, false) + } + return false + } + + override fun onNavigationItemReselected(item: MenuItem) { + when (item.itemId) { + R.id.menu_bookshelf -> { + if (System.currentTimeMillis() - bookshelfReselected > 300) { + bookshelfReselected = System.currentTimeMillis() + } else { + (fragmentMap[0] as? BookshelfFragment)?.gotoTop() + } + } + } + } + + + private inner class TabFragmentPageAdapter(fm: FragmentManager) : + FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + private fun getId(position: Int): Int { + return position + } + + override fun getItemPosition(`object`: Any): Int { + return POSITION_NONE + } + + override fun getItem(position: Int): Fragment { + return when (getId(position)) { + 0 -> fragmentMap[0] ?: MailFragment() + 1 -> fragmentMap[1] ?: BookshelfFragment() + else -> fragmentMap[2] ?: MyFragment() + } + } + + override fun getCount(): Int { + return 3 + } + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val fragment = super.instantiateItem(container, position) as Fragment + fragmentMap[getId(position)] = fragment + return fragment + } + + } + + override fun observeLiveBus() { + observeEvent(EventBus.RECREATE) { + recreate() + } + } + + + private fun updateApk(resp: AppUpdateResp?) { + val versionBean = resp?.appEdition + if (versionBean != null) { + val builder = AllenVersionChecker + .getInstance() + .downloadOnly( + UIData.create() + .setTitle(getString(R.string.new_version, versionBean.editionCode)) + .setContent(versionBean.upgradeContent) + .setDownloadUrl(versionBean.fileUrl) + ) + if (versionBean.forceUpdate == 1) { //强制更新 + builder.setForceUpdateListener(::finish) + } + builder.executeMission(this) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/MainViewModel.kt b/app/src/main/java/com/novel/read/ui/MainViewModel.kt new file mode 100644 index 0000000..94057b9 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/MainViewModel.kt @@ -0,0 +1,143 @@ +package com.novel.read.ui + +import android.app.Application +import androidx.lifecycle.MutableLiveData +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.BookType +import com.novel.read.constant.EventBus +import com.novel.read.constant.PreferKey +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.data.model.AppUpdateResp +import com.novel.read.data.model.ChapterResp +import com.novel.read.network.repository.HomeRepository +import com.novel.read.service.help.ReadBook +import com.novel.read.utils.StringUtils +import com.novel.read.utils.ext.* +import com.novel.read.help.coroutine.Coroutine +import com.novel.read.network.repository.BookRepository +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArraySet + +class MainViewModel(application: Application) : BaseViewModel(application) { + + private val homeRepository by lazy { HomeRepository() } + private val bookRepository by lazy { BookRepository() } + var appResp = MutableLiveData() + val showEvaluate = MutableLiveData() + + fun appUpdate() { + launch({ + appResp.value = homeRepository.appUpdate() + }, showErrorToast = false) + } + + fun upAllBookToc() { + execute { + upToc(App.db.getBookDao().getAllBooks()) + } + } + + val updateList = CopyOnWriteArraySet() + private val bookMap = ConcurrentHashMap() + + fun upToc(books: List) { + execute { + books.filter { + it.origin != BookType.local && it.canUpdate() + }.forEach { + bookMap[it.bookId] = it + } + updateToc() + } + } + + @Synchronized + private fun updateToc() { + bookMap.forEach { bookEntry -> + if (!updateList.contains(bookEntry.key)) { + val book = bookEntry.value + synchronized(this) { + updateList.add(book.bookId) + postEvent(EventBus.UPDATE_BOOK, book.bookId) + } + + launch( + block = { + val bookChapters = bookRepository.getDirectory(book.bookId) + dealData(bookChapters, bookEntry) + }, + error = { + it.printStackTrace() + synchronized(this) { + bookMap.remove(bookEntry.key) + updateList.remove(book.bookId) + postEvent(EventBus.UPDATE_BOOK, book.bookId) + upNext() + } + }, + showErrorToast = false, + ) + return + } + } + } + + private fun dealData(chapterResp: ChapterResp, bookE: Map.Entry) { + val book = bookE.value + Coroutine.async { + val cList = arrayListOf() + for (chapter in chapterResp.chapterList!!) { + val bookChapter = BookChapter( + bookId = chapter.bookId, + chapterId = chapter.chapterId, + chapterIndex = chapter.chapterIndex - 1, + chapterName = chapter.chapterName, + createTimeValue = chapter.createTime, + updateDate = "", + updateTimeValue = 0L, + chapterUrl = chapter.chapterUrl + ) + cList.add(bookChapter) + } + if (cList.isNotEmpty()) { + App.db.getChapterDao().insert(cList.toTypedArray()) + book.totalChapterNum = cList.size + book.lastUpdateChapterDate = cList[cList.size - 1].updateDate + App.db.getBookDao().update(book) + } else { + ReadBook.upMsg(context.getString(R.string.error_load_toc)) + } + }.onFinally { + synchronized(this) { + bookMap.remove(bookE.key) + updateList.remove(book.bookId) + postEvent(EventBus.UPDATE_BOOK, book.bookId) + upNext() + } + } + } + + private fun upNext() { + if (bookMap.size > updateList.size) { + updateToc() + } + } + + + fun checkCount() { + val count = App.INSTANCE.getPrefInt(PreferKey.installCount, 0) + App.INSTANCE.putPrefInt(PreferKey.installCount, count + 1) + + if (App.INSTANCE.getPrefLong(PreferKey.installTime) == 0L) { + App.INSTANCE.putPrefLong(PreferKey.installTime, System.currentTimeMillis()) + } else { + if (StringUtils.checkInstallTime() && !App.INSTANCE.getPrefBoolean(PreferKey.appraiseShow)) { + showEvaluate.postValue(true) + App.INSTANCE.putPrefBoolean(PreferKey.appraiseShow, true) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/about/AboutActivity.kt b/app/src/main/java/com/novel/read/ui/about/AboutActivity.kt new file mode 100644 index 0000000..c95a27c --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/about/AboutActivity.kt @@ -0,0 +1,11 @@ +package com.novel.read.ui.about + +import android.os.Bundle +import com.novel.read.R +import com.novel.read.base.BaseActivity + +class AboutActivity : BaseActivity(R.layout.activity_about) { + override fun onActivityCreated(savedInstanceState: Bundle?) { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/channel/ChannelActivity.kt b/app/src/main/java/com/novel/read/ui/channel/ChannelActivity.kt new file mode 100644 index 0000000..ed0b729 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/channel/ChannelActivity.kt @@ -0,0 +1,77 @@ +package com.novel.read.ui.channel + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.observe +import androidx.recyclerview.widget.GridLayoutManager +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.AppConst +import com.novel.read.data.model.ChannelSection +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.getViewModel +import kotlinx.android.synthetic.main.activity_channel.* +import java.util.ArrayList + +class ChannelActivity : VMBaseActivity(R.layout.activity_channel) { + + override val viewModel: ChannelViewModel + get() = getViewModel(ChannelViewModel::class.java) + + private lateinit var adapter: ChannelAdapter + private val data: MutableList = ArrayList() + + override fun onActivityCreated(savedInstanceState: Bundle?) { + ATH.applyEdgeEffectColor(rlv_channel) + initRecyclerView() + upRecyclerData() + } + + private fun initRecyclerView() { + rlv_channel.layoutManager = GridLayoutManager(this, 2) + adapter = ChannelAdapter() + rlv_channel.adapter = adapter + } + + private fun upRecyclerData() { + onRefresh() + viewModel.run { + channelResp.observe(this@ChannelActivity) { + for (i in it.allType.indices) { + data.add(ChannelSection(false, it.allType[i])) + } + adapter.setList(data) + } + + refreshStatus.observe(this@ChannelActivity) { + when (it) { + AppConst.loading -> { + adapter.setList(null) + adapter.isUseEmpty = true + } + AppConst.complete -> { + adapter.isUseEmpty = false + } + else -> { + adapter.setList(null) + adapter.setEmptyView(getErrorView()) + adapter.isUseEmpty = true + } + } + } + } + + } + + private fun onRefresh() { + adapter.setEmptyView(R.layout.view_loading) + viewModel.getChannel() + } + + private fun getErrorView(): View { + val errorView: View = layoutInflater.inflate(R.layout.view_net_error, rlv_channel, false) + errorView.setOnClickListener { onRefresh() } + return errorView + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/channel/ChannelAdapter.kt b/app/src/main/java/com/novel/read/ui/channel/ChannelAdapter.kt new file mode 100644 index 0000000..fc4ba52 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/channel/ChannelAdapter.kt @@ -0,0 +1,44 @@ +package com.novel.read.ui.channel + +import android.annotation.SuppressLint +import com.chad.library.adapter.base.BaseSectionQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.constant.IntentAction +import com.novel.read.data.model.AllType +import com.novel.read.data.model.ChannelSection +import kotlinx.android.synthetic.main.item_channel.view.* +import kotlinx.android.synthetic.main.item_channel_head.view.* +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.startActivity + +class ChannelAdapter : BaseSectionQuickAdapter( + R.layout.item_channel_head, + R.layout.item_channel +) { + + override fun convertHeader(helper: BaseViewHolder, item: ChannelSection) { + val value = item.obj as String + helper.itemView.run { + tv_sex.text = value + } + } + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: ChannelSection) { + val value = item.obj as AllType + holder.itemView.run { + tv_name.text = value.getBChannel() + iv_cover.load(value.typeImageUrl, "", "") + tv_count.text= "${value.bookCount}本" + onClick { + context.startActivity( + Pair(IntentAction.bookTypeId, value.bookTypeId), + Pair(IntentAction.channelName, value.getBChannel()), + ) + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/channel/ChannelInfoActivity.kt b/app/src/main/java/com/novel/read/ui/channel/ChannelInfoActivity.kt new file mode 100644 index 0000000..24ff2d8 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/channel/ChannelInfoActivity.kt @@ -0,0 +1,96 @@ +package com.novel.read.ui.channel + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.observe +import androidx.recyclerview.widget.LinearLayoutManager +import com.chad.library.adapter.base.listener.OnLoadMoreListener +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.AppConst +import com.novel.read.constant.IntentAction +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.getViewModel +import kotlinx.android.synthetic.main.activity_channel_info.* + +class ChannelInfoActivity : VMBaseActivity(R.layout.activity_channel_info) { + override val viewModel: ChannelInfoViewModel + get() = getViewModel(ChannelInfoViewModel::class.java) + private lateinit var adapter: ChannelInfoAdapter + + override fun onActivityCreated(savedInstanceState: Bundle?) { + ATH.applyEdgeEffectColor(rlv_book) + initRecyclerView() + viewModel.initData(intent) + upRecyclerData() + initLoadMore() + } + + private fun initRecyclerView() { + rlv_book.layoutManager = LinearLayoutManager(this) + adapter = ChannelInfoAdapter() + rlv_book.adapter = adapter + } + + private fun upRecyclerData() { + val channelName = intent.getStringExtra(IntentAction.channelName) ?: "" + title_bar.title = channelName + onRefresh() + viewModel.run { + bookListResp.observe(this@ChannelInfoActivity) { + adapter.setList(it) + } + pageStatus.observe(this@ChannelInfoActivity) { + when (it) { + AppConst.loading -> { + adapter.isUseEmpty = true + } + AppConst.complete -> { + adapter.isUseEmpty = false + } + AppConst.loadMore -> { + adapter.loadMoreModule.isEnableLoadMore = true + } + AppConst.loadComplete -> { + adapter.loadMoreModule.loadMoreComplete() + } + AppConst.noMore -> { + adapter.loadMoreModule.loadMoreEnd() + } + AppConst.loadMoreFail -> { + adapter.loadMoreModule.loadMoreFail() + } + else -> { + adapter.setList(null) + adapter.setEmptyView(getErrorView()) + adapter.isUseEmpty = true + } + } + } + } + } + + private fun initLoadMore() { + adapter.loadMoreModule.setOnLoadMoreListener(object : OnLoadMoreListener { + override fun onLoadMore() { + if (viewModel.pageStatus.value == AppConst.loadMore) { + return + } + viewModel.loadMore() + } + }) + adapter.loadMoreModule.isAutoLoadMore = true + adapter.loadMoreModule.isEnableLoadMoreIfNotFullPage=false + } + + private fun onRefresh() { + adapter.setEmptyView(R.layout.view_loading) + } + + private fun getErrorView(): View { + val errorView: View = layoutInflater.inflate(R.layout.view_net_error, rlv_book, false) + errorView.setOnClickListener { onRefresh() } + return errorView + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/channel/ChannelInfoAdapter.kt b/app/src/main/java/com/novel/read/ui/channel/ChannelInfoAdapter.kt new file mode 100644 index 0000000..a3e6e2b --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/channel/ChannelInfoAdapter.kt @@ -0,0 +1,28 @@ +package com.novel.read.ui.channel + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.BookListResp +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_book_common.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class ChannelInfoAdapter : + BaseQuickAdapter(R.layout.item_book_common), LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: BookListResp) { + holder.itemView.run { + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_book_name.text = item.getBBookName() + tv_book_description.text = item.getBIntroduction() + tv_book_author.text = item.getBAuthorName() + tv_word.text = context.getString(R.string.book_word, item.wordCount / 10000) + tv_category.text = item.getBCategoryName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/channel/ChannelInfoViewModel.kt b/app/src/main/java/com/novel/read/ui/channel/ChannelInfoViewModel.kt new file mode 100644 index 0000000..d0990c4 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/channel/ChannelInfoViewModel.kt @@ -0,0 +1,58 @@ +package com.novel.read.ui.channel + +import android.app.Application +import android.content.Intent +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.constant.IntentAction +import com.novel.read.data.model.BookListResp +import com.novel.read.network.repository.BookRepository + +class ChannelInfoViewModel(application: Application) : BaseViewModel(application) { + + private val bookRepository by lazy { BookRepository() } + var bookListResp = MutableLiveData>() + private lateinit var mList: MutableList + val pageStatus = MutableLiveData() + var page: Int = 1 + private var pageSize: Int = 20 + private var channelId: Long = 0L + private var total: Int = 0 + + fun initData(intent: Intent) { + channelId = intent.getLongExtra(IntentAction.bookTypeId, 0L) + launch( + block = { + pageStatus.value = AppConst.loading + val data = bookRepository.getBookList(channelId, page, pageSize) + total = data.count + mList = data.bookList + bookListResp.value = mList + pageStatus.value = AppConst.complete + }, + error = { + pageStatus.value = AppConst.error + } + ) + } + + fun loadMore() { + Log.e("loadMore", "loadMore: $page") + launch(block = { + pageStatus.value = AppConst.loadMore + page++ + val mData = bookRepository.getBookList(channelId, page, pageSize).bookList + mList.addAll(mData) + bookListResp.value = mList + pageStatus.value = AppConst.loadComplete + if (pageSize > mData.size) { + pageStatus.value = AppConst.noMore + } + }, error = { + page-- + pageStatus.value = AppConst.loadMoreFail + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/channel/ChannelViewModel.kt b/app/src/main/java/com/novel/read/ui/channel/ChannelViewModel.kt new file mode 100644 index 0000000..19157c5 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/channel/ChannelViewModel.kt @@ -0,0 +1,24 @@ +package com.novel.read.ui.channel + +import android.app.Application +import androidx.lifecycle.MutableLiveData +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.data.model.ChannelResp +import com.novel.read.network.repository.BookRepository + +class ChannelViewModel(application: Application) : BaseViewModel(application) { + + private val bookRepository by lazy { BookRepository() } + var channelResp = MutableLiveData() + val refreshStatus = MutableLiveData() + fun getChannel(){ + refreshStatus.value = AppConst.loading + launch({ + channelResp.value = bookRepository.getChannelList() + refreshStatus.value = AppConst.complete + }, { + refreshStatus.value = AppConst.error + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/chapter/BookMarkAdapter.kt b/app/src/main/java/com/novel/read/ui/chapter/BookMarkAdapter.kt new file mode 100644 index 0000000..2fc63ab --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/chapter/BookMarkAdapter.kt @@ -0,0 +1,19 @@ +package com.novel.read.ui.chapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.db.entity.Bookmark +import kotlinx.android.synthetic.main.item_bookmark.view.* + +class BookMarkAdapter :BaseQuickAdapter(R.layout.item_bookmark) { + + override fun convert(holder: BaseViewHolder, item: Bookmark) { + holder.itemView.run { + tv_chapter_name.text = item.chapterName + tv_content.text = item.content + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/chapter/BookmarkFragment.kt b/app/src/main/java/com/novel/read/ui/chapter/BookmarkFragment.kt new file mode 100644 index 0000000..6aba0b5 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/chapter/BookmarkFragment.kt @@ -0,0 +1,112 @@ +package com.novel.read.ui.chapter + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.EditText +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.observe +import androidx.recyclerview.widget.LinearLayoutManager +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.VMBaseFragment +import com.novel.read.data.db.entity.Bookmark +import com.novel.read.lib.ATH +import com.novel.read.lib.dialogs.alert +import com.novel.read.lib.dialogs.customView +import com.novel.read.lib.dialogs.noButton +import com.novel.read.lib.dialogs.yesButton +import com.novel.read.ui.widget.VerticalDivider +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.dialog_edit_text.view.* +import kotlinx.android.synthetic.main.fragment_bookmark.* + +class BookmarkFragment : VMBaseFragment(R.layout.fragment_bookmark), + ChapterListViewModel.BookmarkCallBack { + + override val viewModel: ChapterListViewModel + get() = getViewModelOfActivity(ChapterListViewModel::class.java) + + private lateinit var adapter: BookMarkAdapter + private var bookmarkLiveData = MutableLiveData>() + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + viewModel.bookMarkCallBack = this + initRecyclerView() + initData() + } + + private fun initRecyclerView() { + ATH.applyEdgeEffectColor(recycler_view) + adapter = BookMarkAdapter() + recycler_view.layoutManager = LinearLayoutManager(requireContext()) + recycler_view.addItemDecoration(VerticalDivider(requireContext())) + recycler_view.adapter = adapter + } + + private fun initData() { + viewModel.book?.let { book -> + bookmarkLiveData.removeObservers(viewLifecycleOwner) + bookmarkLiveData.value = App.db.getBookMarkDao().observeByBook(book.bookId) + bookmarkLiveData.observe(viewLifecycleOwner) { + adapter.setList(it) + } + } + + adapter.setOnItemClickListener { adapter, view, position -> + val bookmarkData = Intent() + val bookmark: Bookmark = bookmarkLiveData.value!![position] + bookmarkData.putExtra("index", bookmark.chapterIndex) + bookmarkData.putExtra("pageIndex", bookmark.pageIndex) + activity?.setResult(Activity.RESULT_OK, bookmarkData) + activity?.finish() + } + + adapter.setOnItemLongClickListener { adapter, view, position -> + val bookmark: Bookmark = bookmarkLiveData.value!![position] + viewModel.book?.let { book -> + requireContext().alert(R.string.bookmark) { + var editText: EditText? = null + message = book.bookName + " • " + bookmark.chapterName + customView { + layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { + editText = edit_view.apply { + setHint(R.string.note_content) + setText(bookmark.content) + } + } + } + yesButton { + editText?.text?.toString()?.let { editContent -> + bookmark.content = editContent + App.db.getBookMarkDao().update(bookmark) + bookmarkLiveData.value=App.db.getBookMarkDao().observeByBook(book.bookId) + adapter.notifyDataSetChanged() + } + } + noButton() + neutralButton(R.string.delete) { + App.db.getBookMarkDao().delete(bookmark) + bookmarkLiveData.value=App.db.getBookMarkDao().observeByBook(book.bookId) + adapter.notifyDataSetChanged() + } + }.show().applyTint().requestInputMethod() + } + true + } + } + + override fun startBookmarkSearch(newText: String?) { + if (newText.isNullOrBlank()) { + initData() + } else { + bookmarkLiveData.removeObservers(viewLifecycleOwner) + bookmarkLiveData.value = + App.db.getBookMarkDao().liveDataSearch( + viewModel.bookId, + newText + ) + bookmarkLiveData.observe(viewLifecycleOwner, { adapter.setList(it) }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/chapter/ChapterListActivity.kt b/app/src/main/java/com/novel/read/ui/chapter/ChapterListActivity.kt new file mode 100644 index 0000000..763c118 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/chapter/ChapterListActivity.kt @@ -0,0 +1,94 @@ +package com.novel.read.ui.chapter + +import android.os.Bundle +import android.view.Menu +import androidx.appcompat.widget.SearchView +import androidx.core.view.isGone +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.activity_chapter_list.* +import kotlinx.android.synthetic.main.view_tab_layout.* + + +class ChapterListActivity : VMBaseActivity(R.layout.activity_chapter_list) { + override val viewModel: ChapterListViewModel + get() = getViewModel(ChapterListViewModel::class.java) + + private var searchView: SearchView? = null + + override fun onActivityCreated(savedInstanceState: Bundle?) { + tab_layout.isTabIndicatorFullWidth = false + tab_layout.setSelectedTabIndicatorColor(accentColor) + intent.getStringExtra("bookId")?.let { + viewModel.initBook(it) { + view_pager.adapter = TabFragmentPageAdapter(supportFragmentManager) + tab_layout.setupWithViewPager(view_pager) + } + } + } + + override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.search_view, menu) + val search = menu.findItem(R.id.menu_search) + searchView = search.actionView as SearchView + ATH.setTint(searchView!!, primaryTextColor) + searchView?.maxWidth = resources.displayMetrics.widthPixels + searchView?.onActionViewCollapsed() + searchView?.setOnCloseListener { + tab_layout.visible() + false + } + searchView?.setOnSearchClickListener { tab_layout.gone() } + searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String): Boolean { + return false + } + + override fun onQueryTextChange(newText: String): Boolean { + if (tab_layout.selectedTabPosition == 1) { + viewModel.startBookmarkSearch(newText) + } else { + viewModel.startChapterListSearch(newText) + } + return false + } + }) + return super.onCompatCreateOptionsMenu(menu) + } + + private inner class TabFragmentPageAdapter(fm: FragmentManager) : + FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + override fun getItem(position: Int): Fragment { + return when (position) { + 1 -> BookmarkFragment() + else -> ChapterListFragment() + } + } + + override fun getCount(): Int { + return 2 + } + + override fun getPageTitle(position: Int): CharSequence? { + return when (position) { + 1 -> getString(R.string.bookmark) + else -> getString(R.string.chapter_list) + } + } + + } + + override fun onBackPressed() { + if (tab_layout.isGone) { + searchView?.onActionViewCollapsed() + tab_layout.visible() + } else { + super.onBackPressed() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/chapter/ChapterListAdapter.kt b/app/src/main/java/com/novel/read/ui/chapter/ChapterListAdapter.kt new file mode 100644 index 0000000..fc4bf26 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/chapter/ChapterListAdapter.kt @@ -0,0 +1,57 @@ +package com.novel.read.ui.chapter + +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.help.BookHelp +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.item_chapter_list.view.* + +class ChapterListAdapter(val callback: Callback) : + BaseQuickAdapter(R.layout.item_chapter_list) { + + val cacheFileNames = hashSetOf() + + override fun convert(holder: BaseViewHolder, item: BookChapter) { + holder.itemView.run { + val isDur = callback.durChapterIndex() == item.chapterIndex + val cached = callback.isLocalBook + || cacheFileNames.contains(BookHelp.formatChapterName(item)) + if (isDur) { + tv_chapter_name.setTextColor(context.accentColor) + } else { + tv_chapter_name.setTextColor(context.getCompatColor(R.color.primaryText)) + } + tv_chapter_name.text = item.chapterName + if (!item.updateDate.isNullOrEmpty()) { + tv_tag.text = item.updateDate + tv_tag.visible() + } + upHasCache(this, isDur, cached) + + setOnClickListener { + getItem(holder.layoutPosition)?.let { + callback.openChapter(it) + } + } + } + } + + private fun upHasCache(itemView: View, isDur: Boolean, cached: Boolean) = itemView.apply { + tv_chapter_name.paint.isFakeBoldText = cached + iv_checked.setImageResource(R.drawable.ic_outline_cloud_24) + iv_checked.visible(!cached) + if (isDur) { + iv_checked.setImageResource(R.drawable.ic_check) + iv_checked.visible() + } + } + + interface Callback { + val isLocalBook: Boolean + fun openChapter(bookChapter: BookChapter) + fun durChapterIndex(): Int + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/chapter/ChapterListFragment.kt b/app/src/main/java/com/novel/read/ui/chapter/ChapterListFragment.kt new file mode 100644 index 0000000..981f146 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/chapter/ChapterListFragment.kt @@ -0,0 +1,141 @@ +package com.novel.read.ui.chapter + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.observe +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.VMBaseFragment +import com.novel.read.constant.EventBus +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.help.BookHelp +import com.novel.read.ui.widget.UpLinearLayoutManager +import com.novel.read.ui.widget.VerticalDivider +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.fragment_chapter_list.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.jetbrains.anko.sdk27.listeners.onClick + +class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapter_list), + ChapterListViewModel.ChapterListCallBack,ChapterListAdapter.Callback { + + lateinit var adapter: ChapterListAdapter + private var durChapterIndex = 0 + private lateinit var mLayoutManager: UpLinearLayoutManager + private var tocLiveData: MutableLiveData>? = MutableLiveData() + private var scrollToDurChapter = false + + override val viewModel: ChapterListViewModel + get() = getViewModelOfActivity(ChapterListViewModel::class.java) + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + viewModel.chapterCallBack = this + val bbg = bottomBackground + val btc = requireContext().getPrimaryTextColor(ColorUtils.isColorLight(bbg)) + ll_chapter_base_info.setBackgroundColor(bbg) + tv_current_chapter_info.setTextColor(btc) + iv_chapter_top.setColorFilter(btc) + iv_chapter_bottom.setColorFilter(btc) + initRecyclerView() + initView() + initBook() + } + + private fun initRecyclerView() { + adapter = ChapterListAdapter(this) + mLayoutManager = UpLinearLayoutManager(requireContext()) + recycler_view.layoutManager = mLayoutManager + recycler_view.addItemDecoration(VerticalDivider(requireContext())) + recycler_view.adapter = adapter + } + + private fun initView() { + iv_chapter_top.onClick { mLayoutManager.scrollToPositionWithOffset(0, 0) } + iv_chapter_bottom.onClick { + if (adapter.itemCount > 0) { + mLayoutManager.scrollToPositionWithOffset(adapter.itemCount - 1, 0) + } + } + tv_current_chapter_info.onClick { + mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) + } + + } + + @SuppressLint("SetTextI18n") + private fun initBook() { + launch { + initDoc() + viewModel.book?.let { + durChapterIndex = it.durChapterIndex + tv_current_chapter_info.text = + "${it.durChapterTitle}(${it.durChapterIndex + 1}/${tocLiveData?.value?.size})" + initCacheFileNames(it) + } + } + } + + private fun initDoc() { + tocLiveData?.removeObservers(this@ChapterListFragment) + tocLiveData?.value = App.db.getChapterDao().observeByBook(viewModel.bookId) + tocLiveData?.observe(viewLifecycleOwner) { + adapter.setList(it) + if (!scrollToDurChapter) { + mLayoutManager.scrollToPositionWithOffset(durChapterIndex, 0) + scrollToDurChapter = true + } + } + } + + private fun initCacheFileNames(book: Book) { + launch(Dispatchers.IO) { + adapter.cacheFileNames.addAll(BookHelp.getChapterFiles(book)) + withContext(Dispatchers.Main) { + adapter.notifyItemRangeChanged(0, adapter.itemCount, true) + } + } + } + + override fun observeLiveBus() { + observeEvent(EventBus.SAVE_CONTENT) { chapter -> + viewModel.book?.bookId?.let { bookId -> + if (chapter.bookId == bookId) { + adapter.cacheFileNames.add(BookHelp.formatChapterName(chapter)) + adapter.notifyItemChanged(chapter.chapterIndex, true) + } + } + } + } + + override fun startChapterListSearch(newText: String?) { + if (newText.isNullOrBlank()) { + initDoc() + } else { + tocLiveData?.removeObservers(this) + tocLiveData?.value = App.db.getChapterDao().liveDataSearch(viewModel.bookId, newText) + tocLiveData?.observe(viewLifecycleOwner, { + adapter.setList(it) + }) + } + } + + override val isLocalBook: Boolean + get() = viewModel.book?.isLocalBook() == true + + override fun durChapterIndex(): Int { + return durChapterIndex + } + + override fun openChapter(bookChapter: BookChapter) { + activity?.setResult(Activity.RESULT_OK, Intent().putExtra("index", bookChapter.chapterIndex)) + activity?.finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/chapter/ChapterListViewModel.kt b/app/src/main/java/com/novel/read/ui/chapter/ChapterListViewModel.kt new file mode 100644 index 0000000..932bf30 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/chapter/ChapterListViewModel.kt @@ -0,0 +1,38 @@ +package com.novel.read.ui.chapter + +import android.app.Application +import com.novel.read.App +import com.novel.read.base.BaseViewModel +import com.novel.read.data.db.entity.Book + +class ChapterListViewModel(application: Application) : BaseViewModel(application) { + var bookId: String = "" + var book: Book? = null + var chapterCallBack: ChapterListCallBack? = null + var bookMarkCallBack: BookmarkCallBack? = null + + fun initBook(bookId: String, success: () -> Unit) { + this.bookId = bookId + execute { + book = App.db.getBookDao().getBook(bookId) + }.onSuccess { + success.invoke() + } + } + + fun startChapterListSearch(newText: String?) { + chapterCallBack?.startChapterListSearch(newText) + } + + fun startBookmarkSearch(newText: String?) { + bookMarkCallBack?.startBookmarkSearch(newText) + } + + interface ChapterListCallBack { + fun startChapterListSearch(newText: String?) + } + + interface BookmarkCallBack { + fun startBookmarkSearch(newText: String?) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/daily/DailyActivity.kt b/app/src/main/java/com/novel/read/ui/daily/DailyActivity.kt new file mode 100644 index 0000000..a66f412 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/daily/DailyActivity.kt @@ -0,0 +1,95 @@ +package com.novel.read.ui.daily + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.observe +import androidx.recyclerview.widget.LinearLayoutManager +import com.chad.library.adapter.base.listener.OnLoadMoreListener +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.AppConst +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.getViewModel +import kotlinx.android.synthetic.main.activity_daily.* + +class DailyActivity : VMBaseActivity(R.layout.activity_daily) { + + override val viewModel: DailyViewModel + get() = getViewModel(DailyViewModel::class.java) + + private lateinit var adapter: DailyAdapter + + override fun onActivityCreated(savedInstanceState: Bundle?) { + ATH.applyEdgeEffectColor(rlv_daily) + initRecyclerView() + upRecyclerData() + initLoadMore() + } + + private fun initRecyclerView() { + rlv_daily.layoutManager = LinearLayoutManager(this) + adapter = DailyAdapter() + rlv_daily.adapter = adapter + } + + private fun upRecyclerData() { + onRefresh() + viewModel.run { + bookListResp.observe(this@DailyActivity) { + adapter.setList(it) + } + pageStatus.observe(this@DailyActivity) { + when (it) { + AppConst.loading -> { + adapter.isUseEmpty = true + } + AppConst.complete -> { + adapter.isUseEmpty = false + } + AppConst.loadMore -> { + adapter.loadMoreModule.isEnableLoadMore = true + } + AppConst.loadComplete -> { + adapter.loadMoreModule.loadMoreComplete() + } + AppConst.noMore -> { + adapter.loadMoreModule.loadMoreEnd() + } + AppConst.loadMoreFail -> { + adapter.loadMoreModule.loadMoreFail() + } + else -> { + adapter.setList(null) + adapter.setEmptyView(getErrorView()) + adapter.isUseEmpty = true + } + } + } + } + } + + private fun initLoadMore() { + adapter.loadMoreModule.setOnLoadMoreListener(object : OnLoadMoreListener { + override fun onLoadMore() { + if (viewModel.pageStatus.value == AppConst.loadMore) { + return + } + viewModel.loadMore() + } + }) + adapter.loadMoreModule.isAutoLoadMore = true + adapter.loadMoreModule.isEnableLoadMoreIfNotFullPage=false + } + + private fun onRefresh() { + adapter.setEmptyView(R.layout.view_loading) + viewModel.initData() + } + + private fun getErrorView(): View { + val errorView: View = layoutInflater.inflate(R.layout.view_net_error, rlv_daily, false) + errorView.setOnClickListener { onRefresh() } + return errorView + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/daily/DailyAdapter.kt b/app/src/main/java/com/novel/read/ui/daily/DailyAdapter.kt new file mode 100644 index 0000000..4ac2bec --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/daily/DailyAdapter.kt @@ -0,0 +1,28 @@ +package com.novel.read.ui.daily + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.BookListResp +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_book_common.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class DailyAdapter : + BaseQuickAdapter(R.layout.item_book_common), LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: BookListResp) { + holder.itemView.run { + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_book_name.text = item.getBBookName() + tv_book_description.text = item.getBIntroduction() + tv_book_author.text = item.getBAuthorName() + tv_word.text = context.getString(R.string.book_word, item.wordCount / 10000) + tv_category.text = item.getBCategoryName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/daily/DailyViewModel.kt b/app/src/main/java/com/novel/read/ui/daily/DailyViewModel.kt new file mode 100644 index 0000000..ee18cda --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/daily/DailyViewModel.kt @@ -0,0 +1,51 @@ +package com.novel.read.ui.daily + +import android.app.Application +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.constant.LayoutType +import com.novel.read.data.model.BookListResp +import com.novel.read.network.repository.BookRepository + +class DailyViewModel(application: Application) : BaseViewModel(application) { + + private val bookRepository by lazy { BookRepository() } + var bookListResp = MutableLiveData>() + val pageStatus = MutableLiveData() + private lateinit var mList: MutableList + var page: Int = 1 + private var pageSize: Int = 20 + + fun initData() { + launch(block = { + pageStatus.value = AppConst.loading + val data = bookRepository.getBooRank(page, pageSize, LayoutType.RECOMMEND) + mList = data.bookRankList + bookListResp.value = mList + pageStatus.value = AppConst.complete + }, error = { + pageStatus.value = AppConst.error + }) + } + + fun loadMore() { + Log.e("loadMore", "loadMore: $page") + launch(block = { + pageStatus.value = AppConst.loadMore + page++ +// val mData = bookRepository.getDailyList(page, pageSize).bookList + val mData = bookRepository.getBooRank(page, pageSize, LayoutType.RECOMMEND).bookRankList + mList.addAll(mData) + bookListResp.value = mList + pageStatus.value = AppConst.loadComplete + if (pageSize > mData.size) { + pageStatus.value = AppConst.noMore + } + },error = { + page-- + pageStatus.value = AppConst.loadMoreFail + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/end/EndActivity.kt b/app/src/main/java/com/novel/read/ui/end/EndActivity.kt new file mode 100644 index 0000000..3e8817b --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/end/EndActivity.kt @@ -0,0 +1,96 @@ +package com.novel.read.ui.end + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.observe +import androidx.recyclerview.widget.LinearLayoutManager +import com.chad.library.adapter.base.listener.OnLoadMoreListener +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.AppConst +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.getViewModel +import kotlinx.android.synthetic.main.activity_end.* + +class EndActivity : VMBaseActivity(R.layout.activity_end) { + + override val viewModel: EndViewModel + get() = getViewModel(EndViewModel::class.java) + + private lateinit var adapter: EndAdapter + + override fun onActivityCreated(savedInstanceState: Bundle?) { + ATH.applyEdgeEffectColor(rlv_end) + initRecyclerView() + upRecyclerData() + initLoadMore() + } + + private fun initRecyclerView() { + rlv_end.layoutManager = LinearLayoutManager(this) + adapter = EndAdapter() + rlv_end.adapter = adapter + } + + private fun upRecyclerData() { + onRefresh() + viewModel.run { + bookListResp.observe(this@EndActivity) { + adapter.setList(it) + } + pageStatus.observe(this@EndActivity) { + when (it) { + AppConst.loading -> { + adapter.isUseEmpty = true + } + AppConst.complete -> { + adapter.isUseEmpty = false + } + AppConst.loadMore -> { + adapter.loadMoreModule.isEnableLoadMore = true + } + AppConst.loadComplete -> { + adapter.loadMoreModule.loadMoreComplete() + } + AppConst.noMore -> { + adapter.loadMoreModule.loadMoreEnd() + } + AppConst.loadMoreFail -> { + adapter.loadMoreModule.loadMoreFail() + } + else -> { + adapter.setList(null) + adapter.setEmptyView(getErrorView()) + adapter.isUseEmpty = true + } + } + } + } + } + + private fun initLoadMore() { + adapter.loadMoreModule.setOnLoadMoreListener(object : OnLoadMoreListener { + override fun onLoadMore() { + if (viewModel.pageStatus.value == AppConst.loadMore) { + return + } + viewModel.loadMore() + } + }) + adapter.loadMoreModule.isAutoLoadMore = true + adapter.loadMoreModule.isEnableLoadMoreIfNotFullPage = false + } + + private fun onRefresh() { + adapter.setEmptyView(R.layout.view_loading) + viewModel.initData() + } + + private fun getErrorView(): View { + val errorView: View = layoutInflater.inflate(R.layout.view_net_error, rlv_end, false) + errorView.setOnClickListener { onRefresh() } + return errorView + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/end/EndAdapter.kt b/app/src/main/java/com/novel/read/ui/end/EndAdapter.kt new file mode 100644 index 0000000..f6258c4 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/end/EndAdapter.kt @@ -0,0 +1,28 @@ +package com.novel.read.ui.end + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.BookListResp +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_book_common.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class EndAdapter : + BaseQuickAdapter(R.layout.item_book_common), LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: BookListResp) { + holder.itemView.run { + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_book_name.text = item.getBBookName() + tv_book_description.text = item.getBIntroduction() + tv_book_author.text = item.getBAuthorName() + tv_word.text = context.getString(R.string.book_word, item.wordCount / 10000) + tv_category.text = item.getBCategoryName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/end/EndViewModel.kt b/app/src/main/java/com/novel/read/ui/end/EndViewModel.kt new file mode 100644 index 0000000..ec4ed66 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/end/EndViewModel.kt @@ -0,0 +1,49 @@ +package com.novel.read.ui.end + +import android.app.Application +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.data.model.BookListResp +import com.novel.read.network.repository.BookRepository + +class EndViewModel(application: Application) : BaseViewModel(application) { + + private val bookRepository by lazy { BookRepository() } + var bookListResp = MutableLiveData>() + private lateinit var mList: MutableList + val pageStatus = MutableLiveData() + var page: Int = 1 + private var pageSize: Int = 20 + + fun initData() { + launch(block = { + pageStatus.value = AppConst.loading + val data = bookRepository.getEndList(page, pageSize) + mList = data.bookList + bookListResp.value = mList + pageStatus.value = AppConst.complete + }, error = { + pageStatus.value = AppConst.error + }) + } + + fun loadMore() { + Log.e("loadMore", "loadMore: $page") + launch(block = { + pageStatus.value = AppConst.loadMore + page++ + val mData = bookRepository.getEndList(page, pageSize).bookList + mList.addAll(mData) + bookListResp.value = mList + pageStatus.value = AppConst.loadComplete + if (pageSize > mData.size) { + pageStatus.value = AppConst.noMore + } + }, error = { + page-- + pageStatus.value = AppConst.loadMoreFail + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/feedback/FeedBackActivity.kt b/app/src/main/java/com/novel/read/ui/feedback/FeedBackActivity.kt new file mode 100644 index 0000000..9217923 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/feedback/FeedBackActivity.kt @@ -0,0 +1,35 @@ +package com.novel.read.ui.feedback + +import android.os.Bundle +import android.text.TextUtils +import androidx.lifecycle.observe +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.utils.ext.getViewModel +import kotlinx.android.synthetic.main.activity_feed_back.* +import org.jetbrains.anko.toast + +class FeedBackActivity : VMBaseActivity(R.layout.activity_feed_back) { + + override val viewModel: FeedBackViewModel + get() = getViewModel(FeedBackViewModel::class.java) + + override fun onActivityCreated(savedInstanceState: Bundle?) { + button_report.setOnClickListener { + if (TextUtils.isEmpty(et_feed.text.toString().trim())){ + toast(getString(R.string.feedback_not_empty)) + return@setOnClickListener + } + viewModel.feedback(et_feed.text.toString().trim()) + } + + viewModel.success.observe(this){ + if(it){ + toast(getString(R.string.feedback_success)) + finish() + } + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/feedback/FeedBackViewModel.kt b/app/src/main/java/com/novel/read/ui/feedback/FeedBackViewModel.kt new file mode 100644 index 0000000..71bf47d --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/feedback/FeedBackViewModel.kt @@ -0,0 +1,19 @@ +package com.novel.read.ui.feedback + +import android.app.Application +import androidx.lifecycle.MutableLiveData +import com.novel.read.base.BaseViewModel +import com.novel.read.network.repository.BookRepository + +class FeedBackViewModel(application: Application) : BaseViewModel(application) { + + private val bookRepository by lazy { BookRepository() } + var success = MutableLiveData() + + fun feedback(content: String) { + launch(block = { + bookRepository.feedback(content) + success.postValue(true) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/info/BookInfoActivity.kt b/app/src/main/java/com/novel/read/ui/info/BookInfoActivity.kt new file mode 100644 index 0000000..02b3d13 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/info/BookInfoActivity.kt @@ -0,0 +1,167 @@ +package com.novel.read.ui.info + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.lifecycle.observe +import androidx.recyclerview.widget.GridLayoutManager +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.AppConst +import com.novel.read.constant.EventBus +import com.novel.read.constant.IntentAction +import com.novel.read.data.db.entity.Book +import com.novel.read.help.AppConfig +import com.novel.read.help.IntentDataHelp +import com.novel.read.ui.read.ReadBookActivity +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.activity_book_info.* +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.startActivity +import org.jetbrains.anko.startActivityForResult + +class BookInfoActivity : VMBaseActivity(R.layout.activity_book_info) { + + private lateinit var adapter: BookInfoAdapter + private val requestCodeRead = 432 + + override val viewModel: BookInfoViewModel + get() = getViewModel(BookInfoViewModel::class.java) + + companion object { + fun actionBookInfo(context: Context, bookId: Long, bookTypeId: Int?) { + context.startActivity( + Pair(IntentAction.bookId, bookId), + Pair(IntentAction.bookTypeId, bookTypeId), + ) + } + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + viewModel.initData(intent) + viewModel.getRecommend(intent) + tv_shelf.setTextColor(getPrimaryTextColor(ColorUtils.isColorLight(bottomBackground))) + initRecycleView() + initData() + initClick() + } + + private fun initRecycleView() { + rlv_recommend.layoutManager = GridLayoutManager(this, 4) + adapter = BookInfoAdapter() + rlv_recommend.adapter = adapter + } + + private fun initData() { + val dividerColor = if (AppConfig.isNightTheme) { + ColorUtils.shiftColor(backgroundColor, 1.05f) + } else { + ColorUtils.shiftColor(backgroundColor, 0.95f) + } + preference_divider_above.setBackgroundColor(dividerColor) + viewModel.bookResp.observe(this) { + iv_book.load(it.coverImageUrl, it.bookName, it.authorName) + tv_book_name.text = it.bookName + tv_book_author.text = it.authorName + tv_key.text = it.lastUpdateChapterDate + tv_status.text = it.categoryName + tv_word.text = getString(R.string.book_word, it.wordCount / 10000) + + tv_tro.text = it.introduction + + upTvBookshelf() + } + viewModel.bookListResp.observe(this) { + adapter.setList(it) + } + viewModel.status.observe(this) { + when (it) { + AppConst.loading -> { + refresh.showLoading() + } + AppConst.complete -> { + refresh.showFinish() + } + else -> { + refresh.showError() + } + } + } + } + + private fun initClick() { + tv_shelf.onClick { + if (viewModel.inBookshelf) { + deleteBook() + } else { + viewModel.addToBookshelf { + upTvBookshelf() + } + } + + } + + tv_read.onClick { + viewModel.bookData.value?.let { + readBook(it) + } + + } + + refresh.setOnReloadingListener { + viewModel.initData(intent) + viewModel.getRecommend(intent) + } + } + + private fun readBook(book: Book) { + if (!viewModel.inBookshelf) { + startReadActivity(book) + } else { + viewModel.saveBook { + startReadActivity(book) + } + } + postEvent(EventBus.UP_BOOK, 0L) + } + + private fun startReadActivity(book: Book) { + startActivityForResult( + requestCodeRead, + Pair("bookId", book.bookId.toString()), + Pair("inBookshelf", viewModel.inBookshelf), + Pair("key", IntentDataHelp.putData(book)) + ) + } + + private fun upTvBookshelf() { + if (viewModel.inBookshelf) { + tv_shelf.text = getString(R.string.remove_from_bookshelf) + } else { + tv_shelf.text = getString(R.string.add_to_shelf) + } + postEvent(EventBus.UP_BOOK, 0L) + } + + @SuppressLint("InflateParams") + private fun deleteBook() { + viewModel.delBook { + upTvBookshelf() + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + requestCodeRead -> if (resultCode == Activity.RESULT_OK) { + viewModel.inBookshelf = true + viewModel.saveBook { + upTvBookshelf() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/info/BookInfoAdapter.kt b/app/src/main/java/com/novel/read/ui/info/BookInfoAdapter.kt new file mode 100644 index 0000000..cda50e8 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/info/BookInfoAdapter.kt @@ -0,0 +1,23 @@ +package com.novel.read.ui.info + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.BookListResp +import com.novel.read.lib.ATH +import kotlinx.android.synthetic.main.item_hot_item.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class BookInfoAdapter :BaseQuickAdapter(R.layout.item_hot_item) { + + override fun convert(holder: BaseViewHolder, item: BookListResp) { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_name.text = item.getBBookName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/info/BookInfoViewModel.kt b/app/src/main/java/com/novel/read/ui/info/BookInfoViewModel.kt new file mode 100644 index 0000000..41ed5f0 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/info/BookInfoViewModel.kt @@ -0,0 +1,142 @@ +package com.novel.read.ui.info + +import android.app.Application +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import com.novel.read.App +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.constant.IntentAction +import com.novel.read.data.db.entity.Book +import com.novel.read.data.model.BookListResp +import com.novel.read.data.model.BookResp +import com.novel.read.network.repository.BookRepository +import com.novel.read.service.help.ReadBook + +class BookInfoViewModel(application: Application) : BaseViewModel(application) { + + var bookResp = MutableLiveData() + val bookData = MutableLiveData() + var status = MutableLiveData() + var inBookshelf = false + private val bookRepository by lazy { BookRepository() } + var bookListResp = MutableLiveData>() + private lateinit var mList: MutableList + private var bookTypeId: Int = 0 + + private var durChapterTime: Long = 0 + private var durChapterIndex: Int = 0 + private var durChapterPos: Int = 0 + private var durChapterTitle: String? = "" + private var totalChapterNum: Int = 0 + + fun initData(intent: Intent) { + + val bookId = intent.getLongExtra(IntentAction.bookId,0L) + + App.db.getBookDao().getBook(bookId.toString())?.let { book -> + inBookshelf = true + durChapterTime = book.durChapterTime + durChapterIndex = book.durChapterIndex + durChapterPos = book.durChapterPos + totalChapterNum = book.totalChapterNum + durChapterTitle = book.durChapterTitle + } + launch( + block = { + status.postValue(AppConst.loading) + val data = bookRepository.getBookInfo(bookId).book + bookResp.postValue(data) + val book = Book( + authorPenname = data.authorName, + bookId = data.bookId, + bookName = data.bookName, + bookStatus = "01", + categoryName = data.categoryName, + channelName = data.categoryName, + cName = "轻小说", + coverImageUrl = data.coverImageUrl, + introduction = data.introduction, + keyWord = data.keyWord, + lastUpdateChapterDate = data.lastUpdateChapterDate, + status = 0, + wordCount = data.wordCount, + bookTypeId = data.bookTypeId + ) + book.durChapterTime = durChapterTime + book.durChapterIndex = durChapterIndex + book.durChapterPos = durChapterPos + book.durChapterTitle = durChapterTitle + book.totalChapterNum = totalChapterNum + setBookData(book) + status.postValue(AppConst.complete) + }, error = { + status.postValue(AppConst.error) + }, showErrorToast = false + ) + + } + + private fun setBookData(book: Book) { + bookData.postValue(book) + if (inBookshelf) { + App.db.getBookDao().update(book) + } + } + + fun getRecommend(intent: Intent) { + launch({ + bookTypeId = intent.getIntExtra(IntentAction.bookTypeId,0) + val data = bookRepository.getSimilarRecommend(bookTypeId) + mList = data.recommendBookList + bookListResp.value = mList + }, { + }, showErrorToast = false) + } + + fun delBook(success: (() -> Unit)? = null) { + execute { + bookData.value?.let { + App.db.getBookDao().delete(it) + inBookshelf = false + } + }.onSuccess { + success?.invoke() + } + } + + fun addToBookshelf(success: (() -> Unit)?) { + execute { + bookData.value?.let { book -> + book.bookTypeId = bookTypeId + App.db.getBookDao().getBook(book.bookId.toString())?.let { + book.durChapterPos = it.durChapterPos + book.durChapterTitle = it.durChapterTitle + } + App.db.getBookDao().insert(book) + } + + inBookshelf = true + }.onSuccess { + success?.invoke() + } + } + + fun saveBook(success: (() -> Unit)? = null) { + execute { + bookData.value?.let { book -> + App.db.getBookDao().getBook(book.bookId.toString())?.let { + book.durChapterPos = it.durChapterPos + book.durChapterTitle = it.durChapterTitle + } + App.db.getBookDao().insert(book) + if (ReadBook.book?.bookName == book.bookName && ReadBook.book?.authorPenname == book.authorPenname) { + ReadBook.book = book + } + } + }.onSuccess { + success?.invoke() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/BaseBookAdapter.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/BaseBookAdapter.kt new file mode 100644 index 0000000..53d5374 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/BaseBookAdapter.kt @@ -0,0 +1,26 @@ +package com.novel.read.ui.main.bookshelf + +import androidx.core.os.bundleOf +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.data.db.entity.Book + +abstract class BaseBookAdapter(layoutId: Int) : BaseQuickAdapter(layoutId){ + + + fun notification(bookId: Long) { + for (i in 0 until itemCount) { + getItem(i).let { + if (it.bookId == bookId) { + notifyItemChanged(i, bundleOf(Pair("refresh", null))) + return + } + } + } + } + + interface CallBack { + fun isUpdate(bookId: Long): Boolean + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/BookShelfAdapter.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/BookShelfAdapter.kt new file mode 100644 index 0000000..abf33a5 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/BookShelfAdapter.kt @@ -0,0 +1,74 @@ +package com.novel.read.ui.main.bookshelf + +import android.os.Bundle +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.constant.BookType +import com.novel.read.data.db.entity.Book +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.item_bookshelf_list.view.* +import kotlinx.android.synthetic.main.item_bookshelf_list.view.bv_unread +import kotlinx.android.synthetic.main.item_bookshelf_list.view.iv_cover +import kotlinx.android.synthetic.main.item_bookshelf_list.view.rl_loading +import kotlinx.android.synthetic.main.item_bookshelf_list.view.tv_name + +class BookShelfAdapter(private val callBack: CallBack) : BaseBookAdapter(R.layout.item_bookshelf_list) { + + + override fun convert(holder: BaseViewHolder, item: Book, payloads: List) { + super.convert(holder, item, payloads) + val bundle = payloads.getOrNull(0) as? Bundle + holder.itemView.run { + ATH.applyBackgroundTint(this) + if (bundle == null) { + tv_name.text = item.bookName + tv_author.text = item.authorPenname + tv_read.text = item.durChapterTitle + tv_last.text = item.keyWord + iv_cover.load(item.coverImageUrl, item.bookName, item.authorPenname) + upRefresh(holder, item) + } else { + tv_read.text = item.durChapterTitle + tv_last.text = item.keyWord + bundle.keySet().forEach { + when (it) { + "name" -> tv_name.text = item.bookName + "author" -> tv_author.text = item.authorPenname + "cover" -> iv_cover.load( + item.coverImageUrl, + item.bookName, + item.authorPenname + ) + "refresh" -> upRefresh(holder, item) + } + } + } + } + } + + override fun convert(holder: BaseViewHolder, item: Book) { + holder.itemView.run { + ATH.applyBackgroundTint(this) + tv_name.text = item.bookName + tv_author.text = item.authorPenname + tv_read.text = item.durChapterTitle + tv_last.text = item.keyWord + iv_cover.load(item.coverImageUrl, item.bookName, item.authorPenname) + upRefresh(holder, item) + } + } + + + private fun upRefresh(holder: BaseViewHolder, item: Book) { + if (item.origin != BookType.local && callBack.isUpdate(item.bookId)) { + holder.itemView.bv_unread.invisible() + holder.itemView.rl_loading.show() + } else { + holder.itemView.rl_loading.hide() + holder.itemView.bv_unread.setBadgeCount(0) + holder.itemView.bv_unread.setHighlight(true) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/BookViewModel.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/BookViewModel.kt new file mode 100644 index 0000000..d7ffdb5 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/BookViewModel.kt @@ -0,0 +1,11 @@ +package com.novel.read.ui.main.bookshelf + +import android.app.Application + +import com.novel.read.base.BaseViewModel + + +class BookViewModel(application: Application) : BaseViewModel(application) { + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/BooksAdapterGrid.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/BooksAdapterGrid.kt new file mode 100644 index 0000000..995dd97 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/BooksAdapterGrid.kt @@ -0,0 +1,61 @@ +package com.novel.read.ui.main.bookshelf + +import android.os.Bundle +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.constant.BookType +import com.novel.read.data.db.entity.Book +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.invisible +import kotlinx.android.synthetic.main.item_bookshelf_grid.view.* + +class BooksAdapterGrid(private val callBack: CallBack) : + BaseBookAdapter(R.layout.item_bookshelf_grid) { + + override fun convert(holder: BaseViewHolder, item: Book, payloads: List) { + super.convert(holder, item, payloads) + val bundle = payloads.getOrNull(0) as? Bundle + + holder.itemView.run { + ATH.applyBackgroundTint(this) + if (bundle == null) { + tv_name.text = item.bookName + iv_cover.load(item.coverImageUrl, item.bookName, item.authorPenname) + upRefresh(holder, item) + } else { + bundle.keySet().forEach { + when (it) { + "name" -> tv_name.text = item.bookName + "cover" -> iv_cover.load( + item.coverImageUrl, + item.bookName, + item.authorPenname + ) + "refresh" -> upRefresh(holder, item) + } + } + } + + } + } + + override fun convert(holder: BaseViewHolder, item: Book) { + holder.itemView.run { + ATH.applyBackgroundTint(this) + tv_name.text = item.bookName + iv_cover.load(item.coverImageUrl, item.bookName, item.authorPenname) + upRefresh(holder, item) + } + } + + private fun upRefresh(holder: BaseViewHolder, item: Book) { + if (item.origin != BookType.local && callBack.isUpdate(item.bookId)) { + holder.itemView.bv_unread.invisible() + holder.itemView.rl_loading.show() + } else { + holder.itemView.rl_loading.hide() + holder.itemView.bv_unread.setBadgeCount(0) + holder.itemView.bv_unread.setHighlight(true) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/BookshelfFragment.kt new file mode 100644 index 0000000..72e9a0d --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/BookshelfFragment.kt @@ -0,0 +1,192 @@ +package com.novel.read.ui.main.bookshelf + +import android.annotation.SuppressLint +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.View +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels +import androidx.lifecycle.MutableLiveData +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.VMBaseFragment +import com.novel.read.constant.EventBus +import com.novel.read.constant.IntentAction +import com.novel.read.constant.PreferKey +import com.novel.read.data.db.entity.Book +import com.novel.read.help.AppConfig +import com.novel.read.help.IntentDataHelp +import com.novel.read.lib.ATH +import com.novel.read.lib.dialogs.alert +import com.novel.read.lib.dialogs.noButton +import com.novel.read.lib.dialogs.okButton +import com.novel.read.ui.MainViewModel +import com.novel.read.ui.info.BookInfoActivity +import com.novel.read.ui.main.bookshelf.arrange.ArrangeBookActivity +import com.novel.read.ui.read.ReadBookActivity +import com.novel.read.ui.search.SearchActivity +import com.novel.read.utils.BooksDiffCallBack +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.dialog_bookshelf_config.view.* +import kotlinx.android.synthetic.main.fragment_book_shelf.* +import kotlinx.android.synthetic.main.view_title_bar.* +import org.jetbrains.anko.startActivity + +class BookshelfFragment : VMBaseFragment(R.layout.fragment_book_shelf), BaseBookAdapter.CallBack { + + + override val viewModel: BookViewModel by viewModels() + private val activityViewModel: MainViewModel + by activityViewModels() + private lateinit var booksAdapter: BaseBookAdapter + private var bookshelfLiveData = MutableLiveData>() + private lateinit var selectBook: Book + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + setSupportToolbar(toolbar) + initRecycleView() + upRecyclerData() + } + + + override fun onCompatCreateOptionsMenu(menu: Menu) { + menuInflater.inflate(R.menu.main_bookshelf, menu) + } + + override fun onCompatOptionsItemSelected(item: MenuItem) { + super.onCompatOptionsItemSelected(item) + when (item.itemId) { + R.id.menu_search -> startActivity() + R.id.menu_update_toc -> { +// val group = bookGroups[tab_layout.selectedTabPosition] +// val fragment = fragmentMap[group.groupId] +// fragment?.getBooks()?.let { +// activityViewModel.upToc(it) +// } + } + R.id.menu_bookshelf_layout -> configBookshelf() + R.id.menu_arrange_bookshelf -> startActivity() + } + } + + private fun initRecycleView() { + ATH.applyEdgeEffectColor(rlv_book_shelf) + + refresh_layout.setColorSchemeColors(accentColor) + refresh_layout.setOnRefreshListener { + refresh_layout.isRefreshing = false + activityViewModel.upToc(booksAdapter.data) + } + + val bookshelfLayout = getPrefInt(PreferKey.bookshelfLayout) + if (bookshelfLayout == 0) { + rlv_book_shelf.layoutManager = LinearLayoutManager(context) + booksAdapter = BookShelfAdapter(this) + } else { + rlv_book_shelf.layoutManager = GridLayoutManager(context, bookshelfLayout + 2) + booksAdapter = BooksAdapterGrid(this) + } + rlv_book_shelf.adapter = booksAdapter + booksAdapter.setEmptyView(R.layout.view_empty) + booksAdapter.setDiffCallback(BooksDiffCallBack()) + + booksAdapter.setOnItemClickListener { adapter, view, position -> + selectBook = adapter.data[position] as Book + activity?.startActivity( + Pair(IntentAction.bookId, selectBook.bookId), + Pair("key", IntentDataHelp.putData(selectBook)) + ) +// ProcessLifecycleOwner.get().lifecycle.addObserver(App.ApplicationObserverInRead()) + } + + booksAdapter.setOnItemLongClickListener { adapter, view, position -> + selectBook = adapter.data[position] as Book + activity?.let { BookInfoActivity.actionBookInfo(it, selectBook.bookId, selectBook.bookTypeId) } + true + } + } + + + private fun upRecyclerData() { + bookshelfLiveData.removeObservers(this) + bookshelfLiveData.value = App.db.getBookDao().getAllBooks() + + bookshelfLiveData.observe(viewLifecycleOwner, { list -> + Log.e("BookFragment", "observeLiveBus: 开始更新") + booksAdapter.isUseEmpty = list.isEmpty() + val books = when (getPrefInt(PreferKey.bookshelfSort)) { + 1 -> list.sortedByDescending { it.lastUpdateChapterDate } + 2 -> list.sortedBy { it.bookName } + else -> list.sortedByDescending { it.durChapterTime } + } + + booksAdapter.setList(books.toMutableList()) + }) + + } + + fun gotoTop() { + if (AppConfig.isEInkMode) { + rlv_book_shelf.scrollToPosition(0) + } else { + rlv_book_shelf.smoothScrollToPosition(0) + } + } + + @SuppressLint("InflateParams") + private fun configBookshelf() { + requireContext().alert(titleResource = R.string.bookshelf_layout) { + val bookshelfLayout = getPrefInt(PreferKey.bookshelfLayout) + val bookshelfSort = getPrefInt(PreferKey.bookshelfSort) + val root = LayoutInflater.from(requireContext()) + .inflate(R.layout.dialog_bookshelf_config, null).apply { + rg_layout.checkByIndex(bookshelfLayout) + rg_sort.checkByIndex(bookshelfSort) + } + customView = root + okButton { + root.apply { + var changed = false + if (bookshelfLayout != rg_layout.getCheckedIndex()) { + putPrefInt(PreferKey.bookshelfLayout, rg_layout.getCheckedIndex()) + changed = true + } + if (bookshelfSort != rg_sort.getCheckedIndex()) { + putPrefInt(PreferKey.bookshelfSort, rg_sort.getCheckedIndex()) + changed = true + } + if (changed) { + activity?.recreate() + } + } + } + noButton() + }.show().applyTint() + } + + override fun observeLiveBus() { + super.observeLiveBus() + observeEvent(EventBus.UP_BOOK) { + bookshelfLiveData.value = App.db.getBookDao().getAllBooks() + } + observeEvent(EventBus.UPDATE_BOOK) { + booksAdapter.notification(it) + } + observeEvent(EventBus.SHOW_AD) { + activity?.startActivity( + Pair(IntentAction.bookId, selectBook.bookId), + Pair("key", IntentDataHelp.putData(selectBook)) + ) + } + + } + + override fun isUpdate(bookId: Long): Boolean { + return bookId in activityViewModel.updateList + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookActivity.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookActivity.kt new file mode 100644 index 0000000..a748514 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookActivity.kt @@ -0,0 +1,71 @@ +package com.novel.read.ui.main.bookshelf.arrange + +import android.os.Bundle +import android.util.Log +import androidx.recyclerview.widget.LinearLayoutManager +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.PreferKey +import com.novel.read.data.db.entity.Book +import com.novel.read.lib.ATH +import com.novel.read.lib.dialogs.alert +import com.novel.read.lib.dialogs.okButton +import com.novel.read.ui.widget.VerticalDivider +import com.novel.read.utils.ext.applyTint +import com.novel.read.utils.ext.getPrefInt +import com.novel.read.utils.ext.getViewModel +import kotlinx.android.synthetic.main.activity_arrange_book.* + +class ArrangeBookActivity : VMBaseActivity(R.layout.activity_arrange_book),ArrangeBookAdapter.CallBack { + + private lateinit var adapter: ArrangeBookAdapter + + override val viewModel: ArrangeBookViewModel + get() = getViewModel(ArrangeBookViewModel::class.java) + + override fun onActivityCreated(savedInstanceState: Bundle?) { + initView() + initBookData() + } + + private fun initView() { + ATH.applyEdgeEffectColor(recycler_view) + recycler_view.layoutManager = LinearLayoutManager(this) + recycler_view.addItemDecoration(VerticalDivider(this)) + adapter = ArrangeBookAdapter(this) + recycler_view.adapter = adapter + } + + private fun initBookData() { + viewModel.booksLiveData.removeObservers(this) + viewModel.booksLiveData.value = App.db.getBookDao().getAllBooks() + + viewModel.booksLiveData.observe(this, { list -> + Log.e("ArrangeBookActivity", "observeLiveBus: 开始更新") + adapter.isUseEmpty = list.isEmpty() + val books = when (getPrefInt(PreferKey.bookshelfSort)) { + 1 -> list.sortedByDescending { it.lastUpdateChapterDate } + 2 -> list.sortedBy { it.bookName } + else -> list.sortedByDescending { it.durChapterTime } + } + + adapter.setList(books.toMutableList()) + }) + } + + override fun upSelectCount() { + } + + override fun updateBook(vararg book: Book) { + } + + override fun deleteBook(book: Book) { + alert(titleResource = R.string.draw, messageResource = R.string.sure_del) { + okButton { + viewModel.deleteBook(book) + } + }.show().applyTint() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookAdapter.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookAdapter.kt new file mode 100644 index 0000000..1bc810e --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookAdapter.kt @@ -0,0 +1,36 @@ +package com.novel.read.ui.main.bookshelf.arrange + +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.db.entity.Book +import com.novel.read.utils.ext.backgroundColor +import kotlinx.android.synthetic.main.item_arrange_book.view.* +import org.jetbrains.anko.backgroundColor +import org.jetbrains.anko.sdk27.listeners.onClick + +class ArrangeBookAdapter(val callBack: CallBack) : BaseQuickAdapter(R.layout.item_arrange_book) { + override fun convert(holder: BaseViewHolder, item: Book) { + holder.itemView.run { + backgroundColor = context.backgroundColor + tv_name.text = item.bookName + tv_author.text = item.authorPenname + tv_author.visibility = if (item.authorPenname.isEmpty()) View.GONE else View.VISIBLE +// checkbox.isChecked = selectedBooks.contains(item) + iv_book.load(item.coverImageUrl, item.bookName, item.authorPenname) + tv_delete.onClick { + getItem(holder.layoutPosition)?.let { + callBack.deleteBook(it) + } + } + } + } + + + interface CallBack { + fun upSelectCount() + fun updateBook(vararg book: Book) + fun deleteBook(book: Book) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookViewModel.kt b/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookViewModel.kt new file mode 100644 index 0000000..d161456 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/bookshelf/arrange/ArrangeBookViewModel.kt @@ -0,0 +1,20 @@ +package com.novel.read.ui.main.bookshelf.arrange + +import android.app.Application +import androidx.lifecycle.MutableLiveData +import com.novel.read.App +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.EventBus +import com.novel.read.data.db.entity.Book +import com.novel.read.utils.ext.postEvent + +class ArrangeBookViewModel(application: Application) : BaseViewModel(application) { + var booksLiveData = MutableLiveData>() + + fun deleteBook(book: Book) { + App.db.getBookDao().delete(book) + booksLiveData.value = App.db.getBookDao().getAllBooks() + postEvent(EventBus.UP_BOOK, 0L) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/mail/MailFragment.kt b/app/src/main/java/com/novel/read/ui/main/mail/MailFragment.kt new file mode 100644 index 0000000..f7577b1 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/MailFragment.kt @@ -0,0 +1,98 @@ +package com.novel.read.ui.main.mail + +import android.os.Bundle +import android.view.Menu +import android.view.MenuItem +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.novel.read.R +import com.novel.read.base.VMBaseFragment +import com.novel.read.constant.AppConst +import com.novel.read.data.model.* +import com.novel.read.lib.ATH +import com.novel.read.ui.main.mail.pick.PickAdapter +import com.novel.read.ui.search.SearchActivity +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.fragment_mail.rlv_home +import kotlinx.android.synthetic.main.view_title_bar.* +import java.util.ArrayList + +class MailFragment : VMBaseFragment(R.layout.fragment_mail) { + + override val viewModel: MailViewModel + get() = getViewModel(MailViewModel::class.java) + private lateinit var adapter: PickAdapter + private val data: MutableList = ArrayList() + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + setSupportToolbar(toolbar) + ATH.applyEdgeEffectColor(rlv_home) + initRecycleView() + upRecyclerData() + } + + private fun initRecycleView() { + rlv_home.layoutManager = LinearLayoutManager(context) + adapter = PickAdapter(data) + rlv_home.adapter = adapter + } + + private fun upRecyclerData() { + onRefresh() + viewModel.run { + homeResp.observe(viewLifecycleOwner) { + data.clear() + val hotEntity = HotEntity(it.starRank) + val clickEntity = ClickEntity(it.wordNumRank) + val recommendEntity = RecommendEntity(it.recommendRank) + val endEntity = EndEntity(it.clickRank) + data.add(TypeEntity()) + data.add(hotEntity) + data.add(clickEntity) + data.add(recommendEntity) + data.add(endEntity) + adapter.setList(data) + } + + refreshStatus.observe(viewLifecycleOwner) { + when (it) { + AppConst.loading -> { + adapter.isUseEmpty = true + } + AppConst.complete -> { + adapter.isUseEmpty = false + } + else -> { + adapter.setEmptyView(getErrorView()) + adapter.isUseEmpty = true + } + } + } + + } + } + + private fun onRefresh() { + adapter.setEmptyView(R.layout.view_loading) + viewModel.getAll() + } + + private fun getErrorView(): View { + val errorView: View = layoutInflater.inflate(R.layout.view_net_error, rlv_home, false) + errorView.setOnClickListener { onRefresh() } + return errorView + } + + override fun onCompatCreateOptionsMenu(menu: Menu) { + menuInflater.inflate(R.menu.main_mail, menu) + } + + override fun onCompatOptionsItemSelected(item: MenuItem) { + super.onCompatOptionsItemSelected(item) + when (item.itemId) { + R.id.menu_search -> startActivity() + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/mail/MailViewModel.kt b/app/src/main/java/com/novel/read/ui/main/mail/MailViewModel.kt new file mode 100644 index 0000000..4faeb60 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/MailViewModel.kt @@ -0,0 +1,23 @@ +package com.novel.read.ui.main.mail + +import android.app.Application +import androidx.lifecycle.MutableLiveData +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.data.model.HomeResp +import com.novel.read.network.repository.HomeRepository + +class MailViewModel(application: Application) : BaseViewModel(application) { + private val homeRepository by lazy { HomeRepository() } + var homeResp = MutableLiveData() + val refreshStatus = MutableLiveData() + fun getAll() { + refreshStatus.value = AppConst.loading + launch(block = { + homeResp.value = homeRepository.getHomeBook(AppConst.home) + refreshStatus.value = AppConst.complete + }, error = { + refreshStatus.value = AppConst.error + },showErrorToast = false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/mail/RecommentFragment.kt b/app/src/main/java/com/novel/read/ui/main/mail/RecommentFragment.kt new file mode 100644 index 0000000..239d05f --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/RecommentFragment.kt @@ -0,0 +1,4 @@ +package com.novel.read.ui.main.mail + +class RecommentFragment { +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/mail/pick/ClickAdapter.kt b/app/src/main/java/com/novel/read/ui/main/mail/pick/ClickAdapter.kt new file mode 100644 index 0000000..d9a0375 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/pick/ClickAdapter.kt @@ -0,0 +1,24 @@ +package com.novel.read.ui.main.mail.pick + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.ClickRank +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_click_item.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class ClickAdapter :BaseQuickAdapter(R.layout.item_click_item) { + + override fun convert(holder: BaseViewHolder, item: ClickRank) { + holder.itemView.run { + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_name.text = item.getBBookName() + tv_count.text = context.getString(R.string.book_word, item.wordCount / 10000) + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/mail/pick/EndAdapter.kt b/app/src/main/java/com/novel/read/ui/main/mail/pick/EndAdapter.kt new file mode 100644 index 0000000..f17a152 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/pick/EndAdapter.kt @@ -0,0 +1,25 @@ +package com.novel.read.ui.main.mail.pick + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.EndRank +import com.novel.read.lib.ATH +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_end_item.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class EndAdapter :BaseQuickAdapter(R.layout.item_end_item) { + + override fun convert(holder: BaseViewHolder, item: EndRank) { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_name.text = item.getBBookName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/mail/pick/HotAdapter.kt b/app/src/main/java/com/novel/read/ui/main/mail/pick/HotAdapter.kt new file mode 100644 index 0000000..0f7a2b4 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/pick/HotAdapter.kt @@ -0,0 +1,24 @@ +package com.novel.read.ui.main.mail.pick + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.HotRank +import com.novel.read.lib.ATH +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_hot_item.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class HotAdapter :BaseQuickAdapter(R.layout.item_hot_item) { + + override fun convert(holder: BaseViewHolder, item: HotRank) { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_cover.load(item.coverImageUrl, item.getBName(), item.getBAuthor()) + tv_name.text = item.getBName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/mail/pick/PickAdapter.kt b/app/src/main/java/com/novel/read/ui/main/mail/pick/PickAdapter.kt new file mode 100644 index 0000000..7362aef --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/pick/PickAdapter.kt @@ -0,0 +1,150 @@ +package com.novel.read.ui.main.mail.pick + +import androidx.recyclerview.widget.GridLayoutManager +import com.chad.library.adapter.base.BaseMultiItemQuickAdapter +import com.chad.library.adapter.base.entity.MultiItemEntity +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.constant.AppConst +import com.novel.read.constant.IntentAction +import com.novel.read.constant.LayoutType +import com.novel.read.data.model.* +import com.novel.read.lib.ATH +import com.novel.read.ui.channel.ChannelActivity +import com.novel.read.ui.daily.DailyActivity +import com.novel.read.ui.end.EndActivity +import com.novel.read.ui.rank.RankActivity +import kotlinx.android.synthetic.main.item_hot.view.* +import kotlinx.android.synthetic.main.item_pick_head.view.* +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.startActivity + + +class PickAdapter(data: MutableList?) : + BaseMultiItemQuickAdapter(data) { + + init { + addItemType(LayoutType.OTHER, R.layout.item_pick_head) + addItemType(LayoutType.HOT, R.layout.item_hot) + addItemType(LayoutType.CLICK, R.layout.item_hot) + addItemType(LayoutType.RECOMMEND, R.layout.item_hot) + addItemType(LayoutType.END, R.layout.item_hot) + } + + override fun convert(holder: BaseViewHolder, item: T) { + when (item) { + is TypeEntity -> { + holder.itemView.run { + ATH.applyBackgroundTint(this) + tv_daily.onClick { + context.startActivity() + } + tv_rank.onClick { + context.startActivity( + Pair(IntentAction.rankType, LayoutType.HOT), + Pair(IntentAction.homeType, AppConst.home) + ) + } + tv_end.onClick { + context.startActivity() + } + + tv_type.onClick { + context.startActivity() + } + + } + } + is HotEntity -> { + holder.itemView.run { + ATH.applyBackgroundTint(this) + rlv_hot.setHasFixedSize(true) + ll_title.onClick { + context.startActivity( + Pair(IntentAction.rankType, LayoutType.HOT), + Pair(IntentAction.homeType, AppConst.home) + ) + } + if (rlv_hot.layoutManager == null) { + rlv_hot.layoutManager = GridLayoutManager(context, 4) + } + if (rlv_hot.adapter == null) { + val hotAdapter = HotAdapter() + hotAdapter.setList(item.hotRanks) + rlv_hot.adapter = hotAdapter + } + } + } + is ClickEntity -> { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_head.setImageResource(R.drawable.ic_click) + tv_head.text=context.getString(R.string.click_title) + ll_title.onClick { + context.startActivity( + Pair(IntentAction.rankType, LayoutType.CLICK), + Pair(IntentAction.homeType, AppConst.home) + ) + } + rlv_hot.setHasFixedSize(true) + if (rlv_hot.layoutManager == null) { + rlv_hot.layoutManager = GridLayoutManager(context, 2) + } + if (rlv_hot.adapter == null) { + val clickAdapter = ClickAdapter() + clickAdapter.setList(item.clickRanks) + rlv_hot.adapter = clickAdapter + } + } + } + is RecommendEntity -> { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_head.setImageResource(R.drawable.ic_recommend) + tv_head.text=context.getString(R.string.recommend_title) + ll_title.onClick { + context.startActivity( + Pair(IntentAction.rankType, LayoutType.RECOMMEND), + Pair(IntentAction.homeType, AppConst.home) + ) + } + rlv_hot.setHasFixedSize(true) + if (rlv_hot.layoutManager == null) { + rlv_hot.layoutManager = GridLayoutManager(context, 4) + } + if (rlv_hot.adapter == null) { + val recommendAdapter = RecommendAdapter() + recommendAdapter.setList(item.recommendRanks) + rlv_hot.adapter = recommendAdapter + } + } + } + is EndEntity -> { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_head.setImageResource(R.drawable.ic_end) + tv_head.text=context.getString(R.string.end_title) + ll_title.onClick { + context.startActivity( + Pair(IntentAction.rankType, LayoutType.END), + Pair(IntentAction.homeType, AppConst.home) + ) + } + rlv_hot.setHasFixedSize(true) + if (rlv_hot.layoutManager == null) { + rlv_hot.layoutManager = GridLayoutManager(context, 4) + } + if (rlv_hot.adapter == null) { + val endAdapter = EndAdapter() + endAdapter.setList(item.endRanks) + rlv_hot.adapter = endAdapter + } + } + } + } + } + +} + + + diff --git a/app/src/main/java/com/novel/read/ui/main/mail/pick/RecommendAdapter.kt b/app/src/main/java/com/novel/read/ui/main/mail/pick/RecommendAdapter.kt new file mode 100644 index 0000000..baef5fd --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/mail/pick/RecommendAdapter.kt @@ -0,0 +1,42 @@ +package com.novel.read.ui.main.mail.pick + +import com.chad.library.adapter.base.BaseMultiItemQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.constant.LayoutType +import com.novel.read.data.model.RecommendRank +import com.novel.read.lib.ATH +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_end_item.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class RecommendAdapter : BaseMultiItemQuickAdapter() { + + init { + addItemType(LayoutType.RECOMMEND, R.layout.item_recomment_item) + addItemType(LayoutType.HEAD, R.layout.item_recomment_first_item) + } + + override fun convert(holder: BaseViewHolder, item: RecommendRank) { + when (item.itemType) { + LayoutType.HEAD -> { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_name.text = item.getBBookName() + } + } + LayoutType.RECOMMEND -> { + holder.itemView.run { + ATH.applyBackgroundTint(this) + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_name.text = item.getBBookName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/my/MyFragment.kt b/app/src/main/java/com/novel/read/ui/main/my/MyFragment.kt new file mode 100644 index 0000000..996a1da --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/my/MyFragment.kt @@ -0,0 +1,60 @@ +package com.novel.read.ui.main.my + +import android.annotation.SuppressLint +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.View +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BaseFragment +import com.novel.read.ui.feedback.FeedBackActivity +import com.novel.read.ui.setting.SettingActivity +import com.novel.read.ui.widget.dialog.AppraiseDialog +import com.novel.read.utils.ext.startActivity +import com.novel.read.utils.ext.toast +import kotlinx.android.synthetic.main.fragment_my.* +import kotlinx.android.synthetic.main.view_title_bar.* + +class MyFragment : BaseFragment(R.layout.fragment_my) { + + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + setSupportToolbar(toolbar) + tv_options.setOnClickListener { + startActivity() + } + tv_setting.setOnClickListener { + startActivity() + } + tv_appraise.setOnClickListener { + val dialog = AppraiseDialog(requireActivity()) + dialog.appraiseDialog { + goToMarket(App.INSTANCE, App.INSTANCE.packageName) + dialog.dismiss() + } + dialog.show() + } + } + + @SuppressLint("QueryPermissionsNeeded") + fun goToMarket(context: Context, packageName: String) { + val uri = Uri.parse("market://details?id=$packageName") + val goToMarket = Intent(Intent.ACTION_VIEW, uri) + val googlePlay = "com.android.vending" //这里对应的是谷歌商店,跳转别的商店改成对应的即可 + goToMarket.setPackage(googlePlay) //这里对应的是谷歌商店,跳转别的商店改成对应的即可 + try { + startActivity(goToMarket) + } catch (e: ActivityNotFoundException) { + if (goToMarket.resolveActivity(context.packageManager) != null) { //有浏览器 + startActivity(goToMarket) + } else { + toast(R.string.no_google) + } + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/main/my/ToolsAdapter.kt b/app/src/main/java/com/novel/read/ui/main/my/ToolsAdapter.kt new file mode 100644 index 0000000..bf37719 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/main/my/ToolsAdapter.kt @@ -0,0 +1,19 @@ +package com.novel.read.ui.main.my + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.Tools +import com.novel.read.lib.ATH +import kotlinx.android.synthetic.main.item_tools.view.* + +class ToolsAdapter : BaseQuickAdapter(R.layout.item_tools) { + + override fun convert(holder: BaseViewHolder, item: Tools) { + holder.itemView.run { + ATH.applyBackgroundTint(this) + tv_tools.text = item.title + iv_tools.setImageResource(item.img) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/rank/RankActivity.kt b/app/src/main/java/com/novel/read/ui/rank/RankActivity.kt new file mode 100644 index 0000000..86d830a --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/rank/RankActivity.kt @@ -0,0 +1,133 @@ +package com.novel.read.ui.rank + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.observe +import androidx.recyclerview.widget.LinearLayoutManager +import com.chad.library.adapter.base.listener.OnLoadMoreListener +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.AppConst +import com.novel.read.constant.IntentAction +import com.novel.read.constant.LayoutType +import com.novel.read.data.model.* +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.getViewModel +import kotlinx.android.synthetic.main.activity_rank.* + +class RankActivity : VMBaseActivity(R.layout.activity_rank) { + + override val viewModel: RankViewModel + get() = getViewModel(RankViewModel::class.java) + + private lateinit var adapter: RankAdapter + private lateinit var typeAdapter: TypeAdapter + private lateinit var mTypes: List + override fun onActivityCreated(savedInstanceState: Bundle?) { + ATH.applyEdgeEffectColor(rlv_rank) + ATH.applyEdgeEffectColor(lv_type) + initRecyclerView() + upRecyclerData() + initLoadMore() + } + + private fun initRecyclerView() { + rlv_rank.layoutManager = LinearLayoutManager(this) + adapter = RankAdapter() + rlv_rank.adapter = adapter + lv_type.layoutManager = LinearLayoutManager(this) + typeAdapter = TypeAdapter() + lv_type.adapter = typeAdapter + + } + + private fun upRecyclerData() { + viewModel.pageType = intent.getIntExtra(IntentAction.homeType, AppConst.home) + viewModel.rankType = intent.getIntExtra(IntentAction.rankType, LayoutType.HOT) + + when (viewModel.pageType) { + AppConst.home -> { + mTypes = rankList(viewModel.rankType) + } + AppConst.man -> { + mTypes = manList(viewModel.rankType) + } + AppConst.woman -> { + mTypes = womanList(viewModel.rankType) + } + } + + typeAdapter.setList(mTypes) + typeAdapter.setOnItemClickListener { adapter, view, position -> + for (i in 0 until typeAdapter.data.size) { + typeAdapter.data[i].check = false + } + typeAdapter.data[position].check = true + typeAdapter.notifyDataSetChanged() + viewModel.rankType = typeAdapter.data[position].rankType + viewModel.page = 1 + onRefresh() + } + + onRefresh() + viewModel.run { + bookListResp.observe(this@RankActivity) { + adapter.setList(it) + } + pageStatus.observe(this@RankActivity) { + when (it) { + AppConst.loading -> { + adapter.isUseEmpty = true + } + AppConst.complete -> { + adapter.isUseEmpty = false + } + AppConst.loadMore -> { + adapter.loadMoreModule.isEnableLoadMore = true + } + AppConst.loadComplete -> { + adapter.loadMoreModule.loadMoreComplete() + } + AppConst.noMore -> { + adapter.loadMoreModule.loadMoreEnd() + } + AppConst.loadMoreFail -> { + adapter.loadMoreModule.loadMoreFail() + } + else -> { + adapter.setList(null) + adapter.setEmptyView(getErrorView()) + adapter.isUseEmpty = true + } + } + } + } + } + + private fun initLoadMore() { + adapter.loadMoreModule.setOnLoadMoreListener(object : OnLoadMoreListener { + override fun onLoadMore() { + if (viewModel.pageStatus.value == AppConst.loadMore) { + return + } + viewModel.loadMore() + } + }) + adapter.loadMoreModule.isAutoLoadMore = true + adapter.loadMoreModule.isEnableLoadMoreIfNotFullPage = false + } + + private fun onRefresh() { + adapter.setList(null) + adapter.setEmptyView(R.layout.view_loading) + viewModel.initData() + } + + private fun getErrorView(): View { + val errorView: View = layoutInflater.inflate(R.layout.view_net_error, rlv_rank, false) + errorView.setOnClickListener { onRefresh() } + return errorView + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/rank/RankAdapter.kt b/app/src/main/java/com/novel/read/ui/rank/RankAdapter.kt new file mode 100644 index 0000000..dabba57 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/rank/RankAdapter.kt @@ -0,0 +1,28 @@ +package com.novel.read.ui.rank + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.BookListResp +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_book_common.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class RankAdapter : + BaseQuickAdapter(R.layout.item_book_common), LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: BookListResp) { + holder.itemView.run { + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_book_name.text = item.getBBookName() + tv_book_description.text = item.getBIntroduction() + tv_book_author.text = item.getBAuthorName() + tv_word.text = context.getString(R.string.book_word, item.wordCount / 10000) + tv_category.text = item.getBCategoryName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/rank/RankViewModel.kt b/app/src/main/java/com/novel/read/ui/rank/RankViewModel.kt new file mode 100644 index 0000000..ba347c3 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/rank/RankViewModel.kt @@ -0,0 +1,52 @@ +package com.novel.read.ui.rank + +import android.app.Application +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.data.model.BookListResp +import com.novel.read.network.repository.BookRepository + +class RankViewModel(application: Application) : BaseViewModel(application) { + + private val bookRepository by lazy { BookRepository() } + var bookListResp = MutableLiveData>() + private lateinit var mList: MutableList + val pageStatus = MutableLiveData() + var page: Int = 1 + private var pageSize: Int = 20 + var rankType: Int = 1 + var pageType: Int = 1 + + fun initData() { + launch(block = { + pageStatus.value = AppConst.loading + Log.e("initData", "initData: $rankType", ) + val data = bookRepository.getBooRank(page, pageSize, rankType) + mList = data.bookRankList + bookListResp.value = mList + pageStatus.value = AppConst.complete + },error = { + pageStatus.value = AppConst.error + }) + } + + fun loadMore() { + Log.e("loadMore", "loadMore: $page") + launch(block = { + pageStatus.value = AppConst.loadMore + page++ + val mData = bookRepository.getBooRank(page, pageSize, rankType).bookRankList + mList.addAll(mData) + bookListResp.value = mList + pageStatus.value = AppConst.loadComplete + if (pageSize > mData.size) { + pageStatus.value = AppConst.noMore + } + }, error = { + page-- + pageStatus.value = AppConst.loadMoreFail + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/rank/TypeAdapter.kt b/app/src/main/java/com/novel/read/ui/rank/TypeAdapter.kt new file mode 100644 index 0000000..301c608 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/rank/TypeAdapter.kt @@ -0,0 +1,26 @@ +package com.novel.read.ui.rank + +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.TypeName +import kotlinx.android.synthetic.main.item_type.view.* + +class TypeAdapter : + BaseQuickAdapter(R.layout.item_type), LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: TypeName) { + holder.itemView.run { + tv_type.text = item.name + if (item.check) { + iv_check.visibility = View.VISIBLE + ll_bg.setBackgroundColor(context.resources.getColor(R.color.background)) + } else { + iv_check.visibility = View.GONE + ll_bg.setBackgroundColor(context.resources.getColor(R.color.background_menu)) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/ReadBookActivity.kt b/app/src/main/java/com/novel/read/ui/read/ReadBookActivity.kt new file mode 100644 index 0000000..5cf851d --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/ReadBookActivity.kt @@ -0,0 +1,690 @@ +package com.novel.read.ui.read + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.content.res.Configuration +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.net.Uri +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.* +import androidx.core.view.isVisible +import androidx.lifecycle.observe +import com.novel.read.BuildConfig +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.EventBus +import com.novel.read.constant.PreferKey +import com.novel.read.constant.Status +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.help.ReadBookConfig +import com.novel.read.lib.ATH +import com.novel.read.lib.dialogs.alert +import com.novel.read.lib.dialogs.noButton +import com.novel.read.lib.dialogs.okButton +import com.novel.read.service.BaseReadAloudService +import com.novel.read.service.help.ReadAloud +import com.novel.read.service.help.ReadBook +import com.novel.read.ui.chapter.ChapterListActivity +import com.novel.read.ui.info.BookInfoActivity +import com.novel.read.ui.read.config.ReadAdjustDialog +import com.novel.read.ui.read.config.ReadAloudDialog +import com.novel.read.ui.read.config.ReadStyleDialog +import com.novel.read.ui.read.page.ContentTextView +import com.novel.read.ui.read.page.PageView +import com.novel.read.ui.read.page.TextPageFactory +import com.novel.read.ui.read.page.delegate.PageDelegate +import com.novel.read.ui.widget.dialog.AutoReadDialog +import com.novel.read.ui.widget.dialog.TextDialog +import com.novel.read.user.VipHelper +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.activity_read_book.* +import kotlinx.android.synthetic.main.view_read_menu.* +import kotlinx.coroutines.* +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.startActivityForResult +import java.lang.Runnable + +class ReadBookActivity : VMBaseActivity(R.layout.activity_read_book), + View.OnTouchListener, PageView.CallBack, TextActionMenu.CallBack, ContentTextView.CallBack, + ReadBook.CallBack, + ReadMenu.CallBack, + ReadAloudDialog.CallBack { + + override val viewModel: ReadBookViewModel + get() = getViewModel(ReadBookViewModel::class.java) + + override val selectedText: String + get() = page_view.curPage.selectedText + + private val requestCodeChapterList = 568 + private val requestCodeSearchResult = 123 + private var menu: Menu? = null + private var textActionMenu: TextActionMenu? = null + + override val scope: CoroutineScope get() = this + override val isInitFinish: Boolean get() = viewModel.isInitFinish + override val isScroll: Boolean get() = page_view.isScroll + private val mHandler = Handler(Looper.getMainLooper()) + private val keepScreenRunnable: Runnable = + Runnable { ReadBookActivityHelp.keepScreenOn(window, false) } + override var autoPageProgress = 0 + + override var isAutoPage = false + private var screenTimeOut: Long = 0 + private var loadStates: Boolean = false + override val pageFactory: TextPageFactory get() = page_view.pageFactory + override val headerHeight: Int get() = page_view.curPage.headerHeight + + override fun onCreate(savedInstanceState: Bundle?) { + ReadBook.msg = null + ReadBookActivityHelp.setOrientation(this) + super.onCreate(savedInstanceState) + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + ReadBookActivityHelp.upLayoutInDisplayCutoutMode(window) + initView() + upScreenTimeOut() + setScreenBrightness(getPrefInt("brightness", 100)) + ReadBook.callBack = this + ReadBook.titleDate.observe(this) { + title_bar.title = it + upMenu() + upView() + } + viewModel.initData(intent) + } + + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + upSystemUiVisibility() + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + page_view.upStatusBar() + ReadBook.loadContent(resetPageOffset = false) + } + + override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.read_book, menu) + return super.onCompatCreateOptionsMenu(menu) + } + + override fun onPrepareOptionsMenu(menu: Menu?): Boolean { + this.menu = menu + upMenu() + return super.onPrepareOptionsMenu(menu) + } + + private fun upMenu() { + menu?.let { menu -> + ReadBook.book?.let { book -> + + } + } + } + + /** + * 菜单 + */ + override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_refresh -> { + ReadBook.book?.let { + ReadBook.curTextChapter = null + page_view.upContent() + viewModel.refreshContent(it) + } + } + R.id.menu_download -> ReadBookActivityHelp.showDownloadDialog(this) + R.id.menu_add_bookmark -> ReadBookActivityHelp.showBookMark(this) + R.id.menu_copy_text -> + TextDialog.show(supportFragmentManager, ReadBook.curTextChapter?.getContent()) + R.id.menu_update_toc -> ReadBook.book?.let { + loadChapterList(it) + } + R.id.menu_page_anim -> ReadBookActivityHelp.showPageAnimConfig(this) { + page_view.upPageAnim() + } + R.id.menu_book_info -> ReadBook.book?.let { + BookInfoActivity.actionBookInfo(this, it.bookId, it.bookTypeId) + } + } + return super.onCompatOptionsItemSelected(item) + } + + override fun onResume() { + super.onResume() + ReadBook.readStartTime = System.currentTimeMillis() + upSystemUiVisibility() + page_view.upTime() + } + + override fun onPause() { + super.onPause() + ReadBook.saveRead() + upSystemUiVisibility() + } + + override fun upNavigationBarColor() { + when { + read_menu == null -> return + read_menu.isVisible -> { + ATH.setNavigationBarColorAuto(this) + } + ReadBookConfig.bg is ColorDrawable -> { + ATH.setNavigationBarColorAuto(this, ReadBookConfig.bgMeanColor) + } + else -> { + ATH.setNavigationBarColorAuto(this, Color.BLACK) + } + } + } + + + /** + * 初始化View + */ + private fun initView() { + cursor_left.setColorFilter(accentColor) + cursor_right.setColorFilter(accentColor) + cursor_left.setOnTouchListener(this) + cursor_right.setOnTouchListener(this) + tv_chapter_name.onClick { + + } + tv_chapter_url.onClick { + runCatching { + val url = tv_chapter_url.text.toString() + val intent = Intent(Intent.ACTION_VIEW) + intent.data = Uri.parse(url) + startActivity(intent) + } + } + + adView.setBackgroundColor(ReadBookConfig.bgMeanColor) + adView.alpha = 0.3f + if (VipHelper.showAd()) { +// adView.visibility = View.VISIBLE +// //底部banner google +// val mPublisherAdView = PublisherAdView(this) +// mPublisherAdView.adUnitId = "ca-app-pub-5528897088703176/7116750145" +// adView.removeAllViews() +// adView.addView(mPublisherAdView) +// val adRequest = PublisherAdRequest.Builder().build() +// mPublisherAdView.setAdSizes(getAdSize(), AdSize.BANNER) +// mPublisherAdView.loadAd(adRequest) + } else { + adView.visibility = View.GONE + } + + + } + +// private fun getAdSize(): AdSize? { +// val display = windowManager.defaultDisplay +// val outMetrics = DisplayMetrics() +// display.getMetrics(outMetrics) +// val widthPixels = outMetrics.widthPixels.toFloat() +// val density = outMetrics.density +// val adWidth = (widthPixels / density).toInt() +// return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, adWidth) +// } + + override fun clickCenter() { + when { + BaseReadAloudService.isRun -> { + showReadAloudDialog() + } + isAutoPage -> { + AutoReadDialog().show(supportFragmentManager, "autoRead") + } + else -> { + read_menu.runMenuIn() + } + } + } + + + override fun showTextActionMenu() { + textActionMenu ?: let { + textActionMenu = TextActionMenu(this, this) + } + textActionMenu?.let { popup -> + popup.contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) + val popupHeight = popup.contentView.measuredHeight + val x = text_menu_position.x.toInt() + var y = text_menu_position.y.toInt() - popupHeight + if (y < statusBarHeight) { + y = (cursor_left.y + cursor_left.height).toInt() + } + if (cursor_right.y > y && cursor_right.y < y + popupHeight) { + y = (cursor_right.y + cursor_right.height).toInt() + } + if (!popup.isShowing) { + popup.showAtLocation(text_menu_position, Gravity.TOP or Gravity.START, x, y) + } else { + popup.update( + x, y, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + } + } + + override fun loadChapterList(book: Book) { + ReadBook.upMsg(getString(R.string.toc_updateing)) + viewModel.loadChapterList(book) + } + + override fun upContent(relativePosition: Int, resetPageOffset: Boolean) { + autoPageProgress = 0 + launch { + page_view.upContent(relativePosition, resetPageOffset) + seek_read_page.progress = ReadBook.durPageIndex + } + loadStates = false + } + + override fun upView() { + launch { + ReadBook.curTextChapter?.let { + tv_chapter_name.text = it.title +// tv_chapter_name.visible() + if (!ReadBook.isLocalBook) { + tv_chapter_url.text = it.title +// tv_chapter_url.visible() + } else { + tv_chapter_url.gone() + } + seek_read_page.max = it.pageSize.minus(1) + seek_read_page.progress = ReadBook.durPageIndex + tv_pre.isEnabled = ReadBook.durChapterIndex != 0 + tv_next.isEnabled = ReadBook.durChapterIndex != ReadBook.chapterSize - 1 + } ?: let { + tv_chapter_name.gone() + tv_chapter_url.gone() + } + } + } + + override fun pageChanged() { + autoPageProgress = 0 + launch { + seek_read_page.progress = ReadBook.durPageIndex + } + } + + override fun contentLoadFinish() { + if (intent.getBooleanExtra("readAloud", false)) { + intent.removeExtra("readAloud") + ReadBook.readAloud() + } + loadStates = true + } + + override fun upSelectedStart(x: Float, y: Float, top: Float) { + cursor_left.x = x - cursor_left.width + cursor_left.y = y + cursor_left.visible(true) + text_menu_position.x = x + text_menu_position.y = top + } + + override fun upSelectedEnd(x: Float, y: Float) { + cursor_right.x = x + cursor_right.y = y + cursor_right.visible(true) + } + + override fun onCancelSelect() { + cursor_left.invisible() + cursor_right.invisible() + textActionMenu?.dismiss() + } + + private fun upScreenTimeOut() { + getPrefString(PreferKey.keepLight)?.let { + screenTimeOut = it.toLong() * 1000 + } + screenOffTimerStart() + } + + override fun screenOffTimerStart() { + if (screenTimeOut < 0) { + ReadBookActivityHelp.keepScreenOn(window, true) + return + } + val t = screenTimeOut - sysScreenOffTime + if (t > 0) { + mHandler.removeCallbacks(keepScreenRunnable) + ReadBookActivityHelp.keepScreenOn(window, true) + mHandler.postDelayed(keepScreenRunnable, screenTimeOut) + } else { + ReadBookActivityHelp.keepScreenOn(window, false) + } + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouch(v: View, event: MotionEvent): Boolean { + when (event.action) { + MotionEvent.ACTION_DOWN -> textActionMenu?.dismiss() + MotionEvent.ACTION_MOVE -> { + when (v.id) { + R.id.cursor_left -> page_view.curPage.selectStartMove( + event.rawX + cursor_left.width, + event.rawY - cursor_left.height + ) + R.id.cursor_right -> page_view.curPage.selectEndMove( + event.rawX - cursor_right.width, + event.rawY - cursor_right.height + ) + } + } + MotionEvent.ACTION_UP -> showTextActionMenu() + } + return true + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + when { + ReadBookActivityHelp.isPrevKey(this, keyCode) -> { + if (keyCode != KeyEvent.KEYCODE_UNKNOWN) { + page_view.pageDelegate?.keyTurnPage(PageDelegate.Direction.PREV) + return true + } + } + ReadBookActivityHelp.isNextKey(this, keyCode) -> { + if (keyCode != KeyEvent.KEYCODE_UNKNOWN) { + page_view.pageDelegate?.keyTurnPage(PageDelegate.Direction.NEXT) + return true + } + } + keyCode == KeyEvent.KEYCODE_VOLUME_UP -> { + if (volumeKeyPage(PageDelegate.Direction.PREV)) { + return true + } + } + keyCode == KeyEvent.KEYCODE_VOLUME_DOWN -> { + if (volumeKeyPage(PageDelegate.Direction.NEXT)) { + return true + } + } + keyCode == KeyEvent.KEYCODE_SPACE -> { + page_view.pageDelegate?.keyTurnPage(PageDelegate.Direction.NEXT) + return true + } + } + return super.onKeyDown(keyCode, event) + } + + /** + * 音量键翻页 + */ + private fun volumeKeyPage(direction: PageDelegate.Direction): Boolean { + if (!read_menu.isVisible) { + if (getPrefBoolean("volumeKeyPage", true)) { + if (getPrefBoolean("volumeKeyPageOnPlay") + || BaseReadAloudService.pause + ) { + page_view.pageDelegate?.isCancel = false + page_view.pageDelegate?.keyTurnPage(direction) + return true + } + } + } + return false + } + + override fun observeLiveBus() { + super.observeLiveBus() + observeEvent(EventBus.TIME_CHANGED) { page_view.upTime() } + observeEvent(EventBus.BATTERY_CHANGED) { page_view.upBattery(it) } + observeEvent(EventBus.OPEN_CHAPTER) { + viewModel.openChapter(it.chapterIndex, ReadBook.durPageIndex) + page_view.upContent() + } + observeEvent(EventBus.MEDIA_BUTTON) { + if (it) { + onClickReadAloud() + } else { + ReadBook.readAloud(!BaseReadAloudService.pause) + } + } + observeEvent(EventBus.UP_CONFIG) { + upSystemUiVisibility() + page_view.upBg() + page_view.upTipStyle() + page_view.upStyle() + if (it) { + ReadBook.loadContent(resetPageOffset = false) + } else { + page_view.upContent(resetPageOffset = false) + } + adView.setBackgroundColor(ReadBookConfig.bgMeanColor) + } + observeEvent(EventBus.ALOUD_STATE) { + if (it == Status.STOP || it == Status.PAUSE) { + ReadBook.curTextChapter?.let { textChapter -> + val page = textChapter.page(ReadBook.durPageIndex) + if (page != null) { + page.removePageAloudSpan() + page_view.upContent(resetPageOffset = false) + } + } + } + } + observeEventSticky(EventBus.TTS_PROGRESS) { chapterStart -> + launch(Dispatchers.IO) { + if (BaseReadAloudService.isPlay()) { + ReadBook.curTextChapter?.let { textChapter -> + val pageStart = + chapterStart - textChapter.getReadLength(ReadBook.durPageIndex) + textChapter.page(ReadBook.durPageIndex)?.upPageAloudSpan(pageStart) + upContent() + } + } + } + } + observeEvent(PreferKey.keepLight) { + upScreenTimeOut() + } + observeEvent(PreferKey.textSelectAble) { + page_view.curPage.upSelectAble(it) + } + observeEvent(PreferKey.showBrightnessView) { + setScreenBrightness(getPrefInt("brightness", 100)) + } + + } + + /** + * 设置屏幕亮度 + */ + private fun setScreenBrightness(value: Int) { + var brightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE + if (!brightnessAuto()) { + brightness = value.toFloat() + if (brightness < 1f) brightness = 1f + brightness /= 255f + } + val params = window?.attributes + params?.screenBrightness = brightness + window?.attributes = params + } + + private fun brightnessAuto(): Boolean { + return getPrefBoolean("brightnessAuto", true) + } + + override fun autoPage() { + } + + override fun openReplaceRule() { + } + + override fun showMenuBar() { + read_menu.runMenuIn() + } + + override fun openChapterList() { + ReadBook.book?.let { + startActivityForResult( + requestCodeChapterList, + Pair("bookId", it.bookId.toString()) + ) + } + } + + override fun openSearchActivity(searchWord: String?) { + + } + + override fun showReadStyle() { + ReadStyleDialog().show(supportFragmentManager, "readStyle") + } + + override fun showAdjust() { + ReadAdjustDialog().show(supportFragmentManager, "readStyle") + } + + override fun showReadAloudDialog() { + ReadAloudDialog().show(supportFragmentManager, "readAloud") + } + + override fun upSystemUiVisibility() { + } + + override fun onClickReadAloud() { + when { + !BaseReadAloudService.isRun -> ReadBook.readAloud() + BaseReadAloudService.pause -> ReadAloud.resume(this) + else -> ReadAloud.pause(this) + } + } + + fun showBgTextConfig() { +// BgTextConfigDialog().show(supportFragmentManager, "bgTextConfig") + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + requestCodeChapterList -> + data?.getIntExtra("index", ReadBook.durChapterIndex)?.let { index -> + if (index != ReadBook.durChapterIndex) { + val pageIndex = data.getIntExtra("pageIndex", 0) + viewModel.openChapter(index, pageIndex) + } + } + requestCodeSearchResult -> + data?.getIntExtra("index", ReadBook.durChapterIndex)?.let { index -> + launch(Dispatchers.IO) { + val indexWithinChapter = data.getIntExtra("indexWithinChapter", 0) + viewModel.searchContentQuery = data.getStringExtra("query") ?: "" + viewModel.openChapter(index) + // block until load correct chapter and pages + var pages = ReadBook.curTextChapter?.pages + while (ReadBook.durChapterIndex != index || pages == null) { + delay(100L) + pages = ReadBook.curTextChapter?.pages + } + val positions = + ReadBook.searchResultPositions( + pages, + indexWithinChapter, + viewModel.searchContentQuery + ) + while (ReadBook.durPageIndex != positions[0]) { + delay(100L) + ReadBook.skipToPage(positions[0]) + } + withContext(Dispatchers.Main) { + page_view.curPage.selectStartMoveIndex( + 0, + positions[1], + positions[2] + ) + delay(20L) + when (positions[3]) { + 0 -> page_view.curPage.selectEndMoveIndex( + 0, + positions[1], + positions[2] + viewModel.searchContentQuery.length - 1 + ) + 1 -> page_view.curPage.selectEndMoveIndex( + 0, + positions[1] + 1, + positions[4] + ) + //todo: consider change page, jump to scroll position + -1 -> page_view.curPage.selectEndMoveIndex(1, 0, positions[4]) + } + page_view.isTextSelected = true + delay(100L) + } + } + } + } + + } + } + + override fun onMenuItemSelected(itemId: Int): Boolean { + when (itemId) { + R.id.menu_search_content -> { + viewModel.searchContentQuery = selectedText + openSearchActivity(selectedText) + return true + } + } + return false + } + + override fun onMenuActionFinally() { + textActionMenu?.dismiss() + page_view.curPage.cancelSelect() + page_view.isTextSelected = false + } + + override fun finish() { + ReadBook.book?.let { + if (!ReadBook.inBookshelf) { + this.alert(title = getString(R.string.add_to_shelf)) { + message = getString(R.string.check_add_bookshelf, it.bookName) + okButton { + ReadBook.inBookshelf = true + setResult(Activity.RESULT_OK) + super.finish() + } + noButton { viewModel.removeFromBookshelf { super.finish() } } + }.show().applyTint() + } else { + super.finish() + } + } ?: super.finish() + } + + override fun onDestroy() { + super.onDestroy() + postEvent(EventBus.UP_BOOK, 0L) + mHandler.removeCallbacks(keepScreenRunnable) + textActionMenu?.dismiss() + page_view.onDestroy() + ReadBook.msg = null + if (!BuildConfig.DEBUG) { +// SyncBookProgress.uploadBookProgress() +// Backup.autoBack(this) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/ReadBookActivityHelp.kt b/app/src/main/java/com/novel/read/ui/read/ReadBookActivityHelp.kt new file mode 100644 index 0000000..51c3a30 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/ReadBookActivityHelp.kt @@ -0,0 +1,217 @@ +package com.novel.read.ui.read + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.pm.ActivityInfo +import android.os.AsyncTask +import android.os.Build +import android.view.LayoutInflater +import android.view.View +import android.view.Window +import android.view.WindowManager +import android.widget.EditText +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.PreferKey +import com.novel.read.data.db.entity.Bookmark +import com.novel.read.help.AppConfig +import com.novel.read.help.ReadBookConfig +import com.novel.read.lib.ATH +import com.novel.read.lib.ThemeStore +import com.novel.read.lib.dialogs.* +import com.novel.read.service.help.CacheBook +import com.novel.read.service.help.ReadBook +import com.novel.read.utils.ext.applyTint +import com.novel.read.utils.ext.backgroundColor +import com.novel.read.utils.ext.getPrefString +import com.novel.read.utils.ext.requestInputMethod +import kotlinx.android.synthetic.main.dialog_download_choice.view.* +import kotlinx.android.synthetic.main.dialog_edit_text.view.* +import org.jetbrains.anko.layoutInflater + + +object ReadBookActivityHelp { + + /** + * 更新状态栏,导航栏 + */ + fun upSystemUiVisibility( + window: Window, + isInMultiWindow: Boolean, + toolBarHide: Boolean = true + ) { + var flag = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_IMMERSIVE + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) + if (!isInMultiWindow) { + flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + } + if (ReadBookConfig.hideNavigationBar) { + flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + } + if (toolBarHide) { + if (ReadBookConfig.hideStatusBar) { + flag = flag or View.SYSTEM_UI_FLAG_FULLSCREEN + } + if (ReadBookConfig.hideNavigationBar) { + flag = flag or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + } + } + window.decorView.systemUiVisibility = flag + if (toolBarHide) { + ATH.setLightStatusBar(window, ReadBookConfig.durConfig.curStatusIconDark()) + } else { + ATH.setLightStatusBarAuto( + window, + ThemeStore.statusBarColor(App.INSTANCE, AppConfig.isTransparentStatusBar) + ) + } + } + + /** + * 屏幕方向 + */ + @SuppressLint("SourceLockedOrientationActivity") + fun setOrientation(activity: Activity) = activity.apply { + when (AppConfig.requestedDirection) { + "0" -> requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + "1" -> requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + "2" -> requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + "3" -> requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR + } + } + + + /** + * 保持亮屏 + */ + fun keepScreenOn(window: Window, on: Boolean) { + if (on) { + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + } + + /** + * 适配刘海 + */ + fun upLayoutInDisplayCutoutMode(window: Window) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && AppConfig.readBodyToLh) { + window.attributes = window.attributes.apply { + layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES + } + } + } + + @SuppressLint("InflateParams") + fun showDownloadDialog(context: Context) { + ReadBook.book?.let { book -> + context.alert(titleResource = R.string.offline_cache) { + var view: View? = null + customView { + LayoutInflater.from(context).inflate(R.layout.dialog_download_choice, null) + .apply { + view = this + setBackgroundColor(context.backgroundColor) + edit_start.setText((book.durChapterIndex + 1).toString()) + edit_end.setText( + App.db.getChapterDao().getChapterCount(bookId = book.bookId).toString() + ) + } + } + yesButton { + view?.apply { + val start = edit_start?.text?.toString()?.toInt() ?: 0 + val end = edit_end?.text?.toString()?.toInt() ?: App.db.getChapterDao() + .getChapterCount(bookId = book.bookId) + CacheBook.start(context, book.bookId, start - 1, end - 1) + } + } + noButton() + }.show().applyTint() + } + } + + @SuppressLint("InflateParams") + fun showBookMark(context: Context) = with(context) { + val book = ReadBook.book ?: return + val textChapter = ReadBook.curTextChapter ?: return + context.alert(title = getString(R.string.bookmark_add)) { + var editText: EditText? = null + message = book.bookName + " • " + textChapter.title + customView { + layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { + editText = edit_view.apply { + setHint(R.string.note_content) + } + } + } + yesButton { + editText?.text?.toString()?.let { editContent -> + AsyncTask.execute { + val bookmark = Bookmark( + bookId = book.bookId, + bookName = book.bookName, + chapterIndex = ReadBook.durChapterIndex, + pageIndex = ReadBook.durPageIndex, + chapterName = textChapter.title, + content = editContent + ) + App.db.getBookMarkDao().insert(bookmark) + } + } + } + noButton() + }.show().applyTint().requestInputMethod() + } + + @SuppressLint("InflateParams") + fun showCharsetConfig(context: Context) = with(context) { +// val charsets = +// arrayListOf("UTF-8", "GB2312", "GBK", "Unicode", "UTF-16", "UTF-16LE", "ASCII") +// alert(R.string.set_charset) { +// var editText: AutoCompleteTextView? = null +// customView { +// layoutInflater.inflate(R.layout.dialog_edit_text, null).apply { +// editText = edit_view +// edit_view.setFilterValues(charsets) +// edit_view.setText(ReadBook.book?.charset) +// } +// } +// okButton { +// val text = editText?.text?.toString() +// text?.let { +// ReadBook.setCharset(it) +// } +// } +// cancelButton() +// }.show().applyTint() + } + + fun showPageAnimConfig(context: Context, success: () -> Unit) = with(context) { + val items = arrayListOf() + items.add(getString(R.string.btn_default_s)) + items.add(getString(R.string.page_anim_cover)) + items.add(getString(R.string.page_anim_slide)) + items.add(getString(R.string.page_anim_simulation)) + items.add(getString(R.string.page_anim_scroll)) + items.add(getString(R.string.page_anim_none)) + selector(R.string.page_anim, items) { _, i -> + ReadBookConfig.pageAnim + success() + } + } + + fun isPrevKey(context: Context, keyCode: Int): Boolean { + val prevKeysStr = context.getPrefString(PreferKey.prevKeys) + return prevKeysStr?.split(",")?.contains(keyCode.toString()) ?: false + } + + fun isNextKey(context: Context, keyCode: Int): Boolean { + val nextKeysStr = context.getPrefString(PreferKey.nextKeys) + return nextKeysStr?.split(",")?.contains(keyCode.toString()) ?: false + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/ReadBookViewModel.kt b/app/src/main/java/com/novel/read/ui/read/ReadBookViewModel.kt new file mode 100644 index 0000000..90f990f --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/ReadBookViewModel.kt @@ -0,0 +1,182 @@ +package com.novel.read.ui.read + +import android.app.Application +import android.content.Intent +import android.util.Log +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BaseViewModel +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.help.BookHelp +import com.novel.read.help.IntentDataHelp +import com.novel.read.network.repository.BookRepository +import com.novel.read.service.BaseReadAloudService +import com.novel.read.service.help.ReadAloud +import com.novel.read.service.help.ReadBook + +class ReadBookViewModel(application: Application) : BaseViewModel(application) { + private val bookRepository by lazy { BookRepository() } + var isInitFinish = false + var searchContentQuery = "" + + fun initData(intent: Intent) { + execute { + ReadBook.inBookshelf = intent.getBooleanExtra("inBookshelf", true) + IntentDataHelp.getData(intent.getStringExtra("key"))?.let { + initBook(it) + } ?: intent.getStringExtra("bookId")?.let { + App.db.getBookDao().getBook(it)?.let { book -> + initBook(book) + } + } ?: App.db.getBookDao().lastReadBook().let { + initBook(it) + } + }.onFinally { + if (ReadBook.inBookshelf) { + ReadBook.saveRead() + } + } + } + + private fun initBook(book: Book) { + if (ReadBook.book?.bookId != book.bookId) { + ReadBook.resetData(book) + isInitFinish = true + ReadBook.chapterSize = App.db.getChapterDao().getChapterCount(book.bookId) + if (ReadBook.chapterSize == 0 || !ReadBook.inBookshelf) { + loadChapterList(book) + } else { + if (ReadBook.durChapterIndex > ReadBook.chapterSize - 1) { + ReadBook.durChapterIndex = ReadBook.chapterSize - 1 + } + ReadBook.loadContent(resetPageOffset = true) + } + } else { + ReadBook.book = book + if (ReadBook.durChapterIndex != book.durChapterIndex) { + ReadBook.durChapterIndex = book.durChapterIndex + ReadBook.durPageIndex = book.durChapterPos + ReadBook.prevTextChapter = null + ReadBook.curTextChapter = null + ReadBook.nextTextChapter = null + } + ReadBook.titleDate.postValue(book.bookName) + isInitFinish = true + ReadBook.chapterSize = App.db.getChapterDao().getChapterCount(book.bookId) + if (ReadBook.chapterSize == 0 || !ReadBook.inBookshelf) { + loadChapterList(book) + } else { + if (ReadBook.curTextChapter != null) { + ReadBook.callBack?.upContent(resetPageOffset = false) + } else { + ReadBook.loadContent(resetPageOffset = true) + } + } + } + } + + fun loadChapterList( + book: Book, + changeDruChapterIndex: ((chapters: List) -> Unit)? = null + ) { + Log.e("loadChapterList", "loadChapterList: ") + if (book.isLocalBook()) { +// execute { +// LocalBook.getChapterList(book).let { +// App.db.getChapterDao().delByBook(book.bookUrl) +// App.db.getChapterDao().insert(*it.toTypedArray()) +// App.db.getBookDao().update(book) +// ReadBook.chapterSize = it.size +// if (it.isEmpty()) { +// ReadBook.upMsg(context.getString(R.string.error_load_toc)) +// } else { +// ReadBook.upMsg(null) +// ReadBook.loadContent(resetPageOffset = true) +// } +// } +// }.onError { +// ReadBook.upMsg("LoadTocError:${it.localizedMessage}") +// } + } else { + launch( + block = { + val bookChapters = bookRepository.getDirectory(book.bookId).chapterList + + val cList = arrayListOf() + for (chapter in bookChapters!!) { + val bookChapter = BookChapter( + bookId = chapter.bookId, + chapterId = chapter.chapterId, + chapterIndex = chapter.chapterIndex - 1, + chapterName = chapter.chapterName, + createTimeValue = chapter.createTime, + updateDate = "", + updateTimeValue = 0L, + chapterUrl = chapter.chapterUrl + ) + cList.add(bookChapter) + } + if (cList.isNotEmpty()) { + if (changeDruChapterIndex == null) { + App.db.getChapterDao().insert(cList.toTypedArray()) + book.totalChapterNum = cList.size + App.db.getBookDao().update(book) + ReadBook.chapterSize = cList.size + ReadBook.upMsg(null) + ReadBook.loadContent(resetPageOffset = true) + } else { + changeDruChapterIndex(cList) + } + } else { + ReadBook.upMsg(context.getString(R.string.error_load_toc)) + } + },error = { + ReadBook.upMsg(context.getString(R.string.error_load_toc)) + } + ) + } + } + + + fun openChapter(index: Int, pageIndex: Int = 0) { + ReadBook.prevTextChapter = null + ReadBook.curTextChapter = null + ReadBook.nextTextChapter = null + ReadBook.callBack?.upContent() + if (index != ReadBook.durChapterIndex) { + ReadBook.durChapterIndex = index + ReadBook.durPageIndex = pageIndex + } + ReadBook.saveRead() + ReadBook.loadContent(resetPageOffset = true) + } + + fun removeFromBookshelf(success: (() -> Unit)?) { + execute { + ReadBook.book?.delete() + }.onSuccess { + success?.invoke() + } + } + + + fun refreshContent(book: Book) { + execute { + App.db.getChapterDao().getChapter(book.bookId, ReadBook.durChapterIndex) + ?.let { chapter -> + BookHelp.delContent(book, chapter) + ReadBook.loadContent(ReadBook.durChapterIndex, resetPageOffset = false) + } + } + } + + override fun onCleared() { + super.onCleared() + if (BaseReadAloudService.pause) { + ReadAloud.stop(context) + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/ReadMenu.kt b/app/src/main/java/com/novel/read/ui/read/ReadMenu.kt new file mode 100644 index 0000000..b7ef875 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/ReadMenu.kt @@ -0,0 +1,243 @@ +package com.novel.read.ui.read + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.drawable.GradientDrawable +import android.util.AttributeSet +import android.view.WindowManager +import android.view.animation.Animation +import android.widget.FrameLayout +import android.widget.SeekBar +import androidx.core.view.isVisible +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.PreferKey +import com.novel.read.help.AppConfig +import com.novel.read.help.ReadBookConfig +import com.novel.read.lib.Selector +import com.novel.read.service.help.ReadBook +import com.novel.read.utils.AnimationUtilsSupport +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.SystemUtils +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.view_read_menu.view.* +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.sdk27.listeners.onLongClick + +/** + * 阅读界面菜单 + */ +class ReadMenu @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : FrameLayout(context, attrs) { + var cnaShowMenu: Boolean = false + private val callBack: CallBack? get() = activity as? CallBack + private lateinit var menuTopIn: Animation + private lateinit var menuTopOut: Animation + private lateinit var menuBottomIn: Animation + private lateinit var menuBottomOut: Animation + private val bgColor: Int = context.bottomBackground + private val textColor: Int = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor)) + private val bottomBackgroundList: ColorStateList = Selector.colorBuild() + .setDefaultColor(bgColor) + .setPressedColor(ColorUtils.darkenColor(bgColor)) + .create() + private var onMenuOutEnd: (() -> Unit)? = null + val showBrightnessView get() = context.getPrefBoolean(PreferKey.showBrightnessView, true) + + init { + inflate(context, R.layout.view_read_menu, this) + if (AppConfig.isNightTheme) { + fabNightTheme.setImageResource(R.drawable.ic_daytime) + } else { + fabNightTheme.setImageResource(R.drawable.ic_brightness) + } + initAnimation() + val brightnessBackground = GradientDrawable() + brightnessBackground.cornerRadius = 5F.dp + brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f)) + ll_bottom_bg.setBackgroundColor(bgColor) + fabSearch.backgroundTintList = bottomBackgroundList + fabSearch.setColorFilter(textColor) + fabNightTheme.backgroundTintList = bottomBackgroundList + fabNightTheme.setColorFilter(textColor) + tv_pre.setTextColor(textColor) + tv_next.setTextColor(textColor) + iv_catalog.setColorFilter(textColor) + tv_catalog.setTextColor(textColor) + iv_read_aloud.setColorFilter(textColor) + tv_read_aloud.setTextColor(textColor) + iv_font.setColorFilter(textColor) + tv_font.setTextColor(textColor) + iv_setting.setColorFilter(textColor) + tv_setting.setTextColor(textColor) + vw_bg.onClick { } + vwNavigationBar.onClick { } + bindEvent() + } + + /** + * 设置屏幕亮度 + */ + private fun setScreenBrightness(value: Int) { + var brightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE + if (!brightnessAuto()) { + brightness = value.toFloat() + if (brightness < 1f) brightness = 1f + brightness /= 255f + } + val params = activity?.window?.attributes + params?.screenBrightness = brightness + activity?.window?.attributes = params + } + + fun runMenuIn() { + this.visible() + title_bar.visible() + bottom_menu.visible() + title_bar.startAnimation(menuTopIn) + bottom_menu.startAnimation(menuBottomIn) + } + + fun runMenuOut(onMenuOutEnd: (() -> Unit)? = null) { + this.onMenuOutEnd = onMenuOutEnd + if (this.isVisible) { + title_bar.startAnimation(menuTopOut) + bottom_menu.startAnimation(menuBottomOut) + } + } + + private fun brightnessAuto(): Boolean { + return context.getPrefBoolean("brightnessAuto", true) || !showBrightnessView + } + + private fun bindEvent() { + + //阅读进度 + seek_read_page.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) { + + } + + override fun onStartTrackingTouch(seekBar: SeekBar) { + + } + + override fun onStopTrackingTouch(seekBar: SeekBar) { + ReadBook.skipToPage(seekBar.progress) + } + }) + + //搜索 + fabSearch.onClick { + runMenuOut { + callBack?.openSearchActivity(null) + } + } + + //夜间模式 + fabNightTheme.onClick { + AppConfig.isNightTheme = !AppConfig.isNightTheme + App.INSTANCE.applyDayNight() + } + + //上一章 + tv_pre.onClick { ReadBook.moveToPrevChapter(upContent = true, toLast = false) } + + //下一章 + tv_next.onClick { ReadBook.moveToNextChapter(true) } + + //目录 + ll_catalog.onClick { + runMenuOut { + callBack?.openChapterList() + } + } + + //朗读 + ll_read_aloud.onClick { + runMenuOut { + callBack?.onClickReadAloud() + } + } + ll_read_aloud.onLongClick { + runMenuOut { callBack?.showReadAloudDialog() } + true + } + //界面 + ll_font.onClick { + runMenuOut { + callBack?.showAdjust() + } + } + + //设置 + ll_setting.onClick { + runMenuOut { + callBack?.showReadStyle() + } + } + } + + private fun initAnimation() { + //显示菜单 + menuTopIn = AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_top_in) + menuBottomIn = AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_bottom_in) + menuTopIn.setAnimationListener(object : Animation.AnimationListener { + override fun onAnimationStart(animation: Animation) { + callBack?.upSystemUiVisibility() + } + + override fun onAnimationEnd(animation: Animation) { + vw_menu_bg.onClick { runMenuOut() } + vwNavigationBar.layoutParams = vwNavigationBar.layoutParams.apply { + height = + if (ReadBookConfig.hideNavigationBar + && SystemUtils.isNavigationBarExist(activity) + ) + context.navigationBarHeight + else 0 + } + } + + override fun onAnimationRepeat(animation: Animation) = Unit + }) + + //隐藏菜单 + menuTopOut = AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_top_out) + menuBottomOut = + AnimationUtilsSupport.loadAnimation(context, R.anim.anim_readbook_bottom_out) + menuTopOut.setAnimationListener(object : Animation.AnimationListener { + override fun onAnimationStart(animation: Animation) { + vw_menu_bg.setOnClickListener(null) + } + + override fun onAnimationEnd(animation: Animation) { + this@ReadMenu.invisible() + title_bar.invisible() + bottom_menu.invisible() + cnaShowMenu = false + onMenuOutEnd?.invoke() + callBack?.upSystemUiVisibility() + } + + override fun onAnimationRepeat(animation: Animation) = Unit + }) + } + + + + interface CallBack { + fun autoPage() + fun openReplaceRule() + fun openChapterList() + fun openSearchActivity(searchWord: String?) + fun showAdjust() + fun showReadStyle() + fun showReadAloudDialog() + fun upSystemUiVisibility() + fun onClickReadAloud() + } + +} diff --git a/app/src/main/java/com/novel/read/ui/read/TextActionMenu.kt b/app/src/main/java/com/novel/read/ui/read/TextActionMenu.kt new file mode 100644 index 0000000..c8c63cf --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/TextActionMenu.kt @@ -0,0 +1,194 @@ +package com.novel.read.ui.read + +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.content.pm.ResolveInfo +import android.os.Build +import android.speech.tts.TextToSpeech +import android.view.LayoutInflater +import android.view.Menu +import android.view.ViewGroup +import android.widget.PopupWindow +import androidx.annotation.RequiresApi +import androidx.appcompat.view.SupportMenuInflater +import androidx.appcompat.view.menu.MenuBuilder +import androidx.appcompat.view.menu.MenuItemImpl +import androidx.core.view.isVisible +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.service.BaseReadAloudService +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.item_text.view.* +import kotlinx.android.synthetic.main.popup_action_menu.view.* +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.toast +import java.util.* + +@SuppressLint("RestrictedApi") +class TextActionMenu(private val context: Context, private val callBack: CallBack) : + PopupWindow(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT), + TextToSpeech.OnInitListener { + + private val adapter = Adapter() + private val menu = MenuBuilder(context) + private val moreMenu = MenuBuilder(context) + + init { + @SuppressLint("InflateParams") + contentView = LayoutInflater.from(context).inflate(R.layout.popup_action_menu, null) + + isTouchable = true + isOutsideTouchable = false + isFocusable = false + + initRecyclerView() + setOnDismissListener { + contentView.apply { + iv_menu_more.setImageResource(R.drawable.ic_more_vert) + recycler_view_more.gone() + adapter.setList(menu.visibleItems) + recycler_view.visible() + } + } + } + + private fun initRecyclerView() = with(contentView) { + recycler_view.adapter = adapter + recycler_view_more.adapter = adapter + SupportMenuInflater(context).inflate(R.menu.content_select_action, menu) + adapter.setList(menu.visibleItems) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + onInitializeMenu(moreMenu) + } + if (moreMenu.size() > 0) { + iv_menu_more.visible() + } + iv_menu_more.onClick { + if (recycler_view.isVisible) { + iv_menu_more.setImageResource(R.drawable.ic_arrow_back) + adapter.setList(menu.visibleItems) + recycler_view.gone() + recycler_view_more.visible() + } else { + iv_menu_more.setImageResource(R.drawable.ic_more_vert) + recycler_view_more.gone() + adapter.setList(menu.visibleItems) + recycler_view.visible() + } + } + } + + inner class Adapter : + BaseQuickAdapter(R.layout.item_text){ + + override fun convert(holder: BaseViewHolder, item: MenuItemImpl) { + holder.itemView.run { + text_view.text = item.title + } + holder.itemView.onClick { + getItem(holder.layoutPosition)?.let { + if (!callBack.onMenuItemSelected(it.itemId)) { + onMenuItemSelected(it) + } + } + callBack.onMenuActionFinally() + } + } + + } + + private fun onMenuItemSelected(item: MenuItemImpl) { + when (item.itemId) { + R.id.menu_copy -> context.sendToClip(callBack.selectedText) + R.id.menu_aloud -> { + if (BaseReadAloudService.isRun) { + context.toast(R.string.alouding_disable) + return + } + readAloud(callBack.selectedText) + } + else -> item.intent?.let { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + it.putExtra(Intent.EXTRA_PROCESS_TEXT, callBack.selectedText) + context.startActivity(it) + } + } + } + } + + private var textToSpeech: TextToSpeech? = null + private var ttsInitFinish = false + private var lastText: String = "" + + @SuppressLint("SetJavaScriptEnabled") + private fun readAloud(text: String) { + lastText = text + if (textToSpeech == null) { + textToSpeech = TextToSpeech(context, this) + return + } + if (!ttsInitFinish) return + if (text == "") return + if (textToSpeech?.isSpeaking == true) + textToSpeech?.stop() + textToSpeech?.speak(text, TextToSpeech.QUEUE_ADD, null, "select_text") + lastText = "" + } + + @Synchronized + override fun onInit(status: Int) { + textToSpeech?.language = Locale.CHINA + ttsInitFinish = true + readAloud(lastText) + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun createProcessTextIntent(): Intent { + return Intent() + .setAction(Intent.ACTION_PROCESS_TEXT) + .setType("text/plain") + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun getSupportedActivities(): List { + return context.packageManager + .queryIntentActivities(createProcessTextIntent(), 0) + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun createProcessTextIntentForResolveInfo(info: ResolveInfo): Intent { + return createProcessTextIntent() + .putExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, false) + .setClassName(info.activityInfo.packageName, info.activityInfo.name) + } + + /** + * Start with a menu Item order value that is high enough + * so that your "PROCESS_TEXT" menu items appear after the + * standard selection menu items like Cut, Copy, Paste. + */ + @RequiresApi(Build.VERSION_CODES.M) + private fun onInitializeMenu(menu: Menu) { + try { + var menuItemOrder = 100 + for (resolveInfo in getSupportedActivities()) { + menu.add( + Menu.NONE, Menu.NONE, + menuItemOrder++, resolveInfo.loadLabel(context.packageManager) + ).intent = createProcessTextIntentForResolveInfo(resolveInfo) + } + } catch (e: Exception) { + context.toast("获取文字操作菜单出错:${e.localizedMessage}") + } + } + + interface CallBack { + val selectedText: String + + fun onMenuItemSelected(itemId: Int): Boolean + + fun onMenuActionFinally() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/config/ChineseConverter.kt b/app/src/main/java/com/novel/read/ui/read/config/ChineseConverter.kt new file mode 100644 index 0000000..574b929 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/config/ChineseConverter.kt @@ -0,0 +1,54 @@ +package com.novel.read.ui.read.config + +import android.content.Context +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import android.util.AttributeSet +import com.novel.read.R +import com.novel.read.help.AppConfig +import com.novel.read.lib.dialogs.alert +import com.novel.read.ui.widget.StrokeTextView +import com.novel.read.utils.ext.accentColor +import com.novel.read.utils.ext.applyTint +import org.jetbrains.anko.sdk27.listeners.onClick + +class ChineseConverter(context: Context, attrs: AttributeSet?) : StrokeTextView(context, attrs) { + + private val spannableString = SpannableString("简/繁") + private var enabledSpan: ForegroundColorSpan = ForegroundColorSpan(context.accentColor) + private var onChanged: (() -> Unit)? = null + + init { + text = spannableString + if (!isInEditMode) { + upUi(AppConfig.chineseConverterType) + } + onClick { + selectType() + } + } + + private fun upUi(type: Int) { + spannableString.removeSpan(enabledSpan) + when (type) { + 1 -> spannableString.setSpan(enabledSpan, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + 2 -> spannableString.setSpan(enabledSpan, 2, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + } + text = spannableString + } + + private fun selectType() { + context.alert(titleResource = R.string.chinese_converter) { + items(context.resources.getStringArray(R.array.chinese_mode).toList()) { _, i -> + AppConfig.chineseConverterType = i + upUi(i) + onChanged?.invoke() + } + }.show().applyTint() + } + + fun onChanged(unit: () -> Unit) { + onChanged = unit + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/config/ReadAdjustDialog.kt b/app/src/main/java/com/novel/read/ui/read/config/ReadAdjustDialog.kt new file mode 100644 index 0000000..db76f42 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/config/ReadAdjustDialog.kt @@ -0,0 +1,118 @@ +package com.novel.read.ui.read.config + +import android.os.Bundle +import android.view.* +import android.widget.SeekBar +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BaseDialogFragment +import com.novel.read.constant.PreferKey +import com.novel.read.help.AppConfig +import com.novel.read.ui.read.ReadBookActivity +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.dialog_read_adjust.* + +class ReadAdjustDialog :BaseDialogFragment() { + + val callBack get() = activity as? ReadBookActivity + val showBrightnessView get() = context?.getPrefBoolean(PreferKey.showBrightnessView, true) + + override fun onStart() { + super.onStart() + dialog?.window?.let { + it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + it.setBackgroundDrawableResource(R.color.background) + it.decorView.setPadding(0, 0, 0, 0) + val attr = it.attributes + attr.dimAmount = 0.0f + attr.gravity = Gravity.BOTTOM + it.attributes = attr + it.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.dialog_read_adjust, container) + } + + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + initView() + initData() + initViewEvent() + } + + private fun initView() { + } + + private fun initData() { + scb_follow_sys.isChecked = brightnessAuto() + hpb_light.progress = requireContext().getPrefInt("brightness", 100) + upBrightnessState() + + swt_dark.isChecked=AppConfig.isNightTheme + + swt_dark.setOnCheckedChangeListener { compoundButton, b -> + AppConfig.isNightTheme = b + App.INSTANCE.applyDayNight() + } + } + + private fun initViewEvent() { + //亮度调节 + scb_follow_sys.setOnClickListener { + if (scb_follow_sys.isChecked) { + scb_follow_sys.setChecked(checked = false, animate = true) + } else { + scb_follow_sys.setChecked(checked = true, animate = true) + } + context?.putPrefBoolean("brightnessAuto", !brightnessAuto()) + upBrightnessState() + } + + //亮度调节 + hpb_light.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + setScreenBrightness(progress) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + context?.putPrefInt("brightness", hpb_light.progress) + } + + }) + } + + private fun upBrightnessState() { + hpb_light.isEnabled = !brightnessAuto() + context?.getPrefInt("brightness", 100)?.let { setScreenBrightness(it) } + } + + + /** + * 设置屏幕亮度 + */ + private fun setScreenBrightness(value: Int) { + var brightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE + if (!brightnessAuto()) { + brightness = value.toFloat() + if (brightness < 1f) brightness = 1f + brightness /= 255f + } + val params = activity?.window?.attributes + params?.screenBrightness = brightness + activity?.window?.attributes = params + } + + private fun brightnessAuto(): Boolean { + return context?.getPrefBoolean("brightnessAuto", true)!! || !showBrightnessView!! + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/config/ReadAloudDialog.kt b/app/src/main/java/com/novel/read/ui/read/config/ReadAloudDialog.kt new file mode 100644 index 0000000..b87ce89 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/config/ReadAloudDialog.kt @@ -0,0 +1,164 @@ +package com.novel.read.ui.read.config + +import android.os.Bundle +import android.view.* +import android.widget.SeekBar +import com.novel.read.R +import com.novel.read.base.BaseDialogFragment +import com.novel.read.constant.EventBus +import com.novel.read.help.AppConfig +import com.novel.read.service.BaseReadAloudService +import com.novel.read.service.help.ReadAloud +import com.novel.read.service.help.ReadBook +import com.novel.read.ui.widget.dialog.ReadAloudConfigDialog +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.dialog_read_aloud.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class ReadAloudDialog : BaseDialogFragment() { + var callBack: CallBack? = null + + override fun onStart() { + super.onStart() + dialog?.window?.let { + it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + it.setBackgroundDrawableResource(R.color.background) + it.decorView.setPadding(0, 0, 0, 0) + val attr = it.attributes + attr.dimAmount = 0.0f + attr.gravity = Gravity.BOTTOM + it.attributes = attr + it.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + callBack = activity as? CallBack + return inflater.inflate(R.layout.dialog_read_aloud, container) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + val bg = requireContext().bottomBackground + val isLight = ColorUtils.isColorLight(bg) + val textColor = requireContext().getPrimaryTextColor(isLight) + root_view.setBackgroundColor(bg) + tv_pre.setTextColor(textColor) + tv_next.setTextColor(textColor) + iv_play_prev.setColorFilter(textColor) + iv_play_pause.setColorFilter(textColor) + iv_play_next.setColorFilter(textColor) + iv_stop.setColorFilter(textColor) + iv_timer.setColorFilter(textColor) + tv_timer.setTextColor(textColor) + tv_tts_speed.setTextColor(textColor) + iv_catalog.setColorFilter(textColor) + tv_catalog.setTextColor(textColor) + iv_main_menu.setColorFilter(textColor) + tv_main_menu.setTextColor(textColor) + iv_to_backstage.setColorFilter(textColor) + tv_to_backstage.setTextColor(textColor) + iv_setting.setColorFilter(textColor) + tv_setting.setTextColor(textColor) + cb_tts_follow_sys.setTextColor(textColor) + initOnChange() + initData() + initEvent() + } + + private fun initData() { + upPlayState() + upTimerText(BaseReadAloudService.timeMinute) + seek_timer.progress = BaseReadAloudService.timeMinute + cb_tts_follow_sys.isChecked = requireContext().getPrefBoolean("ttsFollowSys", true) + seek_tts_SpeechRate.isEnabled = !cb_tts_follow_sys.isChecked + seek_tts_SpeechRate.progress = AppConfig.ttsSpeechRate + } + + private fun initOnChange() { + cb_tts_follow_sys.setOnCheckedChangeListener { buttonView, isChecked -> + if (buttonView.isPressed) { + requireContext().putPrefBoolean("ttsFollowSys", isChecked) + seek_tts_SpeechRate.isEnabled = !isChecked + upTtsSpeechRate() + } + } + seek_tts_SpeechRate.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + AppConfig.ttsSpeechRate = seek_tts_SpeechRate.progress + upTtsSpeechRate() + } + }) + seek_timer.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + upTimerText(progress) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + ReadAloud.setTimer(requireContext(), seek_timer.progress) + } + }) + } + + private fun initEvent() { + ll_main_menu.onClick { callBack?.showMenuBar(); dismiss() } + ll_setting.onClick { + ReadAloudConfigDialog().show(childFragmentManager, "readAloudConfigDialog") + } + tv_pre.onClick { ReadBook.moveToPrevChapter(upContent = true, toLast = false) } + tv_next.onClick { ReadBook.moveToNextChapter(true) } + iv_stop.onClick { ReadAloud.stop(requireContext()); dismiss() } + iv_play_pause.onClick { callBack?.onClickReadAloud() } + iv_play_prev.onClick { ReadAloud.prevParagraph(requireContext()) } + iv_play_next.onClick { ReadAloud.nextParagraph(requireContext()) } + ll_catalog.onClick { callBack?.openChapterList() } + ll_to_backstage.onClick { callBack?.finish() } + } + + private fun upPlayState() { + if (!BaseReadAloudService.pause) { + iv_play_pause.setImageResource(R.drawable.ic_pause_24dp) + } else { + iv_play_pause.setImageResource(R.drawable.ic_play_24dp) + } + val bg = requireContext().bottomBackground + val isLight = ColorUtils.isColorLight(bg) + val textColor = requireContext().getPrimaryTextColor(isLight) + iv_play_pause.setColorFilter(textColor) + } + + private fun upTimerText(timeMinute: Int) { + tv_timer.text = requireContext().getString(R.string.timer_m, timeMinute) + } + + private fun upTtsSpeechRate() { + ReadAloud.upTtsSpeechRate(requireContext()) + if (!BaseReadAloudService.pause) { + ReadAloud.pause(requireContext()) + ReadAloud.resume(requireContext()) + } + } + + override fun observeLiveBus() { + observeEvent(EventBus.ALOUD_STATE) { upPlayState() } + observeEvent(EventBus.TTS_DS) { seek_timer.progress = it } + } + + interface CallBack { + fun showMenuBar() + fun openChapterList() + fun onClickReadAloud() + fun finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/config/ReadStyleDialog.kt b/app/src/main/java/com/novel/read/ui/read/config/ReadStyleDialog.kt new file mode 100644 index 0000000..9caef1d --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/config/ReadStyleDialog.kt @@ -0,0 +1,170 @@ +package com.novel.read.ui.read.config + +import android.content.DialogInterface +import android.os.Bundle +import android.view.* +import androidx.core.view.get +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.base.BaseDialogFragment +import com.novel.read.constant.EventBus +import com.novel.read.help.ReadBookConfig +import com.novel.read.service.help.ReadBook +import com.novel.read.ui.read.ReadBookActivity +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.dialog_read_book_style.* +import kotlinx.android.synthetic.main.activity_read_book.* +import kotlinx.android.synthetic.main.item_read_style.view.* +import org.jetbrains.anko.sdk27.listeners.onCheckedChange +import org.jetbrains.anko.sdk27.listeners.onClick +import org.jetbrains.anko.sdk27.listeners.onLongClick + +class ReadStyleDialog : BaseDialogFragment() { + + val callBack get() = activity as? ReadBookActivity + private lateinit var styleAdapter: StyleAdapter + + + override fun onStart() { + super.onStart() + dialog?.window?.let { + it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + it.setBackgroundDrawableResource(R.color.background) + it.decorView.setPadding(0, 0, 0, 0) + val attr = it.attributes + attr.dimAmount = 0.0f + attr.gravity = Gravity.BOTTOM + it.attributes = attr + it.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.dialog_read_book_style, container) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + initView() + initData() + initViewEvent() + } + + private fun initView() { + val bg = requireContext().bottomBackground + root_view.setBackgroundColor(bg) + styleAdapter = StyleAdapter() + rv_style.adapter = styleAdapter + + } + + private fun initData() { + upView() + styleAdapter.setList(ReadBookConfig.configList) + } + + private fun initViewEvent() { + tv_font_type.onChanged { + postEvent(EventBus.UP_CONFIG, true) + } + + fl_text_Bold.onChanged { + postEvent(EventBus.UP_CONFIG, true) + } + + fl_text_font.onClick { +// FontSelectDialog().show(childFragmentManager, "fontSelectDialog") + } + + rg_page_anim.onCheckedChange { _, checkedId -> + ReadBookConfig.pageAnim = -1 + ReadBookConfig.pageAnim = rg_page_anim.getIndexById(checkedId) + callBack?.page_view?.upPageAnim() + } + + nbTextSizeAdd.setOnClickListener { + ReadBookConfig.textSize = ReadBookConfig.textSize + 2 + postEvent(EventBus.UP_CONFIG, true) + nbTextSize.text = ReadBookConfig.textSize.toString() + } + nbTextSizeDec.setOnClickListener { + ReadBookConfig.textSize = ReadBookConfig.textSize - 2 + postEvent(EventBus.UP_CONFIG, true) + nbTextSize.text = ReadBookConfig.textSize.toString() + } + } + + + inner class StyleAdapter : + BaseQuickAdapter(R.layout.item_read_style) { + + override fun convert(holder: BaseViewHolder, item: ReadBookConfig.Config) { + holder.itemView.run { + iv_style.setText(item.name.ifBlank { "文字" }) + iv_style.setTextColor(item.curTextColor()) + iv_style.setImageDrawable(item.curBgDrawable(100, 150)) + if (ReadBookConfig.styleSelect == holder.layoutPosition) { + iv_style.borderColor = accentColor + iv_style.setTextBold(true) + } else { + iv_style.borderColor = item.curTextColor() + iv_style.setTextBold(false) + } + iv_style.onClick { + if (iv_style.isInView) { + changeBg(holder.layoutPosition) + } + } + iv_style.onLongClick { + if (iv_style.isInView) { + showBgTextConfig(holder.layoutPosition) + } else { + false + } + } + } + } + } + + + private fun changeBg(index: Int) { + val oldIndex = ReadBookConfig.styleSelect + if (index != oldIndex) { + ReadBookConfig.styleSelect = index + ReadBookConfig.upBg() + upView() + styleAdapter.notifyItemChanged(oldIndex) + styleAdapter.notifyItemChanged(index) + postEvent(EventBus.UP_CONFIG, true) + } + } + + private fun showBgTextConfig(index: Int): Boolean { + dismiss() + changeBg(index) + callBack?.showBgTextConfig() + return true + } + + private fun upView() { + + ReadBook.pageAnim().let { + if (it >= 0 && it < rg_page_anim.childCount) { + rg_page_anim.check(rg_page_anim[it].id) + } + } + ReadBookConfig.let { + + } + } + + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + ReadBookConfig.save() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/config/TextFontWeightConverter.kt b/app/src/main/java/com/novel/read/ui/read/config/TextFontWeightConverter.kt new file mode 100644 index 0000000..9bc99c4 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/config/TextFontWeightConverter.kt @@ -0,0 +1,55 @@ +package com.novel.read.ui.read.config + +import android.content.Context +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import android.util.AttributeSet +import com.novel.read.R +import com.novel.read.help.ReadBookConfig +import com.novel.read.lib.dialogs.alert +import com.novel.read.ui.widget.StrokeTextView +import com.novel.read.utils.ext.accentColor +import com.novel.read.utils.ext.applyTint +import org.jetbrains.anko.sdk27.listeners.onClick + +class TextFontWeightConverter(context: Context, attrs: AttributeSet?) : StrokeTextView(context, attrs) { + + private val spannableString = SpannableString("中/粗/细") + private var enabledSpan: ForegroundColorSpan = ForegroundColorSpan(context.accentColor) + private var onChanged: (() -> Unit)? = null + + init { + text = spannableString + if (!isInEditMode) { + upUi(ReadBookConfig.textBold) + } + onClick { + selectType() + } + } + + private fun upUi(type: Int) { + spannableString.removeSpan(enabledSpan) + when (type) { + 0 -> spannableString.setSpan(enabledSpan, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + 1 -> spannableString.setSpan(enabledSpan, 2, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + 2 -> spannableString.setSpan(enabledSpan, 4, 5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + } + text = spannableString + } + + private fun selectType() { + context.alert(titleResource = R.string.text_font_weight_converter) { + items(context.resources.getStringArray(R.array.text_font_weight).toList()) { _, i -> + ReadBookConfig.textBold = i + upUi(i) + onChanged?.invoke() + } + }.show().applyTint() + } + + fun onChanged(unit: () -> Unit) { + onChanged = unit + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/ContentTextView.kt b/app/src/main/java/com/novel/read/ui/read/page/ContentTextView.kt new file mode 100644 index 0000000..fe8c13d --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/ContentTextView.kt @@ -0,0 +1,504 @@ +package com.novel.read.ui.read.page + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.RectF +import android.util.AttributeSet +import android.util.Log +import android.view.View +import com.novel.read.R +import com.novel.read.constant.PreferKey +import com.novel.read.data.read.TextChar +import com.novel.read.data.read.TextLine +import com.novel.read.data.read.TextPage +import com.novel.read.help.ReadBookConfig +import com.novel.read.service.help.ReadBook +import com.novel.read.ui.widget.dialog.PhotoDialog +import com.novel.read.utils.ext.* +import io.legado.app.ui.book.read.page.provider.ChapterProvider +import io.legado.app.ui.book.read.page.provider.ImageProvider + +import kotlinx.coroutines.CoroutineScope +import kotlin.math.min + +/** + * 阅读内容界面 + */ +class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, attrs) { + var selectAble = context.getPrefBoolean(PreferKey.textSelectAble,true) + var upView: ((TextPage) -> Unit)? = null + private val selectedPaint by lazy { + Paint().apply { + color = context.getCompatColor(R.color.btn_bg_press_2) + style = Paint.Style.FILL + } + } + private var callBack: CallBack + private val visibleRect = RectF() + private val selectStart = arrayOf(0, 0, 0) + private val selectEnd = arrayOf(0, 0, 0) + private var textPage: TextPage = TextPage() + + //滚动参数 + private val pageFactory: TextPageFactory get() = callBack.pageFactory + private var pageOffset = 0f + + init { + callBack = activity as CallBack + contentDescription = textPage.text + } + + fun setContent(textPage: TextPage) { + this.textPage = textPage + contentDescription = textPage.text + invalidate() + } + + fun upVisibleRect() { + visibleRect.set( + ChapterProvider.paddingLeft.toFloat(), + ChapterProvider.paddingTop.toFloat(), + ChapterProvider.visibleRight.toFloat(), + ChapterProvider.visibleBottom.toFloat() + ) + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + ChapterProvider.upViewSize(w, h) + upVisibleRect() + textPage.format() + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + canvas.clipRect(visibleRect) + drawPage(canvas) + } + + /** + * 绘制页面 + */ + private fun drawPage(canvas: Canvas) { + var relativeOffset = relativeOffset(0) + textPage.textLines.forEach { textLine -> + draw(canvas, textLine, relativeOffset) + } + if (!callBack.isScroll) return + //滚动翻页 + if (!pageFactory.hasNext()) return + val nextPage = relativePage(1) + relativeOffset = relativeOffset(1) + nextPage.textLines.forEach { textLine -> + draw(canvas, textLine, relativeOffset) + } + if (!pageFactory.hasNextPlus()) return + relativeOffset = relativeOffset(2) + if (relativeOffset < ChapterProvider.visibleHeight) { + relativePage(2).textLines.forEach { textLine -> + draw(canvas, textLine, relativeOffset) + } + } + } + + private fun draw( + canvas: Canvas, + textLine: TextLine, + relativeOffset: Float + ) { + val lineTop = textLine.lineTop + relativeOffset + val lineBase = textLine.lineBase + relativeOffset + val lineBottom = textLine.lineBottom + relativeOffset + if (textLine.isImage) { + drawImage(canvas, textLine, lineTop, lineBottom) + } else { + drawChars( + canvas, + textLine.textChars, + lineTop, + lineBase, + lineBottom, + isTitle = textLine.isTitle, + isReadAloud = textLine.isReadAloud + ) + } + } + + /** + * 绘制文字 + */ + private fun drawChars( + canvas: Canvas, + textChars: List, + lineTop: Float, + lineBase: Float, + lineBottom: Float, + isTitle: Boolean, + isReadAloud: Boolean + ) { + val textPaint = if (isTitle) ChapterProvider.titlePaint else ChapterProvider.contentPaint + textPaint.color = + if (isReadAloud) context.accentColor else ReadBookConfig.textColor + textChars.forEach { + canvas.drawText(it.charData, it.start, lineBase, textPaint) + if (it.selected) { + canvas.drawRect(it.start, lineTop, it.end, lineBottom, selectedPaint) + } + } + } + + /** + * 绘制图片 + */ + private fun drawImage( + canvas: Canvas, + textLine: TextLine, + lineTop: Float, + lineBottom: Float + ) { + textLine.textChars.forEach { textChar -> + ReadBook.book?.let { book -> + val rectF = RectF(textChar.start, lineTop, textChar.end, lineBottom) + ImageProvider.getImage(book, textPage.chapterIndex, textChar.charData, true) + ?.let { + canvas.drawBitmap(it, null, rectF, null) + } + } + } + } + + /** + * 滚动事件 + */ + fun onScroll(mOffset: Float) { + if (mOffset == 0f) return + pageOffset += mOffset + if (!pageFactory.hasPrev() && pageOffset > 0) { + pageOffset = 0f + } else if (!pageFactory.hasNext() + && pageOffset < 0 + && pageOffset + textPage.height < ChapterProvider.visibleHeight + ) { + val offset = ChapterProvider.visibleHeight - textPage.height + pageOffset = min(0f, offset) + } else if (pageOffset > 0) { + pageFactory.moveToPrev(false) + textPage = pageFactory.currentPage + pageOffset -= textPage.height + upView?.invoke(textPage) + } else if (pageOffset < -textPage.height) { + pageOffset += textPage.height + pageFactory.moveToNext(false) + textPage = pageFactory.currentPage + upView?.invoke(textPage) + } + invalidate() + } + + fun resetPageOffset() { + pageOffset = 0f + } + + /** + * 选择文字 + */ + fun selectText( + x: Float, + y: Float, + select: (relativePage: Int, lineIndex: Int, charIndex: Int) -> Unit + ) { + if (!selectAble) return + if (!visibleRect.contains(x, y)) return + var relativeOffset: Float + for (relativePos in 0..2) { + relativeOffset = relativeOffset(relativePos) + if (relativePos > 0) { + //滚动翻页 + if (!callBack.isScroll) return + if (relativeOffset >= ChapterProvider.visibleHeight) return + } + val page = relativePage(relativePos) + for ((lineIndex, textLine) in page.textLines.withIndex()) { + if (y > textLine.lineTop + relativeOffset && y < textLine.lineBottom + relativeOffset) { + for ((charIndex, textChar) in textLine.textChars.withIndex()) { + if (x > textChar.start && x < textChar.end) { + if (textChar.isImage) { + activity?.supportFragmentManager?.let { + PhotoDialog.show(it, page.chapterIndex, textChar.charData) + } + } else { + textChar.selected = true + invalidate() + select(relativePos, lineIndex, charIndex) + } + return + } + } + return + } + } + + } + } + + /** + * 开始选择符移动 + */ + fun selectStartMove(x: Float, y: Float) { + if (!visibleRect.contains(x, y)) return + var relativeOffset: Float + for (relativePos in 0..2) { + relativeOffset = relativeOffset(relativePos) + if (relativePos > 0) { + //滚动翻页 + if (!callBack.isScroll) return + if (relativeOffset >= ChapterProvider.visibleHeight) return + } + for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) { + if (y > textLine.lineTop + relativeOffset && y < textLine.lineBottom + relativeOffset) { + for ((charIndex, textChar) in textLine.textChars.withIndex()) { + if (x > textChar.start && x < textChar.end) { + if (selectStart[0] != relativePos || selectStart[1] != lineIndex || selectStart[2] != charIndex) { + if (selectToInt(relativePos, lineIndex, charIndex) > selectToInt( + selectEnd + ) + ) { + return + } + selectStart[0] = relativePos + selectStart[1] = lineIndex + selectStart[2] = charIndex + upSelectedStart( + textChar.start, + textLine.lineBottom + relativeOffset, + textLine.lineTop + relativeOffset + ) + upSelectChars() + } + return + } + } + return + } + } + } + } + + /** + * 结束选择符移动 + */ + fun selectEndMove(x: Float, y: Float) { + if (!visibleRect.contains(x, y)) return + var relativeOffset: Float + for (relativePos in 0..2) { + relativeOffset = relativeOffset(relativePos) + if (relativePos > 0) { + //滚动翻页 + if (!callBack.isScroll) return + if (relativeOffset >= ChapterProvider.visibleHeight) return + } + Log.e("y", "$y") + for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) { + if (y > textLine.lineTop + relativeOffset && y < textLine.lineBottom + relativeOffset) { + Log.e("line", "$relativePos $lineIndex") + for ((charIndex, textChar) in textLine.textChars.withIndex()) { + if (x > textChar.start && x < textChar.end) { + Log.e("char", "$relativePos $lineIndex $charIndex") + if (selectEnd[0] != relativePos || selectEnd[1] != lineIndex || selectEnd[2] != charIndex) { + if (selectToInt(relativePos, lineIndex, charIndex) < selectToInt( + selectStart + ) + ) { + return + } + selectEnd[0] = relativePos + selectEnd[1] = lineIndex + selectEnd[2] = charIndex + upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset) + upSelectChars() + } + return + } + } + return + } + } + } + } + + /** + * 选择开始文字 + */ + fun selectStartMoveIndex(relativePage: Int, lineIndex: Int, charIndex: Int) { + selectStart[0] = relativePage + selectStart[1] = lineIndex + selectStart[2] = charIndex + val textLine = relativePage(relativePage).textLines[lineIndex] + val textChar = textLine.textChars[charIndex] + upSelectedStart( + textChar.start, + textLine.lineBottom + relativeOffset(relativePage), + textLine.lineTop + relativeOffset(relativePage) + ) + upSelectChars() + } + + /** + * 选择结束文字 + */ + fun selectEndMoveIndex(relativePage: Int, lineIndex: Int, charIndex: Int) { + selectEnd[0] = relativePage + selectEnd[1] = lineIndex + selectEnd[2] = charIndex + val textLine = relativePage(relativePage).textLines[lineIndex] + val textChar = textLine.textChars[charIndex] + upSelectedEnd(textChar.end, textLine.lineBottom + relativeOffset(relativePage)) + upSelectChars() + } + + private fun upSelectChars() { + val last = if (callBack.isScroll) 2 else 0 + for (relativePos in 0..last) { + for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) { + for ((charIndex, textChar) in textLine.textChars.withIndex()) { + textChar.selected = + if (relativePos == selectStart[0] + && relativePos == selectEnd[0] + && lineIndex == selectStart[1] + && lineIndex == selectEnd[1] + ) { + charIndex in selectStart[2]..selectEnd[2] + } else if (relativePos == selectStart[0] && lineIndex == selectStart[1]) { + charIndex >= selectStart[2] + } else if (relativePos == selectEnd[0] && lineIndex == selectEnd[1]) { + charIndex <= selectEnd[2] + } else if (relativePos == selectStart[0] && relativePos == selectEnd[0]) { + lineIndex in (selectStart[1] + 1) until selectEnd[1] + } else if (relativePos == selectStart[0]) { + lineIndex > selectStart[1] + } else if (relativePos == selectEnd[0]) { + lineIndex < selectEnd[1] + } else { + relativePos in selectStart[0] + 1 until selectEnd[0] + } + } + } + } + invalidate() + } + + private fun upSelectedStart(x: Float, y: Float, top: Float) = callBack.apply { + upSelectedStart(x, y + headerHeight, top + headerHeight) + } + + private fun upSelectedEnd(x: Float, y: Float) = callBack.apply { + upSelectedEnd(x, y + headerHeight) + } + + fun cancelSelect() { + val last = if (callBack.isScroll) 2 else 0 + for (relativePos in 0..last) { + relativePage(relativePos).textLines.forEach { textLine -> + textLine.textChars.forEach { + it.selected = false + } + } + } + invalidate() + callBack.onCancelSelect() + } + + val selectedText: String + get() { + val stringBuilder = StringBuilder() + for (relativePos in selectStart[0]..selectEnd[0]) { + val textPage = relativePage(relativePos) + if (relativePos == selectStart[0] && relativePos == selectEnd[0]) { + for (lineIndex in selectStart[1]..selectEnd[1]) { + if (lineIndex == selectStart[1] && lineIndex == selectEnd[1]) { + stringBuilder.append( + textPage.textLines[lineIndex].text.substring( + selectStart[2], + selectEnd[2] + 1 + ) + ) + } else if (lineIndex == selectStart[1]) { + stringBuilder.append( + textPage.textLines[lineIndex].text.substring( + selectStart[2] + ) + ) + } else if (lineIndex == selectEnd[1]) { + stringBuilder.append( + textPage.textLines[lineIndex].text.substring(0, selectEnd[2] + 1) + ) + } else { + stringBuilder.append(textPage.textLines[lineIndex].text) + } + } + } else if (relativePos == selectStart[0]) { + for (lineIndex in selectStart[1] until relativePage(relativePos).textLines.size) { + if (lineIndex == selectStart[1]) { + stringBuilder.append( + textPage.textLines[lineIndex].text.substring( + selectStart[2] + ) + ) + } else { + stringBuilder.append(textPage.textLines[lineIndex].text) + } + } + } else if (relativePos == selectEnd[0]) { + for (lineIndex in 0..selectEnd[1]) { + if (lineIndex == selectEnd[1]) { + stringBuilder.append( + textPage.textLines[lineIndex].text.substring(0, selectEnd[2] + 1) + ) + } else { + stringBuilder.append(textPage.textLines[lineIndex].text) + } + } + } else if (relativePos in selectStart[0] + 1 until selectEnd[0]) { + for (lineIndex in selectStart[1]..selectEnd[1]) { + stringBuilder.append(textPage.textLines[lineIndex].text) + } + } + } + return stringBuilder.toString() + } + + private fun selectToInt(page: Int, line: Int, char: Int): Int { + return page * 10000000 + line * 100000 + char + } + + private fun selectToInt(select: Array): Int { + return select[0] * 10000000 + select[1] * 100000 + select[2] + } + + private fun relativeOffset(relativePos: Int): Float { + return when (relativePos) { + 0 -> pageOffset + 1 -> pageOffset + textPage.height + else -> pageOffset + textPage.height + pageFactory.nextPage.height + } + } + + private fun relativePage(relativePos: Int): TextPage { + return when (relativePos) { + 0 -> textPage + 1 -> pageFactory.nextPage + else -> pageFactory.nextPagePlus + } + } + + interface CallBack { + fun upSelectedStart(x: Float, y: Float, top: Float) + fun upSelectedEnd(x: Float, y: Float) + fun onCancelSelect() + val headerHeight: Int + val pageFactory: TextPageFactory + val scope: CoroutineScope + val isScroll: Boolean + } +} diff --git a/app/src/main/java/com/novel/read/ui/read/page/ContentView.kt b/app/src/main/java/com/novel/read/ui/read/page/ContentView.kt new file mode 100644 index 0000000..c6bb156 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/ContentView.kt @@ -0,0 +1,277 @@ +package com.novel.read.ui.read.page + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.drawable.Drawable +import android.widget.FrameLayout +import androidx.core.view.isGone +import androidx.core.view.isInvisible +import com.novel.read.R +import com.novel.read.base.BaseActivity +import com.novel.read.constant.AppConst.timeFormat +import com.novel.read.data.read.TextPage +import com.novel.read.help.ReadBookConfig +import com.novel.read.help.ReadTipConfig +import com.novel.read.service.help.ReadBook +import com.novel.read.ui.widget.BatteryView +import com.novel.read.utils.ext.* +import io.legado.app.ui.book.read.page.provider.ChapterProvider +import kotlinx.android.synthetic.main.view_book_page.view.* +import org.jetbrains.anko.topPadding +import java.util.* + + +class ContentView(context: Context) : FrameLayout(context) { + + private var battery = 100 + private var tvTitle: BatteryView? = null + private var tvTime: BatteryView? = null + private var tvBattery: BatteryView? = null + private var tvPage: BatteryView? = null + private var tvTotalProgress: BatteryView? = null + private var tvPageAndTotal: BatteryView? = null + private var tvBookName: BatteryView? = null + + val headerHeight: Int + get() { + val h1 = if (ReadBookConfig.hideStatusBar) 0 else context.statusBarHeight + val h2 = if (ll_header.isGone) 0 else ll_header.height + return h1 + h2 + } + + init { + //设置背景防止切换背景时文字重叠 + setBackgroundColor(context.getCompatColor(R.color.background)) + inflate(context, R.layout.view_book_page, this) + upTipStyle() + upStyle() + content_text_view.upView = { + setProgress(it) + } + } + + fun upStyle() { + ReadBookConfig.apply { + bv_header_left.typeface = ChapterProvider.typeface + tv_header_left.typeface = ChapterProvider.typeface + tv_header_middle.typeface = ChapterProvider.typeface + tv_header_right.typeface = ChapterProvider.typeface + bv_footer_left.typeface = ChapterProvider.typeface + tv_footer_left.typeface = ChapterProvider.typeface + tv_footer_middle.typeface = ChapterProvider.typeface + tv_footer_right.typeface = ChapterProvider.typeface + bv_header_left.setColor(textColor) + tv_header_left.setColor(textColor) + tv_header_middle.setColor(textColor) + tv_header_right.setColor(textColor) + bv_footer_left.setColor(textColor) + tv_footer_left.setColor(textColor) + tv_footer_middle.setColor(textColor) + tv_footer_right.setColor(textColor) + upStatusBar() + ll_header.setPadding( + headerPaddingLeft.dp, + headerPaddingTop.dp, + headerPaddingRight.dp, + headerPaddingBottom.dp + ) + ll_footer.setPadding( + footerPaddingLeft.dp, + footerPaddingTop.dp, + footerPaddingRight.dp, + footerPaddingBottom.dp + ) + vw_top_divider.visible(showHeaderLine) + vw_bottom_divider.visible(showFooterLine) + content_text_view.upVisibleRect() + } + upTime() + upBattery(battery) + } + + /** + * 显示状态栏时隐藏header + */ + fun upStatusBar() { + vw_status_bar.topPadding = context.statusBarHeight + vw_status_bar.isGone = + ReadBookConfig.hideStatusBar || (activity as? BaseActivity)?.isInMultiWindow == true + } + + fun upTipStyle() { + ReadTipConfig.apply { + tv_header_left.isInvisible = tipHeaderLeft != chapterTitle + bv_header_left.isInvisible = tipHeaderLeft == none || !tv_header_left.isInvisible + tv_header_right.isGone = tipHeaderRight == none + tv_header_middle.isGone = tipHeaderMiddle == none + tv_footer_left.isInvisible = tipFooterLeft != chapterTitle + bv_footer_left.isInvisible = tipFooterLeft == none || !tv_footer_left.isInvisible + tv_footer_right.isGone = tipFooterRight == none + tv_footer_middle.isGone = tipFooterMiddle == none + ll_header.isGone = hideHeader + ll_footer.isGone = hideFooter + } + tvTitle = when (ReadTipConfig.chapterTitle) { + ReadTipConfig.tipHeaderLeft -> tv_header_left + ReadTipConfig.tipHeaderMiddle -> tv_header_middle + ReadTipConfig.tipHeaderRight -> tv_header_right + ReadTipConfig.tipFooterLeft -> tv_footer_left + ReadTipConfig.tipFooterMiddle -> tv_footer_middle + ReadTipConfig.tipFooterRight -> tv_footer_right + else -> null + } + tvTitle?.apply { + isBattery = false + textSize = 12f + } + tvTime = when (ReadTipConfig.time) { + ReadTipConfig.tipHeaderLeft -> bv_header_left + ReadTipConfig.tipHeaderMiddle -> tv_header_middle + ReadTipConfig.tipHeaderRight -> tv_header_right + ReadTipConfig.tipFooterLeft -> bv_footer_left + ReadTipConfig.tipFooterMiddle -> tv_footer_middle + ReadTipConfig.tipFooterRight -> tv_footer_right + else -> null + } + tvTime?.apply { + isBattery = false + textSize = 12f + } + tvBattery = when (ReadTipConfig.battery) { + ReadTipConfig.tipHeaderLeft -> bv_header_left + ReadTipConfig.tipHeaderMiddle -> tv_header_middle + ReadTipConfig.tipHeaderRight -> tv_header_right + ReadTipConfig.tipFooterLeft -> bv_footer_left + ReadTipConfig.tipFooterMiddle -> tv_footer_middle + ReadTipConfig.tipFooterRight -> tv_footer_right + else -> null + } + tvBattery?.apply { + isBattery = true + textSize = 10f + } + tvPage = when (ReadTipConfig.page) { + ReadTipConfig.tipHeaderLeft -> bv_header_left + ReadTipConfig.tipHeaderMiddle -> tv_header_middle + ReadTipConfig.tipHeaderRight -> tv_header_right + ReadTipConfig.tipFooterLeft -> bv_footer_left + ReadTipConfig.tipFooterMiddle -> tv_footer_middle + ReadTipConfig.tipFooterRight -> tv_footer_right + else -> null + } + tvPage?.apply { + isBattery = false + textSize = 12f + } + tvTotalProgress = when (ReadTipConfig.totalProgress) { + ReadTipConfig.tipHeaderLeft -> bv_header_left + ReadTipConfig.tipHeaderMiddle -> tv_header_middle + ReadTipConfig.tipHeaderRight -> tv_header_right + ReadTipConfig.tipFooterLeft -> bv_footer_left + ReadTipConfig.tipFooterMiddle -> tv_footer_middle + ReadTipConfig.tipFooterRight -> tv_footer_right + else -> null + } + tvTotalProgress?.apply { + isBattery = false + textSize = 12f + } + tvPageAndTotal = when (ReadTipConfig.pageAndTotal) { + ReadTipConfig.tipHeaderLeft -> bv_header_left + ReadTipConfig.tipHeaderMiddle -> tv_header_middle + ReadTipConfig.tipHeaderRight -> tv_header_right + ReadTipConfig.tipFooterLeft -> bv_footer_left + ReadTipConfig.tipFooterMiddle -> tv_footer_middle + ReadTipConfig.tipFooterRight -> tv_footer_right + else -> null + } + tvPageAndTotal?.apply { + isBattery = false + textSize = 12f + } + tvBookName = when (ReadTipConfig.bookName) { + ReadTipConfig.tipHeaderLeft -> bv_header_left + ReadTipConfig.tipHeaderMiddle -> tv_header_middle + ReadTipConfig.tipHeaderRight -> tv_header_right + ReadTipConfig.tipFooterLeft -> bv_footer_left + ReadTipConfig.tipFooterMiddle -> tv_footer_middle + ReadTipConfig.tipFooterRight -> tv_footer_right + else -> null + } + tvBookName?.apply { + isBattery = false + textSize = 12f + } + } + + fun setBg(bg: Drawable?) { + page_panel.background = bg + } + + fun upTime() { + tvTime?.text = timeFormat.format(Date(System.currentTimeMillis())) + } + + fun upBattery(battery: Int) { + this.battery = battery + tvBattery?.setBattery(battery) + } + + fun setContent(textPage: TextPage, resetPageOffset: Boolean = true) { + setProgress(textPage) + if (resetPageOffset) + resetPageOffset() + content_text_view.setContent(textPage) + } + + fun resetPageOffset() { + content_text_view.resetPageOffset() + } + + @SuppressLint("SetTextI18n") + fun setProgress(textPage: TextPage) = textPage.apply { + tvBookName?.text = ReadBook.book?.bookName + tvTitle?.text = textPage.title + tvPage?.text = "${index.plus(1)}/$pageSize" + tvTotalProgress?.text = readProgress + tvPageAndTotal?.text = "${index.plus(1)}/$pageSize $readProgress" + } + + fun onScroll(offset: Float) { + content_text_view.onScroll(offset) + } + + fun upSelectAble(selectAble: Boolean) { + content_text_view.selectAble = selectAble + } + + fun selectText( + x: Float, y: Float, + select: (relativePage: Int, lineIndex: Int, charIndex: Int) -> Unit + ) { + return content_text_view.selectText(x, y - headerHeight, select) + } + + fun selectStartMove(x: Float, y: Float) { + content_text_view.selectStartMove(x, y - headerHeight) + } + + fun selectStartMoveIndex(relativePage: Int, lineIndex: Int, charIndex: Int) { + content_text_view.selectStartMoveIndex(relativePage, lineIndex, charIndex) + } + + fun selectEndMove(x: Float, y: Float) { + content_text_view.selectEndMove(x, y - headerHeight) + } + + fun selectEndMoveIndex(relativePage: Int, lineIndex: Int, charIndex: Int) { + content_text_view.selectEndMoveIndex(relativePage, lineIndex, charIndex) + } + + fun cancelSelect() { + content_text_view.cancelSelect() + } + + val selectedText: String get() = content_text_view.selectedText + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/DataSource.kt b/app/src/main/java/com/novel/read/ui/read/page/DataSource.kt new file mode 100644 index 0000000..4ca04fe --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/DataSource.kt @@ -0,0 +1,21 @@ +package com.novel.read.ui.read.page + +import com.novel.read.data.read.TextChapter +import com.novel.read.service.help.ReadBook + +interface DataSource { + + val pageIndex: Int get() = ReadBook.durChapterPos() + + val currentChapter: TextChapter? + + val nextChapter: TextChapter? + + val prevChapter: TextChapter? + + fun hasNextChapter(): Boolean + + fun hasPrevChapter(): Boolean + + fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true) +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/PageFactory.kt b/app/src/main/java/com/novel/read/ui/read/page/PageFactory.kt new file mode 100644 index 0000000..1ba2246 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/PageFactory.kt @@ -0,0 +1,26 @@ +package com.novel.read.ui.read.page + +abstract class PageFactory(protected val dataSource: DataSource) { + + abstract fun moveToFirst() + + abstract fun moveToLast() + + abstract fun moveToNext(upContent: Boolean): Boolean + + abstract fun moveToPrev(upContent: Boolean): Boolean + + abstract val nextPage: DATA + + abstract val prevPage: DATA + + abstract val currentPage: DATA + + abstract val nextPagePlus: DATA + + abstract fun hasNext(): Boolean + + abstract fun hasPrev(): Boolean + + abstract fun hasNextPlus(): Boolean +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/PageView.kt b/app/src/main/java/com/novel/read/ui/read/page/PageView.kt new file mode 100644 index 0000000..4902008 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/PageView.kt @@ -0,0 +1,416 @@ +package com.novel.read.ui.read.page + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.graphics.RectF +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.ViewConfiguration +import android.widget.FrameLayout +import com.novel.read.data.read.TextChapter +import com.novel.read.help.ReadBookConfig +import com.novel.read.service.help.ReadBook +import com.novel.read.ui.read.page.delegate.* +import com.novel.read.utils.ext.accentColor +import com.novel.read.utils.ext.activity +import com.novel.read.utils.ext.screenshot + +import io.legado.app.ui.book.read.page.provider.ChapterProvider +import kotlinx.android.synthetic.main.activity_read_book.view.* +import kotlin.math.abs + +class PageView(context: Context, attrs: AttributeSet) : + FrameLayout(context, attrs), + DataSource { + + val callBack: CallBack get() = activity as CallBack + var pageFactory: TextPageFactory = TextPageFactory(this) + var pageDelegate: PageDelegate? = null + private set(value) { + field?.onDestroy() + field = null + field = value + upContent() + } + var isScroll = ReadBook.pageAnim() == 3 + var prevPage: ContentView = ContentView(context) + var curPage: ContentView = ContentView(context) + var nextPage: ContentView = ContentView(context) + val defaultAnimationSpeed = 300 + private var pressDown = false + private var isMove = false + + //起始点 + var startX: Float = 0f + var startY: Float = 0f + + //上一个触碰点 + var lastX: Float = 0f + var lastY: Float = 0f + + //触碰点 + var touchX: Float = 0f + var touchY: Float = 0f + + //是否停止动画动作 + var isAbortAnim = false + + //长按 + private var longPressed = false + private val longPressTimeout = 600L + private val longPressRunnable = Runnable { + longPressed = true + onLongPress() + } + var isTextSelected = false + private var pressOnTextSelected = false + private var firstRelativePage = 0 + private var firstLineIndex: Int = 0 + private var firstCharIndex: Int = 0 + + val slopSquare by lazy { ViewConfiguration.get(context).scaledTouchSlop } + private val centerRectF = RectF(width * 0.33f, height * 0.33f, width * 0.66f, height * 0.66f) + private val autoPageRect by lazy { Rect() } + private val autoPagePint by lazy { + Paint().apply { + color = context.accentColor + } + } + + init { + addView(nextPage) + addView(curPage) + addView(prevPage) + upBg() + setWillNotDraw(false) + upPageAnim() + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + centerRectF.set(width * 0.33f, height * 0.33f, width * 0.66f, height * 0.66f) + prevPage.x = -w.toFloat() + pageDelegate?.setViewSize(w, h) + if (oldw != 0 && oldh != 0) { + ReadBook.loadContent(resetPageOffset = false) + } + } + + override fun dispatchDraw(canvas: Canvas) { + super.dispatchDraw(canvas) + pageDelegate?.onDraw(canvas) + if (callBack.isAutoPage) { + nextPage.screenshot()?.let { + val bottom = + page_view.height * callBack.autoPageProgress / (ReadBookConfig.autoReadSpeed * 10) + autoPageRect.set(0, 0, page_view.width, bottom) + canvas.drawBitmap(it, autoPageRect, autoPageRect, null) + canvas.drawRect( + 0f, + bottom.toFloat() - 1, + page_view.width.toFloat(), + bottom.toFloat(), + autoPagePint + ) + } + } + } + + override fun computeScroll() { + pageDelegate?.scroll() + } + + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + return true + } + + /** + * 触摸事件 + */ + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent): Boolean { + callBack.screenOffTimerStart() + when (event.action) { + MotionEvent.ACTION_DOWN -> { + if (isTextSelected) { + curPage.cancelSelect() + isTextSelected = false + pressOnTextSelected = true + } else { + pressOnTextSelected = false + } + longPressed = false + postDelayed(longPressRunnable, longPressTimeout) + pressDown = true + isMove = false + pageDelegate?.onTouch(event) + pageDelegate?.onDown() + setStartPoint(event.x, event.y) + } + MotionEvent.ACTION_MOVE -> { + pressDown = true + if (!isMove) { + isMove = + abs(startX - event.x) > slopSquare || abs(startY - event.y) > slopSquare + } + if (isMove) { + longPressed = false + removeCallbacks(longPressRunnable) + if (isTextSelected) { + selectText(event.x, event.y) + } else { + pageDelegate?.onTouch(event) + } + } + } + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { + removeCallbacks(longPressRunnable) + if (!pressDown) return true + if (!isMove) { + if (!longPressed && !pressOnTextSelected) { + onSingleTapUp() + return true + } + } + if (isTextSelected) { + callBack.showTextActionMenu() + } else if (isMove) { + pageDelegate?.onTouch(event) + } + pressOnTextSelected = false + } + } + return true + } + + fun upStatusBar() { + curPage.upStatusBar() + prevPage.upStatusBar() + nextPage.upStatusBar() + } + + /** + * 保存开始位置 + */ + fun setStartPoint(x: Float, y: Float, invalidate: Boolean = true) { + startX = x + startY = y + lastX = x + lastY = y + touchX = x + touchY = y + + if (invalidate) { + invalidate() + } + } + + /** + * 保存当前位置 + */ + fun setTouchPoint(x: Float, y: Float, invalidate: Boolean = true) { + lastX = touchX + lastY = touchY + touchX = x + touchY = y + if (invalidate) { + invalidate() + } + pageDelegate?.onScroll() + } + + /** + * 长按选择 + */ + private fun onLongPress() { + curPage.selectText(startX, startY) { relativePage, lineIndex, charIndex -> + isTextSelected = true + firstRelativePage = relativePage + firstLineIndex = lineIndex + firstCharIndex = charIndex + curPage.selectStartMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + curPage.selectEndMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + } + } + + /** + * 单击 + */ + private fun onSingleTapUp(): Boolean { + if (isTextSelected) { + isTextSelected = false + return true + } + if (centerRectF.contains(startX, startY)) { + if (!isAbortAnim) { + callBack.clickCenter() + } + } else if (ReadBookConfig.clickTurnPage) { + if (startX > width / 2 || ReadBookConfig.clickAllNext) { + pageDelegate?.nextPageByAnim(defaultAnimationSpeed) + } else { + pageDelegate?.prevPageByAnim(defaultAnimationSpeed) + } + } + return true + } + + /** + * 选择文本 + */ + private fun selectText(x: Float, y: Float) { + curPage.selectText(x, y) { relativePage, lineIndex, charIndex -> + when { + relativePage > firstRelativePage -> { + curPage.selectStartMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + curPage.selectEndMoveIndex(relativePage, lineIndex, charIndex) + } + relativePage < firstRelativePage -> { + curPage.selectEndMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + curPage.selectStartMoveIndex(relativePage, lineIndex, charIndex) + } + lineIndex > firstLineIndex -> { + curPage.selectStartMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + curPage.selectEndMoveIndex(relativePage, lineIndex, charIndex) + } + lineIndex < firstLineIndex -> { + curPage.selectEndMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + curPage.selectStartMoveIndex(relativePage, lineIndex, charIndex) + } + charIndex > firstCharIndex -> { + curPage.selectStartMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + curPage.selectEndMoveIndex(relativePage, lineIndex, charIndex) + } + else -> { + curPage.selectEndMoveIndex(firstRelativePage, firstLineIndex, firstCharIndex) + curPage.selectStartMoveIndex(relativePage, lineIndex, charIndex) + } + } + } + } + + fun onDestroy() { + pageDelegate?.onDestroy() + curPage.cancelSelect() + } + + fun fillPage(direction: PageDelegate.Direction) { + when (direction) { + PageDelegate.Direction.PREV -> { + pageFactory.moveToPrev(true) + } + PageDelegate.Direction.NEXT -> { + pageFactory.moveToNext(true) + } + else -> Unit + } + } + + fun upPageAnim() { + isScroll = ReadBook.pageAnim() == 3 + when (ReadBook.pageAnim()) { + 0 -> if (pageDelegate !is CoverPageDelegate) { + pageDelegate = CoverPageDelegate(this) + } + 1 -> if (pageDelegate !is SlidePageDelegate) { + pageDelegate = SlidePageDelegate(this) + } + 2 -> if (pageDelegate !is SimulationPageDelegate) { + pageDelegate = SimulationPageDelegate(this) + } + 3 -> if (pageDelegate !is ScrollPageDelegate) { + pageDelegate = ScrollPageDelegate(this) + } + else -> if (pageDelegate !is NoAnimPageDelegate) { + pageDelegate = NoAnimPageDelegate(this) + } + } + } + + override fun upContent(relativePosition: Int, resetPageOffset: Boolean) { + if (isScroll && !callBack.isAutoPage) { + curPage.setContent(pageFactory.currentPage, resetPageOffset) + } else { + curPage.resetPageOffset() + when (relativePosition) { + -1 -> prevPage.setContent(pageFactory.prevPage) + 1 -> nextPage.setContent(pageFactory.nextPage) + else -> { + curPage.setContent(pageFactory.currentPage) + nextPage.setContent(pageFactory.nextPage) + prevPage.setContent(pageFactory.prevPage) + } + } + } + callBack.screenOffTimerStart() + } + + fun upTipStyle() { + curPage.upTipStyle() + prevPage.upTipStyle() + nextPage.upTipStyle() + } + + fun upStyle() { + ChapterProvider.upStyle() + curPage.upStyle() + prevPage.upStyle() + nextPage.upStyle() + } + + fun upBg() { + ReadBookConfig.bg ?: let { + ReadBookConfig.upBg() + } + curPage.setBg(ReadBookConfig.bg) + prevPage.setBg(ReadBookConfig.bg) + nextPage.setBg(ReadBookConfig.bg) + } + + fun upTime() { + curPage.upTime() + prevPage.upTime() + nextPage.upTime() + } + + fun upBattery(battery: Int) { + curPage.upBattery(battery) + prevPage.upBattery(battery) + nextPage.upBattery(battery) + } + + override val currentChapter: TextChapter? + get() { + return if (callBack.isInitFinish) ReadBook.textChapter(0) else null + } + + override val nextChapter: TextChapter? + get() { + return if (callBack.isInitFinish) ReadBook.textChapter(1) else null + } + + override val prevChapter: TextChapter? + get() { + return if (callBack.isInitFinish) ReadBook.textChapter(-1) else null + } + + override fun hasNextChapter(): Boolean { + return ReadBook.durChapterIndex < ReadBook.chapterSize - 1 + } + + override fun hasPrevChapter(): Boolean { + return ReadBook.durChapterIndex > 0 + } + + interface CallBack { + val isInitFinish: Boolean + val isAutoPage: Boolean + val autoPageProgress: Int + fun clickCenter() + fun screenOffTimerStart() + fun showTextActionMenu() + } +} diff --git a/app/src/main/java/com/novel/read/ui/read/page/TextPageFactory.kt b/app/src/main/java/com/novel/read/ui/read/page/TextPageFactory.kt new file mode 100644 index 0000000..8482fab --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/TextPageFactory.kt @@ -0,0 +1,131 @@ +package com.novel.read.ui.read.page + +import com.novel.read.data.read.TextPage +import com.novel.read.service.help.ReadBook + + +class TextPageFactory(dataSource: DataSource) : PageFactory(dataSource) { + + override fun hasPrev(): Boolean = with(dataSource) { + return hasPrevChapter() || pageIndex > 0 + } + + override fun hasNext(): Boolean = with(dataSource) { + return hasNextChapter() || currentChapter?.isLastIndex(pageIndex) != true + } + + override fun hasNextPlus(): Boolean = with(dataSource) { + return hasNextChapter() || pageIndex < (currentChapter?.pageSize ?: 1) - 2 + } + + override fun moveToFirst() { + ReadBook.setPageIndex(0) + } + + override fun moveToLast() = with(dataSource) { + currentChapter?.let { + if (it.pageSize == 0) { + ReadBook.setPageIndex(0) + } else { + ReadBook.setPageIndex(it.pageSize.minus(1)) + } + } ?: ReadBook.setPageIndex(0) + } + + override fun moveToNext(upContent: Boolean): Boolean = with(dataSource) { + return if (hasNext()) { + if (currentChapter?.isLastIndex(pageIndex) == true) { + ReadBook.moveToNextChapter(upContent) + } else { + ReadBook.setPageIndex(pageIndex.plus(1)) + } + if (upContent) upContent(resetPageOffset = false) + true + } else + false + } + + override fun moveToPrev(upContent: Boolean): Boolean = with(dataSource) { + return if (hasPrev()) { + if (pageIndex <= 0) { + ReadBook.moveToPrevChapter(upContent) + } else { + ReadBook.setPageIndex(pageIndex.minus(1)) + } + if (upContent) upContent(resetPageOffset = false) + true + } else + false + } + + override val currentPage: TextPage + get() = with(dataSource) { + ReadBook.msg?.let { + return@with TextPage(text = it).format() + } + currentChapter?.let { + return@with it.page(pageIndex) + ?: TextPage(title = it.title).format() + } + return TextPage().format() + } + + override val nextPage: TextPage + get() = with(dataSource) { + ReadBook.msg?.let { + return@with TextPage(text = it).format() + } + currentChapter?.let { + if (pageIndex < it.pageSize - 1) { + return@with it.page(pageIndex + 1)?.removePageAloudSpan() + ?: TextPage(title = it.title).format() + } + } + if (!hasNextChapter()) { + return@with TextPage(text = "") + } + nextChapter?.let { + return@with it.page(0)?.removePageAloudSpan() + ?: TextPage(title = it.title).format() + } + return TextPage().format() + } + + override val prevPage: TextPage + get() = with(dataSource) { + ReadBook.msg?.let { + return@with TextPage(text = it).format() + } + if (pageIndex > 0) { + currentChapter?.let { + return@with it.page(pageIndex - 1)?.removePageAloudSpan() + ?: TextPage(title = it.title).format() + } + } + prevChapter?.let { + return@with it.lastPage?.removePageAloudSpan() + ?: TextPage(title = it.title).format() + } + return TextPage().format() + } + + override val nextPagePlus: TextPage + get() = with(dataSource) { + currentChapter?.let { + if (pageIndex < it.pageSize - 2) { + return@with it.page(pageIndex + 2)?.removePageAloudSpan() + ?: TextPage(title = it.title).format() + } + nextChapter?.let { nc -> + if (pageIndex < it.pageSize - 1) { + return@with nc.page(0)?.removePageAloudSpan() + ?: TextPage(title = nc.title).format() + } + return@with nc.page(1)?.removePageAloudSpan() + ?: TextPage(title = nc.title).format() + } + + } + return TextPage().format() + } +} diff --git a/app/src/main/java/com/novel/read/ui/read/page/delegate/CoverPageDelegate.kt b/app/src/main/java/com/novel/read/ui/read/page/delegate/CoverPageDelegate.kt new file mode 100644 index 0000000..69ec526 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/delegate/CoverPageDelegate.kt @@ -0,0 +1,83 @@ +package com.novel.read.ui.read.page.delegate + +import android.graphics.Canvas +import android.graphics.Matrix +import android.graphics.drawable.GradientDrawable +import com.novel.read.ui.read.page.PageView + +class CoverPageDelegate(pageView: PageView) : HorizontalPageDelegate(pageView) { + private val bitmapMatrix = Matrix() + private val shadowDrawableR: GradientDrawable + + init { + val shadowColors = intArrayOf(0x66111111, 0x00000000) + shadowDrawableR = GradientDrawable( + GradientDrawable.Orientation.LEFT_RIGHT, shadowColors + ) + shadowDrawableR.gradientType = GradientDrawable.LINEAR_GRADIENT + } + + override fun onDraw(canvas: Canvas) { + if (!isRunning) return + val offsetX = touchX - startX + + if ((mDirection == Direction.NEXT && offsetX > 0) + || (mDirection == Direction.PREV && offsetX < 0) + ) { + return + } + + val distanceX = if (offsetX > 0) offsetX - viewWidth else offsetX + viewWidth + if (mDirection == Direction.PREV) { + bitmapMatrix.setTranslate(distanceX, 0.toFloat()) + curBitmap?.let { canvas.drawBitmap(it, 0f, 0f, null) } + prevBitmap?.let { canvas.drawBitmap(it, bitmapMatrix, null) } + addShadow(distanceX.toInt(), canvas) + } else if (mDirection == Direction.NEXT) { + bitmapMatrix.setTranslate(distanceX - viewWidth, 0.toFloat()) + nextBitmap?.let { canvas.drawBitmap(it, 0f, 0f, null) } + curBitmap?.let { canvas.drawBitmap(it, bitmapMatrix, null) } + addShadow(distanceX.toInt(), canvas) + } + } + + private fun addShadow(left: Int, canvas: Canvas) { + if (left < 0) { + shadowDrawableR.setBounds(left + viewWidth, 0, left + viewWidth + 30, viewHeight) + shadowDrawableR.draw(canvas) + } else if (left > 0) { + shadowDrawableR.setBounds(left, 0, left + 30, viewHeight) + shadowDrawableR.draw(canvas) + } + } + + override fun onAnimStop() { + if (!isCancel) { + pageView.fillPage(mDirection) + } + } + + override fun onAnimStart(animationSpeed: Int) { + val distanceX: Float + when (mDirection) { + Direction.NEXT -> distanceX = + if (isCancel) { + var dis = viewWidth - startX + touchX + if (dis > viewWidth) { + dis = viewWidth.toFloat() + } + viewWidth - dis + } else { + -(touchX + (viewWidth - startX)) + } + else -> distanceX = + if (isCancel) { + -(touchX - startX) + } else { + viewWidth - (touchX - startX) + } + } + startScroll(touchX.toInt(), 0, distanceX.toInt(), 0, animationSpeed) + } + +} diff --git a/app/src/main/java/com/novel/read/ui/read/page/delegate/HorizontalPageDelegate.kt b/app/src/main/java/com/novel/read/ui/read/page/delegate/HorizontalPageDelegate.kt new file mode 100644 index 0000000..54e290a --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/delegate/HorizontalPageDelegate.kt @@ -0,0 +1,143 @@ +package com.novel.read.ui.read.page.delegate + +import android.graphics.Bitmap +import android.view.MotionEvent +import com.novel.read.utils.ext.screenshot +import com.novel.read.ui.read.page.PageView + +abstract class HorizontalPageDelegate(pageView: PageView) : PageDelegate(pageView) { + + protected var curBitmap: Bitmap? = null + protected var prevBitmap: Bitmap? = null + protected var nextBitmap: Bitmap? = null + + override fun setDirection(direction: Direction) { + super.setDirection(direction) + setBitmap() + } + + private fun setBitmap() { + when (mDirection) { + Direction.PREV -> { + prevBitmap?.recycle() + prevBitmap = prevPage.screenshot() + curBitmap?.recycle() + curBitmap = curPage.screenshot() + } + Direction.NEXT -> { + nextBitmap?.recycle() + nextBitmap = nextPage.screenshot() + curBitmap?.recycle() + curBitmap = curPage.screenshot() + } + else -> Unit + } + } + + override fun onTouch(event: MotionEvent) { + when (event.action) { + MotionEvent.ACTION_DOWN -> { + abortAnim() + } + MotionEvent.ACTION_MOVE -> { + onScroll(event) + } + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { + onAnimStart(pageView.defaultAnimationSpeed) + } + } + } + + private fun onScroll(event: MotionEvent) { + + val action: Int = event.action + val pointerUp = + action and MotionEvent.ACTION_MASK == MotionEvent.ACTION_POINTER_UP + val skipIndex = if (pointerUp) event.actionIndex else -1 + // Determine focal point + var sumX = 0f + var sumY = 0f + val count: Int = event.pointerCount + for (i in 0 until count) { + if (skipIndex == i) continue + sumX += event.getX(i) + sumY += event.getY(i) + } + val div = if (pointerUp) count - 1 else count + val focusX = sumX / div + val focusY = sumY / div + //判断是否移动了 + if (!isMoved) { + val deltaX = (focusX - startX).toInt() + val deltaY = (focusY - startY).toInt() + val distance = deltaX * deltaX + deltaY * deltaY + isMoved = distance > pageView.slopSquare + if (isMoved) { + if (sumX - startX > 0) { + //如果上一页不存在 + if (!hasPrev()) { + noNext = true + return + } + setDirection(Direction.PREV) + } else { + //如果不存在表示没有下一页了 + if (!hasNext()) { + noNext = true + return + } + setDirection(Direction.NEXT) + } + } + } + if (isMoved) { + isCancel = if (mDirection == Direction.NEXT) sumX > lastX else sumX < lastX + isRunning = true + //设置触摸点 + pageView.setTouchPoint(sumX, sumY) + } + } + + override fun abortAnim() { + isStarted = false + isMoved = false + isRunning = false + if (!scroller.isFinished) { + pageView.isAbortAnim = true + scroller.abortAnimation() + if (!isCancel) { + pageView.fillPage(mDirection) + pageView.invalidate() + } + } else { + pageView.isAbortAnim = false + } + } + + override fun nextPageByAnim(animationSpeed: Int) { + abortAnim() + if (!hasNext()) return + setDirection(Direction.NEXT) + pageView.setTouchPoint(viewWidth.toFloat(), 0f, false) + onAnimStart(animationSpeed) + } + + override fun prevPageByAnim(animationSpeed: Int) { + abortAnim() + if (!hasPrev()) return + setDirection(Direction.PREV) + pageView.setTouchPoint(0f, 0f) + onAnimStart(animationSpeed) + } + + override fun onDestroy() { + super.onDestroy() + prevBitmap?.recycle() + prevBitmap = null + curBitmap?.recycle() + curBitmap = null + nextBitmap?.recycle() + nextBitmap = null + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/delegate/NoAnimPageDelegate.kt b/app/src/main/java/com/novel/read/ui/read/page/delegate/NoAnimPageDelegate.kt new file mode 100644 index 0000000..80be268 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/delegate/NoAnimPageDelegate.kt @@ -0,0 +1,24 @@ +package com.novel.read.ui.read.page.delegate + +import android.graphics.Canvas +import com.novel.read.ui.read.page.PageView + +class NoAnimPageDelegate(pageView: PageView) : HorizontalPageDelegate(pageView) { + + override fun onAnimStart(animationSpeed: Int) { + if (!isCancel) { + pageView.fillPage(mDirection) + } + stopScroll() + } + + override fun onDraw(canvas: Canvas) { + // nothing + } + + override fun onAnimStop() { + // nothing + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/delegate/PageDelegate.kt b/app/src/main/java/com/novel/read/ui/read/page/delegate/PageDelegate.kt new file mode 100644 index 0000000..64edeee --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/delegate/PageDelegate.kt @@ -0,0 +1,191 @@ +package com.novel.read.ui.read.page.delegate + +import android.content.Context +import android.graphics.Canvas +import android.view.MotionEvent +import android.view.animation.DecelerateInterpolator +import android.widget.Scroller +import androidx.annotation.CallSuper +import com.google.android.material.snackbar.Snackbar +import com.novel.read.R +import com.novel.read.ui.read.page.ContentView +import com.novel.read.ui.read.page.PageView +import kotlin.math.abs + +abstract class PageDelegate(protected val pageView: PageView) { + + protected val context: Context = pageView.context + + //起始点 + protected val startX: Float get() = pageView.startX + protected val startY: Float get() = pageView.startY + + //上一个触碰点 + protected val lastX: Float get() = pageView.lastX + protected val lastY: Float get() = pageView.lastY + + //触碰点 + protected val touchX: Float get() = pageView.touchX + protected val touchY: Float get() = pageView.touchY + + protected val nextPage: ContentView get() = pageView.nextPage + protected val curPage: ContentView get() = pageView.curPage + protected val prevPage: ContentView get() = pageView.prevPage + + protected var viewWidth: Int = pageView.width + protected var viewHeight: Int = pageView.height + + protected val scroller: Scroller by lazy { + Scroller(pageView.context, DecelerateInterpolator()) + } + + private val snackBar: Snackbar by lazy { + Snackbar.make(pageView, "", Snackbar.LENGTH_SHORT) + } + + var isMoved = false + var noNext = true + + //移动方向 + var mDirection = Direction.NONE + var isCancel = false + var isRunning = false + var isStarted = false + + private var selectedOnDown = false + + init { + curPage.resetPageOffset() + } + + open fun fling( + startX: Int, startY: Int, velocityX: Int, velocityY: Int, + minX: Int, maxX: Int, minY: Int, maxY: Int + ) { + scroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY) + isRunning = true + isStarted = true + pageView.invalidate() + } + + protected fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, animationSpeed: Int) { + val duration = if (dx != 0) { + (animationSpeed * abs(dx)) / viewWidth + } else { + (animationSpeed * abs(dy)) / viewHeight + } + scroller.startScroll(startX, startY, dx, dy, duration) + isRunning = true + isStarted = true + pageView.invalidate() + } + + protected fun stopScroll() { + isStarted = false + pageView.post { + isMoved = false + isRunning = false + pageView.invalidate() + } + } + + open fun setViewSize(width: Int, height: Int) { + viewWidth = width + viewHeight = height + } + + fun scroll() { + if (scroller.computeScrollOffset()) { + pageView.setTouchPoint(scroller.currX.toFloat(), scroller.currY.toFloat()) + } else if (isStarted) { + onAnimStop() + stopScroll() + } + } + + open fun onScroll() = Unit + + abstract fun abortAnim() + + abstract fun onAnimStart(animationSpeed: Int) //scroller start + + abstract fun onDraw(canvas: Canvas) //绘制 + + abstract fun onAnimStop() //scroller finish + + abstract fun nextPageByAnim(animationSpeed: Int) + + abstract fun prevPageByAnim(animationSpeed: Int) + + open fun keyTurnPage(direction: Direction) { + if (isRunning) return + when (direction) { + Direction.NEXT -> nextPageByAnim(100) + Direction.PREV -> prevPageByAnim(100) + else -> return + } + } + + @CallSuper + open fun setDirection(direction: Direction) { + mDirection = direction + } + + /** + * 触摸事件处理 + */ + abstract fun onTouch(event: MotionEvent) + + /** + * 按下 + */ + fun onDown() { + //是否移动 + isMoved = false + //是否存在下一章 + noNext = false + //是否正在执行动画 + isRunning = false + //取消 + isCancel = false + //是下一章还是前一章 + setDirection(Direction.NONE) + } + + /** + * 判断是否有上一页 + */ + fun hasPrev(): Boolean { + val hasPrev = pageView.pageFactory.hasPrev() + if (!hasPrev) { + if (!snackBar.isShown) { + snackBar.setText(R.string.no_prev_page) + snackBar.show() + } + } + return hasPrev + } + + /** + * 判断是否有下一页 + */ + fun hasNext(): Boolean { + val hasNext = pageView.pageFactory.hasNext() + if (!hasNext) { + if (!snackBar.isShown) { + snackBar.setText(R.string.no_next_page) + snackBar.show() + } + } + return hasNext + } + + open fun onDestroy() { + + } + + enum class Direction { + NONE, PREV, NEXT + } + +} diff --git a/app/src/main/java/com/novel/read/ui/read/page/delegate/ScrollPageDelegate.kt b/app/src/main/java/com/novel/read/ui/read/page/delegate/ScrollPageDelegate.kt new file mode 100644 index 0000000..f21ca90 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/delegate/ScrollPageDelegate.kt @@ -0,0 +1,114 @@ +package com.novel.read.ui.read.page.delegate + +import android.graphics.Canvas +import android.view.MotionEvent +import android.view.VelocityTracker +import com.novel.read.ui.read.page.PageView +import io.legado.app.ui.book.read.page.provider.ChapterProvider + +class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { + + // 滑动追踪的时间 + private val velocityDuration = 1000 + //速度追踪器 + private val mVelocity: VelocityTracker = VelocityTracker.obtain() + + override fun onAnimStart(animationSpeed: Int) { + //惯性滚动 + fling( + 0, touchY.toInt(), 0, mVelocity.yVelocity.toInt(), + 0, 0, -10 * viewHeight, 10 * viewHeight + ) + } + + override fun onAnimStop() { + // nothing + } + + override fun onTouch(event: MotionEvent) { + when (event.action) { + MotionEvent.ACTION_DOWN -> { + abortAnim() + mVelocity.clear() + } + MotionEvent.ACTION_MOVE -> { + onScroll(event) + } + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> { + onAnimStart(pageView.defaultAnimationSpeed) + } + } + } + + override fun onScroll() { + curPage.onScroll(touchY - lastY) + } + + override fun onDraw(canvas: Canvas) { + // nothing + } + + private fun onScroll(event: MotionEvent) { + mVelocity.addMovement(event) + mVelocity.computeCurrentVelocity(velocityDuration) + val action: Int = event.action + val pointerUp = + action and MotionEvent.ACTION_MASK == MotionEvent.ACTION_POINTER_UP + val skipIndex = if (pointerUp) event.actionIndex else -1 + // Determine focal point + var sumX = 0f + var sumY = 0f + val count: Int = event.pointerCount + for (i in 0 until count) { + if (skipIndex == i) continue + sumX += event.getX(i) + sumY += event.getY(i) + } + val div = if (pointerUp) count - 1 else count + val focusX = sumX / div + val focusY = sumY / div + pageView.setTouchPoint(sumX, sumY) + if (!isMoved) { + val deltaX = (focusX - startX).toInt() + val deltaY = (focusY - startY).toInt() + val distance = deltaX * deltaX + deltaY * deltaY + isMoved = distance > pageView.slopSquare + } + if (isMoved) { + isRunning = true + } + } + + override fun onDestroy() { + super.onDestroy() + mVelocity.recycle() + } + + override fun abortAnim() { + isStarted = false + isMoved = false + isRunning = false + if (!scroller.isFinished) { + pageView.isAbortAnim = true + scroller.abortAnimation() + } else { + pageView.isAbortAnim = false + } + } + + override fun nextPageByAnim(animationSpeed: Int) { + if (pageView.isAbortAnim) { + return + } + pageView.setStartPoint(0f, 0f, false) + startScroll(0, 0, 0, -ChapterProvider.visibleHeight, animationSpeed) + } + + override fun prevPageByAnim(animationSpeed: Int) { + if (pageView.isAbortAnim) { + return + } + pageView.setStartPoint(0f, 0f, false) + startScroll(0, 0, 0, ChapterProvider.visibleHeight, animationSpeed) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/delegate/SimulationPageDelegate.kt b/app/src/main/java/com/novel/read/ui/read/page/delegate/SimulationPageDelegate.kt new file mode 100644 index 0000000..056644f --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/delegate/SimulationPageDelegate.kt @@ -0,0 +1,561 @@ +package com.novel.read.ui.read.page.delegate + +import android.graphics.* +import android.graphics.drawable.GradientDrawable +import android.os.Build +import android.view.MotionEvent +import com.novel.read.help.ReadBookConfig +import com.novel.read.ui.read.page.PageView +import kotlin.math.* + +@Suppress("DEPRECATION") +class SimulationPageDelegate(pageView: PageView) : HorizontalPageDelegate(pageView) { + //不让x,y为0,否则在点计算时会有问题 + private var mTouchX = 0.1f + private var mTouchY = 0.1f + // 拖拽点对应的页脚 + private var mCornerX = 1 + private var mCornerY = 1 + private val mPath0: Path = Path() + private val mPath1: Path = Path() + // 贝塞尔曲线起始点 + private val mBezierStart1 = PointF() + // 贝塞尔曲线控制点 + private val mBezierControl1 = PointF() + // 贝塞尔曲线顶点 + private val mBezierVertex1 = PointF() + // 贝塞尔曲线结束点 + private var mBezierEnd1 = PointF() + + // 另一条贝塞尔曲线 + // 贝塞尔曲线起始点 + private val mBezierStart2 = PointF() + // 贝塞尔曲线控制点 + private val mBezierControl2 = PointF() + // 贝塞尔曲线顶点 + private val mBezierVertex2 = PointF() + // 贝塞尔曲线结束点 + private var mBezierEnd2 = PointF() + + private var mMiddleX = 0f + private var mMiddleY = 0f + private var mDegrees = 0f + private var mTouchToCornerDis = 0f + private var mColorMatrixFilter = ColorMatrixColorFilter( + ColorMatrix( + floatArrayOf( + 1f, 0f, 0f, 0f, 0f, + 0f, 1f, 0f, 0f, 0f, + 0f, 0f, 1f, 0f, 0f, + 0f, 0f, 0f, 1f, 0f + ) + ) + ) + private val mMatrix: Matrix = Matrix() + private val mMatrixArray = floatArrayOf(0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 1f) + + // 是否属于右上左下 + private var mIsRtOrLb = false + private var mMaxLength = hypot(viewWidth.toDouble(), viewHeight.toDouble()).toFloat() + // 背面颜色组 + private var mBackShadowColors: IntArray + // 前面颜色组 + private var mFrontShadowColors: IntArray + // 有阴影的GradientDrawable + private var mBackShadowDrawableLR: GradientDrawable + private var mBackShadowDrawableRL: GradientDrawable + private var mFolderShadowDrawableLR: GradientDrawable + private var mFolderShadowDrawableRL: GradientDrawable + + private var mFrontShadowDrawableHBT: GradientDrawable + private var mFrontShadowDrawableHTB: GradientDrawable + private var mFrontShadowDrawableVLR: GradientDrawable + private var mFrontShadowDrawableVRL: GradientDrawable + + private val mPaint: Paint = Paint().apply { style = Paint.Style.FILL } + + init { + //设置颜色数组 + val color = intArrayOf(0x333333, -0x4fcccccd) + mFolderShadowDrawableRL = GradientDrawable(GradientDrawable.Orientation.RIGHT_LEFT, color) + mFolderShadowDrawableRL.gradientType = GradientDrawable.LINEAR_GRADIENT + + mFolderShadowDrawableLR = GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, color) + mFolderShadowDrawableLR.gradientType = GradientDrawable.LINEAR_GRADIENT + + mBackShadowColors = intArrayOf(-0xeeeeef, 0x111111) + mBackShadowDrawableRL = + GradientDrawable(GradientDrawable.Orientation.RIGHT_LEFT, mBackShadowColors) + mBackShadowDrawableRL.gradientType = GradientDrawable.LINEAR_GRADIENT + + mBackShadowDrawableLR = + GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, mBackShadowColors) + mBackShadowDrawableLR.gradientType = GradientDrawable.LINEAR_GRADIENT + + mFrontShadowColors = intArrayOf(-0x7feeeeef, 0x111111) + mFrontShadowDrawableVLR = + GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, mFrontShadowColors) + mFrontShadowDrawableVLR.gradientType = GradientDrawable.LINEAR_GRADIENT + + mFrontShadowDrawableVRL = + GradientDrawable(GradientDrawable.Orientation.RIGHT_LEFT, mFrontShadowColors) + mFrontShadowDrawableVRL.gradientType = GradientDrawable.LINEAR_GRADIENT + + mFrontShadowDrawableHTB = + GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, mFrontShadowColors) + mFrontShadowDrawableHTB.gradientType = GradientDrawable.LINEAR_GRADIENT + + mFrontShadowDrawableHBT = + GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, mFrontShadowColors) + mFrontShadowDrawableHBT.gradientType = GradientDrawable.LINEAR_GRADIENT + } + + override fun setViewSize(width: Int, height: Int) { + super.setViewSize(width, height) + mMaxLength = hypot(viewWidth.toDouble(), viewHeight.toDouble()).toFloat() + } + + override fun onTouch(event: MotionEvent) { + super.onTouch(event) + when (event.action) { + MotionEvent.ACTION_DOWN -> { + calcCornerXY(event.x, event.y) + } + MotionEvent.ACTION_MOVE -> { + if ((startY > viewHeight / 3 && startY < viewHeight * 2 / 3) + || mDirection == Direction.PREV + ) { + pageView.touchY = viewHeight.toFloat() + } + + if (startY > viewHeight / 3 && startY < viewHeight / 2 + && mDirection == Direction.NEXT + ) { + pageView.touchY = 1f + } + } + } + } + + override fun setDirection(direction: Direction) { + super.setDirection(direction) + when (direction) { + Direction.PREV -> + //上一页滑动不出现对角 + if (startX > viewWidth / 2) { + calcCornerXY(startX, viewHeight.toFloat()) + } else { + calcCornerXY(viewWidth - startX, viewHeight.toFloat()) + } + Direction.NEXT -> + if (viewWidth / 2 > startX) { + calcCornerXY(viewWidth - startX, startY) + } + else -> Unit + } + } + + override fun onAnimStart(animationSpeed: Int) { + var dx: Float + val dy: Float + // dy 垂直方向滑动的距离,负值会使滚动向上滚动 + if (isCancel) { + dx = if (mCornerX > 0 && mDirection == Direction.NEXT) { + (viewWidth - touchX) + } else { + -touchX + } + if (mDirection != Direction.NEXT) { + dx = -(viewWidth + touchX) + } + dy = if (mCornerY > 0) { + (viewHeight - touchY) + } else { + -touchY // 防止mTouchY最终变为0 + } + } else { + dx = if (mCornerX > 0 && mDirection == Direction.NEXT) { + -(viewWidth + touchX) + } else { + (viewWidth - touchX + viewWidth) + } + dy = if (mCornerY > 0) { + (viewHeight - touchY) + } else { + (1 - touchY) // 防止mTouchY最终变为0 + } + } + startScroll(touchX.toInt(), touchY.toInt(), dx.toInt(), dy.toInt(), animationSpeed) + } + + override fun onAnimStop() { + if (!isCancel) { + pageView.fillPage(mDirection) + } + } + + override fun onDraw(canvas: Canvas) { + if (!isRunning) return + when (mDirection) { + Direction.NEXT -> { + calcPoints() + drawCurrentPageArea(canvas, curBitmap) + drawNextPageAreaAndShadow(canvas, nextBitmap) + drawCurrentPageShadow(canvas) + drawCurrentBackArea(canvas, curBitmap) + } + Direction.PREV -> { + calcPoints() + drawCurrentPageArea(canvas, prevBitmap) + drawNextPageAreaAndShadow(canvas, curBitmap) + drawCurrentPageShadow(canvas) + drawCurrentBackArea(canvas, prevBitmap) + } + else -> return + } + } + + /** + * 绘制翻起页背面 + */ + private fun drawCurrentBackArea( + canvas: Canvas, + bitmap: Bitmap? + ) { + bitmap ?: return + val i = ((mBezierStart1.x + mBezierControl1.x) / 2).toInt() + val f1 = abs(i - mBezierControl1.x) + val i1 = ((mBezierStart2.y + mBezierControl2.y) / 2).toInt() + val f2 = abs(i1 - mBezierControl2.y) + val f3 = 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() + val mFolderShadowDrawable: GradientDrawable + val left: Int + val right: Int + if (mIsRtOrLb) { + left = (mBezierStart1.x - 1).toInt() + right = (mBezierStart1.x + f3 + 1).toInt() + mFolderShadowDrawable = mFolderShadowDrawableLR + } else { + left = (mBezierStart1.x - f3 - 1).toInt() + right = (mBezierStart1.x + 1).toInt() + mFolderShadowDrawable = mFolderShadowDrawableRL + } + canvas.save() + canvas.clipPath(mPath0) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + canvas.clipPath(mPath1) + } else { + canvas.clipPath(mPath1, Region.Op.INTERSECT) + } + + mPaint.colorFilter = mColorMatrixFilter + val dis = hypot( + mCornerX - mBezierControl1.x.toDouble(), + mBezierControl2.y - mCornerY.toDouble() + ).toFloat() + val f8 = (mCornerX - mBezierControl1.x) / dis + val 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.drawColor(ReadBookConfig.bgMeanColor) + canvas.drawBitmap(bitmap, mMatrix, mPaint) + mPaint.colorFilter = null + canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y) + mFolderShadowDrawable.setBounds( + left, mBezierStart1.y.toInt(), + right, (mBezierStart1.y + mMaxLength).toInt() + ) + mFolderShadowDrawable.draw(canvas) + canvas.restore() + } + + /** + * 绘制翻起页的阴影 + */ + private fun drawCurrentPageShadow(canvas: Canvas) { + val degree: Double = if (mIsRtOrLb) { + Math.PI / 4 - atan2(mBezierControl1.y - mTouchY, mTouchX - mBezierControl1.x) + } else { + Math.PI / 4 - atan2(mTouchY - mBezierControl1.y, mTouchX - mBezierControl1.x) + } + // 翻起页阴影顶点与touch点的距离 + val d1 = 25.toFloat() * 1.414 * cos(degree) + val d2 = 25.toFloat() * 1.414 * sin(degree) + val x = (mTouchX + d1).toFloat() + val y: Float = if (mIsRtOrLb) { + (mTouchY + d2).toFloat() + } else { + (mTouchY - d2).toFloat() + } + mPath1.reset() + mPath1.moveTo(x, y) + mPath1.lineTo(mTouchX, mTouchY) + mPath1.lineTo(mBezierControl1.x, mBezierControl1.y) + mPath1.lineTo(mBezierStart1.x, mBezierStart1.y) + mPath1.close() + canvas.save() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + canvas.clipOutPath(mPath0) + } else { + canvas.clipPath(mPath0, Region.Op.XOR) + } + canvas.clipPath(mPath1, Region.Op.INTERSECT) + + var leftX: Int + var rightX: Int + var mCurrentPageShadow: GradientDrawable + if (mIsRtOrLb) { + leftX = mBezierControl1.x.toInt() + rightX = (mBezierControl1.x + 25).toInt() + mCurrentPageShadow = mFrontShadowDrawableVLR + } else { + leftX = (mBezierControl1.x - 25).toInt() + rightX = (mBezierControl1.x + 1).toInt() + mCurrentPageShadow = mFrontShadowDrawableVRL + } + var rotateDegrees = Math.toDegrees( + atan2(mTouchX - mBezierControl1.x, mBezierControl1.y - mTouchY).toDouble() + ).toFloat() + canvas.rotate(rotateDegrees, mBezierControl1.x, mBezierControl1.y) + mCurrentPageShadow.setBounds( + leftX, (mBezierControl1.y - mMaxLength).toInt(), + rightX, mBezierControl1.y.toInt() + ) + 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() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + canvas.clipOutPath(mPath0) + } else { + canvas.clipPath(mPath0, Region.Op.XOR) + } + canvas.clipPath(mPath1) + + if (mIsRtOrLb) { + leftX = mBezierControl2.y.toInt() + rightX = (mBezierControl2.y + 25).toInt() + mCurrentPageShadow = mFrontShadowDrawableHTB + } else { + leftX = (mBezierControl2.y - 25).toInt() + rightX = (mBezierControl2.y + 1).toInt() + mCurrentPageShadow = mFrontShadowDrawableHBT + } + rotateDegrees = Math.toDegrees( + atan2(mBezierControl2.y - mTouchY, mBezierControl2.x - mTouchX).toDouble() + ).toFloat() + canvas.rotate(rotateDegrees, mBezierControl2.x, mBezierControl2.y) + val temp = + if (mBezierControl2.y < 0) (mBezierControl2.y - viewHeight).toDouble() + else mBezierControl2.y.toDouble() + val hmg = hypot(mBezierControl2.x.toDouble(), temp) + if (hmg > mMaxLength) + mCurrentPageShadow.setBounds( + (mBezierControl2.x - 25 - hmg).toInt(), leftX, + (mBezierControl2.x + mMaxLength - hmg).toInt(), rightX + ) + else + mCurrentPageShadow.setBounds( + (mBezierControl2.x - mMaxLength).toInt(), leftX, + mBezierControl2.x.toInt(), rightX + ) + mCurrentPageShadow.draw(canvas) + canvas.restore() + } + + // + private fun drawNextPageAreaAndShadow( + canvas: Canvas, + bitmap: Bitmap? + ) { + bitmap ?: return + 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.toFloat(), mCornerY.toFloat()) + mPath1.close() + mDegrees = Math.toDegrees( + atan2( + (mBezierControl1.x - mCornerX).toDouble(), + mBezierControl2.y - mCornerY.toDouble() + ) + ).toFloat() + val leftX: Int + val rightX: Int + val mBackShadowDrawable: GradientDrawable + if (mIsRtOrLb) { //左下及右上 + leftX = mBezierStart1.x.toInt() + rightX = (mBezierStart1.x + mTouchToCornerDis / 4).toInt() + mBackShadowDrawable = mBackShadowDrawableLR + } else { + leftX = (mBezierStart1.x - mTouchToCornerDis / 4).toInt() + rightX = mBezierStart1.x.toInt() + mBackShadowDrawable = mBackShadowDrawableRL + } + canvas.save() + canvas.clipPath(mPath0) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + canvas.clipPath(mPath1) + } else { + canvas.clipPath(mPath1, Region.Op.INTERSECT) + } + canvas.drawBitmap(bitmap, 0f, 0f, null) + canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y) + mBackShadowDrawable.setBounds( + leftX, mBezierStart1.y.toInt(), + rightX, (mMaxLength + mBezierStart1.y).toInt() + ) //左上及右下角的xy坐标值,构成一个矩形 + mBackShadowDrawable.draw(canvas) + canvas.restore() + } + + // + private fun drawCurrentPageArea( + canvas: Canvas, + bitmap: Bitmap? + ) { + bitmap ?: return + 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.toFloat(), mCornerY.toFloat()) + mPath0.close() + + canvas.save() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + canvas.clipOutPath(mPath0) + } else { + canvas.clipPath(mPath0, Region.Op.XOR) + } + canvas.drawBitmap(bitmap, 0f, 0f, null) + canvas.restore() + } + + /** + * 计算拖拽点对应的拖拽脚 + */ + private fun calcCornerXY(x: Float, y: Float) { + mCornerX = if (x <= viewWidth / 2) 0 else viewWidth + mCornerY = if (y <= viewHeight / 2) 0 else viewHeight + mIsRtOrLb = (mCornerX == 0 && mCornerY == viewHeight) + || (mCornerY == 0 && mCornerX == viewWidth) + } + + private fun calcPoints() { + mTouchX = touchX + mTouchY = touchY + + mMiddleX = (mTouchX + mCornerX) / 2 + mMiddleY = (mTouchY + mCornerY) / 2 + mBezierControl1.x = + mMiddleX - (mCornerY - mMiddleY) * (mCornerY - mMiddleY) / (mCornerX - mMiddleX) + mBezierControl1.y = mCornerY.toFloat() + mBezierControl2.x = mCornerX.toFloat() + + val f4 = mCornerY - mMiddleY + if (f4 == 0f) { + 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.toFloat() + + // 固定左边上下两个点 + if (mTouchX > 0 && mTouchX < viewWidth) { + if (mBezierStart1.x < 0 || mBezierStart1.x > viewWidth) { + if (mBezierStart1.x < 0) + mBezierStart1.x = viewWidth - mBezierStart1.x + + val f1 = abs(mCornerX - mTouchX) + val f2 = viewWidth * f1 / mBezierStart1.x + mTouchX = abs(mCornerX - f2) + + val f3 = abs(mCornerX - mTouchX) * abs(mCornerY - mTouchY) / f1 + mTouchY = abs(mCornerY - f3) + + mMiddleX = (mTouchX + mCornerX) / 2 + mMiddleY = (mTouchY + mCornerY) / 2 + + mBezierControl1.x = + mMiddleX - (mCornerY - mMiddleY) * (mCornerY - mMiddleY) / (mCornerX - mMiddleX) + mBezierControl1.y = mCornerY.toFloat() + + mBezierControl2.x = mCornerX.toFloat() + + val f5 = mCornerY - mMiddleY + if (f5 == 0f) { + 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.toFloat() + mBezierStart2.y = mBezierControl2.y - (mCornerY - mBezierControl2.y) / 2 + + mTouchToCornerDis = hypot( + (mTouchX - mCornerX).toDouble(), + (mTouchY - mCornerY).toDouble() + ).toFloat() + + mBezierEnd1 = getCross( + PointF(mTouchX, mTouchY), mBezierControl1, mBezierStart1, + mBezierStart2 + ) + mBezierEnd2 = getCross( + 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的交点坐标 + */ + private fun getCross(P1: PointF, P2: PointF, P3: PointF, P4: PointF): PointF { + val crossP = PointF() + // 二元函数通式: y=ax+b + val a1 = (P2.y - P1.y) / (P2.x - P1.x) + val b1 = (P1.x * P2.y - P2.x * P1.y) / (P1.x - P2.x) + val a2 = (P4.y - P3.y) / (P4.x - P3.x) + val 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/page/delegate/SlidePageDelegate.kt b/app/src/main/java/com/novel/read/ui/read/page/delegate/SlidePageDelegate.kt new file mode 100644 index 0000000..3601b3b --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/page/delegate/SlidePageDelegate.kt @@ -0,0 +1,60 @@ +package com.novel.read.ui.read.page.delegate + +import android.graphics.Canvas +import android.graphics.Matrix +import com.novel.read.ui.read.page.PageView + +class SlidePageDelegate(pageView: PageView) : HorizontalPageDelegate(pageView) { + + private val bitmapMatrix = Matrix() + + override fun onAnimStart(animationSpeed: Int) { + val distanceX: Float + when (mDirection) { + Direction.NEXT -> distanceX = + if (isCancel) { + var dis = viewWidth - startX + touchX + if (dis > viewWidth) { + dis = viewWidth.toFloat() + } + viewWidth - dis + } else { + -(touchX + (viewWidth - startX)) + } + else -> distanceX = + if (isCancel) { + -(touchX - startX) + } else { + viewWidth - (touchX - startX) + } + } + startScroll(touchX.toInt(), 0, distanceX.toInt(), 0, animationSpeed) + } + + override fun onDraw(canvas: Canvas) { + val offsetX = touchX - startX + + if ((mDirection == Direction.NEXT && offsetX > 0) + || (mDirection == Direction.PREV && offsetX < 0) + ) return + val distanceX = if (offsetX > 0) offsetX - viewWidth else offsetX + viewWidth + if (!isRunning) return + if (mDirection == Direction.PREV) { + bitmapMatrix.setTranslate(distanceX + viewWidth, 0.toFloat()) + curBitmap?.let { canvas.drawBitmap(it, bitmapMatrix, null) } + bitmapMatrix.setTranslate(distanceX, 0.toFloat()) + prevBitmap?.let { canvas.drawBitmap(it, bitmapMatrix, null) } + } else if (mDirection == Direction.NEXT) { + bitmapMatrix.setTranslate(distanceX, 0.toFloat()) + nextBitmap?.let { canvas.drawBitmap(it, bitmapMatrix, null) } + bitmapMatrix.setTranslate(distanceX - viewWidth, 0.toFloat()) + curBitmap?.let { canvas.drawBitmap(it, bitmapMatrix, null) } + } + } + + override fun onAnimStop() { + if (!isCancel) { + pageView.fillPage(mDirection) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/read/provider/ChapterProvider.kt b/app/src/main/java/com/novel/read/ui/read/provider/ChapterProvider.kt new file mode 100644 index 0000000..9830ef7 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/provider/ChapterProvider.kt @@ -0,0 +1,475 @@ +package io.legado.app.ui.book.read.page.provider + +import android.graphics.Typeface +import android.net.Uri +import android.os.Build +import android.text.Layout +import android.text.StaticLayout +import android.text.TextPaint +import com.novel.read.App +import com.novel.read.constant.AppPattern +import com.novel.read.data.db.entity.Book +import com.novel.read.data.db.entity.BookChapter +import com.novel.read.data.read.TextChapter +import com.novel.read.data.read.TextChar +import com.novel.read.data.read.TextLine +import com.novel.read.data.read.TextPage +import com.novel.read.help.AppConfig +import com.novel.read.help.ReadBookConfig +import com.novel.read.utils.NetworkUtils +import com.novel.read.utils.RealPathUtil +import com.novel.read.utils.ext.* +import java.util.* + + +@Suppress("DEPRECATION") +object ChapterProvider { + private var viewWidth = 0 + private var viewHeight = 0 + var paddingLeft = 0 + var paddingTop = 0 + var visibleWidth = 0 + var visibleHeight = 0 + var visibleRight = 0 + var visibleBottom = 0 + private var lineSpacingExtra = 0 + private var paragraphSpacing = 0 + private var titleTopSpacing = 0 + private var titleBottomSpacing = 0 + var typeface: Typeface = Typeface.SANS_SERIF + lateinit var titlePaint: TextPaint + lateinit var contentPaint: TextPaint + + init { + upStyle() + } + + /** + * 获取拆分完的章节数据 + */ + fun getTextChapter( + book: Book, + bookChapter: BookChapter, + contents: List, + chapterSize: Int, + imageStyle: String?, + ): TextChapter { + val textPages = arrayListOf() + val pageLines = arrayListOf() + val pageLengths = arrayListOf() + val stringBuilder = StringBuilder() + var durY = 0f + textPages.add(TextPage()) + contents.forEachIndexed { index, text -> + val matcher = AppPattern.imgPattern.matcher(text) + if (matcher.find()) { + var src = matcher.group(1) +// if (!book.isEpub()) { + src = NetworkUtils.getAbsoluteURL("", src) +// } + src?.let { + durY = + setTypeImage( + book, bookChapter, src, durY, textPages, imageStyle + ) + } + } else { + val isTitle = index == 0 + if (!(isTitle && ReadBookConfig.titleMode == 2)) { + durY = + setTypeText( + text, durY, textPages, pageLines, + pageLengths, stringBuilder, isTitle + ) + } + } + } + textPages.last().height = durY + 20.dp + textPages.last().text = stringBuilder.toString() + if (pageLines.size < textPages.size) { + pageLines.add(textPages.last().textLines.size) + } + if (pageLengths.size < textPages.size) { + pageLengths.add(textPages.last().text.length) + } + textPages.forEachIndexed { index, item -> + item.index = index + item.pageSize = textPages.size + item.chapterIndex = bookChapter.chapterIndex + item.chapterSize = chapterSize + item.title = bookChapter.chapterName + item.upLinesPosition() + } + + return TextChapter( + bookChapter.chapterIndex, + bookChapter.chapterName, + bookChapter.chapterId.toInt(), + textPages, + pageLines, + pageLengths, + chapterSize + ) + } + + private fun setTypeImage( + book: Book, + chapter: BookChapter, + src: String, + y: Float, + textPages: ArrayList, + imageStyle: String?, + ): Float { + var durY = y + ImageProvider.getImage(book, chapter.chapterId.toInt(), src)?.let { + if (durY > visibleHeight) { + textPages.last().height = durY + textPages.add(TextPage()) + durY = 0f + } + var height = it.height + var width = it.width + when (imageStyle?.toUpperCase(Locale.ROOT)) { + "FULL" -> { + width = visibleWidth + height = it.height * visibleWidth / it.width + } + else -> { + if (it.width > visibleWidth) { + height = it.height * visibleWidth / it.width + width = visibleWidth + } + if (height > visibleHeight) { + width = width * visibleHeight / height + height = visibleHeight + } + if (durY + height > visibleHeight) { + textPages.last().height = durY + textPages.add(TextPage()) + durY = 0f + } + } + } + val textLine = TextLine(isImage = true) + textLine.lineTop = durY + durY += height + textLine.lineBottom = durY + val (start, end) = if (visibleWidth > width) { + val adjustWidth = (visibleWidth - width) / 2f + Pair( + paddingLeft.toFloat() + adjustWidth, + paddingLeft.toFloat() + adjustWidth + width + ) + } else { + Pair(paddingLeft.toFloat(), (paddingLeft + width).toFloat()) + } + textLine.textChars.add( + TextChar( + charData = src, + start = start, + end = end, + isImage = true + ) + ) + textPages.last().textLines.add(textLine) + } + return durY + paragraphSpacing / 10f + } + + /** + * 排版文字 + */ + private fun setTypeText( + text: String, + y: Float, + textPages: ArrayList, + pageLines: ArrayList, + pageLengths: ArrayList, + stringBuilder: StringBuilder, + isTitle: Boolean, + ): Float { + var durY = if (isTitle) y + titleTopSpacing else y + val textPaint = if (isTitle) titlePaint else contentPaint + val layout = StaticLayout( + text, textPaint, visibleWidth, Layout.Alignment.ALIGN_NORMAL, 0f, 0f, true + ) + for (lineIndex in 0 until layout.lineCount) { + val textLine = TextLine(isTitle = isTitle) + val words = + text.substring(layout.getLineStart(lineIndex), layout.getLineEnd(lineIndex)) + val desiredWidth = layout.getLineWidth(lineIndex) + var isLastLine = false + if (lineIndex == 0 && layout.lineCount > 1 && !isTitle) { + //第一行 + textLine.text = words + addCharsToLineFirst( + textLine, + words.toStringArray(), + textPaint, + desiredWidth + ) + } else if (lineIndex == layout.lineCount - 1) { + //最后一行 + textLine.text = "$words\n" + isLastLine = true + val x = if (isTitle && ReadBookConfig.titleMode == 1) + (visibleWidth - layout.getLineWidth(lineIndex)) / 2 + else 0f + addCharsToLineLast( + textLine, + words.toStringArray(), + textPaint, + x + ) + } else { + //中间行 + textLine.text = words + addCharsToLineMiddle( + textLine, + words.toStringArray(), + textPaint, + desiredWidth, + 0f + ) + } + if (durY + textPaint.textHeight > visibleHeight) { + //当前页面结束,设置各种值 + textPages.last().text = stringBuilder.toString() + pageLines.add(textPages.last().textLines.size) + pageLengths.add(textPages.last().text.length) + textPages.last().height = durY + //新建页面 + textPages.add(TextPage()) + stringBuilder.clear() + durY = 0f + } + stringBuilder.append(words) + if (isLastLine) stringBuilder.append("\n") + textPages.last().textLines.add(textLine) + textLine.upTopBottom(durY, textPaint) + durY += textPaint.textHeight * lineSpacingExtra / 10f + textPages.last().height = durY + } + if (isTitle) durY += titleBottomSpacing + durY += textPaint.textHeight * paragraphSpacing / 10f + return durY + } + + /** + * 有缩进,两端对齐 + */ + private fun addCharsToLineFirst( + textLine: TextLine, + words: Array, + textPaint: TextPaint, + desiredWidth: Float, + ) { + var x = 0f + if (!ReadBookConfig.textFullJustify) { + addCharsToLineLast( + textLine, + words, + textPaint, + x + ) + return + } + val bodyIndent = ReadBookConfig.paragraphIndent + val icw = StaticLayout.getDesiredWidth(bodyIndent, textPaint) / bodyIndent.length + bodyIndent.toStringArray().forEach { + val x1 = x + icw + textLine.addTextChar( + charData = it, + start = paddingLeft + x, + end = paddingLeft + x1 + ) + x = x1 + } + val words1 = words.copyOfRange(bodyIndent.length, words.size) + addCharsToLineMiddle( + textLine, + words1, + textPaint, + desiredWidth, + x + ) + } + + /** + * 无缩进,两端对齐 + */ + private fun addCharsToLineMiddle( + textLine: TextLine, + words: Array, + textPaint: TextPaint, + desiredWidth: Float, + startX: Float, + ) { + if (!ReadBookConfig.textFullJustify) { + addCharsToLineLast( + textLine, + words, + textPaint, + startX + ) + return + } + val gapCount: Int = words.lastIndex + val d = (visibleWidth - desiredWidth) / gapCount + var x = startX + words.forEachIndexed { index, s -> + val cw = StaticLayout.getDesiredWidth(s, textPaint) + val x1 = if (index != words.lastIndex) (x + cw + d) else (x + cw) + textLine.addTextChar( + charData = s, + start = paddingLeft + x, + end = paddingLeft + x1 + ) + x = x1 + } + exceed( + textLine, + words + ) + } + + /** + * 最后一行,自然排列 + */ + private fun addCharsToLineLast( + textLine: TextLine, + words: Array, + textPaint: TextPaint, + startX: Float, + ) { + var x = startX + words.forEach { + val cw = StaticLayout.getDesiredWidth(it, textPaint) + val x1 = x + cw + textLine.addTextChar( + charData = it, + start = paddingLeft + x, + end = paddingLeft + x1 + ) + x = x1 + } + exceed( + textLine, + words + ) + } + + /** + * 超出边界处理 + */ + private fun exceed(textLine: TextLine, words: Array) { + val endX = textLine.textChars.last().end + if (endX > visibleRight) { + val cc = (endX - visibleRight) / words.size + for (i in 0..words.lastIndex) { + textLine.getTextCharReverseAt(i).let { + val py = cc * (words.size - i) + it.start = it.start - py + it.end = it.end - py + } + } + } + } + + /** + * 更新样式 + */ + fun upStyle() { + typeface = try { + val fontPath = ReadBookConfig.textFont + when { + fontPath.isContentPath() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { + val fd = App.INSTANCE.contentResolver + .openFileDescriptor(Uri.parse(fontPath), "r")!! + .fileDescriptor + Typeface.Builder(fd).build() + } + fontPath.isContentPath() -> { + Typeface.createFromFile(RealPathUtil.getPath(App.INSTANCE, Uri.parse(fontPath))) + } + fontPath.isNotEmpty() -> Typeface.createFromFile(fontPath) + else -> when (AppConfig.systemTypefaces) { + 1 -> Typeface.SERIF + 2 -> Typeface.MONOSPACE + else -> Typeface.SANS_SERIF + } + } + } catch (e: Exception) { + ReadBookConfig.textFont = "" + ReadBookConfig.save() + Typeface.SANS_SERIF + } + // 字体统一处理 + val bold = Typeface.create(typeface, Typeface.BOLD) + val normal = Typeface.create(typeface, Typeface.NORMAL) + val (titleFont, textFont) = when (ReadBookConfig.textBold) { + 1 -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) + Pair(Typeface.create(typeface, 900, false), bold) + else + Pair(bold, bold) + } + 2 -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) + Pair(normal, Typeface.create(typeface, 300, false)) + else + Pair(normal, normal) + } + else -> Pair(bold, normal) + } + + //标题 + titlePaint = TextPaint() + titlePaint.color = ReadBookConfig.textColor + titlePaint.letterSpacing = ReadBookConfig.letterSpacing + titlePaint.typeface = titleFont + titlePaint.textSize = with(ReadBookConfig) { textSize + titleSize }.sp.toFloat() + titlePaint.isAntiAlias = true + //正文 + contentPaint = TextPaint() + contentPaint.color = ReadBookConfig.textColor + contentPaint.letterSpacing = ReadBookConfig.letterSpacing + contentPaint.typeface = textFont + contentPaint.textSize = ReadBookConfig.textSize.sp.toFloat() + contentPaint.isAntiAlias = true + //间距 + lineSpacingExtra = ReadBookConfig.lineSpacingExtra + paragraphSpacing = ReadBookConfig.paragraphSpacing + titleTopSpacing = ReadBookConfig.titleTopSpacing.dp + titleBottomSpacing = ReadBookConfig.titleBottomSpacing.dp + upVisibleSize() + } + + /** + * 更新View尺寸 + */ + fun upViewSize(width: Int, height: Int) { + if (width > 0 && height > 0) { + viewWidth = width + viewHeight = height + upVisibleSize() + } + } + + /** + * 更新绘制尺寸 + */ + private fun upVisibleSize() { + if (viewWidth > 0 && viewHeight > 0) { + paddingLeft = ReadBookConfig.paddingLeft.dp + paddingTop = ReadBookConfig.paddingTop.dp + visibleWidth = viewWidth - paddingLeft - ReadBookConfig.paddingRight.dp + visibleHeight = viewHeight - paddingTop - ReadBookConfig.paddingBottom.dp + visibleRight = paddingLeft + visibleWidth + visibleBottom = paddingTop + visibleHeight + } + } + + val TextPaint.textHeight: Float + get() = fontMetrics.descent - fontMetrics.ascent + fontMetrics.leading +} diff --git a/app/src/main/java/com/novel/read/ui/read/provider/ImageProvider.kt b/app/src/main/java/com/novel/read/ui/read/provider/ImageProvider.kt new file mode 100644 index 0000000..718c08a --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/read/provider/ImageProvider.kt @@ -0,0 +1,84 @@ +package io.legado.app.ui.book.read.page.provider + +import android.graphics.Bitmap +import com.novel.read.data.db.entity.Book +import com.novel.read.help.BookHelp +import com.novel.read.utils.BitmapUtils +import kotlinx.coroutines.runBlocking +import java.util.concurrent.ConcurrentHashMap + +object ImageProvider { + + private val cache = ConcurrentHashMap>() + + @Synchronized + fun getCache(chapterIndex: Int, src: String): Bitmap? { + return cache[chapterIndex]?.get(src) + } + + @Synchronized + fun setCache(chapterIndex: Int, src: String, bitmap: Bitmap) { + var indexCache = cache[chapterIndex] + if (indexCache == null) { + indexCache = ConcurrentHashMap() + cache[chapterIndex] = indexCache + } + indexCache[src] = bitmap + } + + fun getImage(book: Book, chapterIndex: Int, src: String, onUi: Boolean = false): Bitmap? { + getCache(chapterIndex, src)?.let { + return it + } + val vFile = BookHelp.getImage(book, src) + if (!vFile.exists()) { + //todo epub +// if (book.isEpub()) { +// EPUBFile.getImage(book, src)?.use { input -> +// val newFile = FileUtils.createFileIfNotExist(vFile.absolutePath) +// FileOutputStream(newFile).use { output -> +// input.copyTo(output) +// } +// } +// } else + + if (!onUi) { + runBlocking { + BookHelp.saveImage(book, src) + } + } + } + return try { + val bitmap = BitmapUtils.decodeBitmap( + vFile.absolutePath, + ChapterProvider.visibleWidth, + ChapterProvider.visibleHeight + ) + setCache(chapterIndex, src, bitmap) + bitmap + } catch (e: Exception) { + null + } + } + + fun clearAllCache() { + cache.forEach { indexCache -> + indexCache.value.forEach { + it.value.recycle() + } + } + cache.clear() + } + + fun clearOut(chapterIndex: Int) { + cache.forEach { indexCache -> + if (indexCache.key !in chapterIndex - 1..chapterIndex + 1) { + indexCache.value.forEach { + it.value.recycle() + } + cache.remove(indexCache.key) + } + } + } + +} diff --git a/app/src/main/java/com/novel/read/ui/record/ReadRecordActivity.kt b/app/src/main/java/com/novel/read/ui/record/ReadRecordActivity.kt new file mode 100644 index 0000000..9fa8000 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/record/ReadRecordActivity.kt @@ -0,0 +1,69 @@ +package com.novel.read.ui.record + +import android.os.Bundle +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BaseActivity +import com.novel.read.data.db.entity.ReadRecord +import kotlinx.android.synthetic.main.activity_read_record.* +import kotlinx.android.synthetic.main.item_book_common.view.tv_book_name +import kotlinx.android.synthetic.main.item_read_record.view.* + +class ReadRecordActivity : BaseActivity(R.layout.activity_read_record) { + lateinit var adapter: RecordAdapter + private var sortMode = 0 + override fun onActivityCreated(savedInstanceState: Bundle?) { + initView() + initData() + } + + private fun initData() { + val readRecords = App.db.getReadRecordDao().getAll() + adapter.setList(readRecords) + } + + private fun initView() { + adapter = RecordAdapter() + recycler_view.adapter = adapter + } + + + inner class RecordAdapter : + BaseQuickAdapter(R.layout.item_read_record) { + override fun convert(holder: BaseViewHolder, item: ReadRecord) { + holder.itemView.run { + tv_book_name.text = item.bookName + tv_read_time.text = formatDuring(item.readTime) + } + } + +// private fun sureDelAlert(item: ReadRecord) { +// alert(R.string.delete) { +// setMessage(getString(R.string.sure_del_any, item.bookName)) +// okButton { +// App.db.getReadRecordDao().delete(item) +// initData() +// } +// noButton() +// }.show() +// } + + private fun formatDuring(mss: Long): String { + val days = mss / (1000 * 60 * 60 * 24) + val hours = mss % (1000 * 60 * 60 * 24) / (1000 * 60 * 60) + val minutes = mss % (1000 * 60 * 60) / (1000 * 60) + val seconds = mss % (1000 * 60) / 1000 + val d = if (days > 0) "${days}天" else "" + val h = if (hours > 0) "${hours}小时" else "" + val m = if (minutes > 0) "${minutes}分钟" else "" + val s = if (seconds > 0) "${seconds}秒" else "" + var time = "$d$h$m$s" + if (time.isBlank()) { + time = "0秒" + } + return time + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/search/HistoryAdapter.kt b/app/src/main/java/com/novel/read/ui/search/HistoryAdapter.kt new file mode 100644 index 0000000..6ef5a86 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/search/HistoryAdapter.kt @@ -0,0 +1,17 @@ +package com.novel.read.ui.search + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.db.entity.SearchHistory +import kotlinx.android.synthetic.main.item_label.view.* + +class HistoryAdapter : BaseQuickAdapter(R.layout.item_label) { + + override fun convert(holder: BaseViewHolder, item: SearchHistory) { + holder.itemView.run { + tv_label.text = item.getBKey() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/search/HotAdapter.kt b/app/src/main/java/com/novel/read/ui/search/HotAdapter.kt new file mode 100644 index 0000000..cf686f1 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/search/HotAdapter.kt @@ -0,0 +1,19 @@ +package com.novel.read.ui.search + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.constant.AppConst +import com.novel.read.utils.StringUtils +import kotlinx.android.synthetic.main.item_label.view.* + +class HotAdapter : BaseQuickAdapter(R.layout.item_label) { + + override fun convert(holder: BaseViewHolder, item: String) { + holder.itemView.run { + tv_label.text = StringUtils.convertCC(item) + tv_label.setBackgroundColor(AppConst.tagColors[holder.adapterPosition % 8]) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/search/SearchActivity.kt b/app/src/main/java/com/novel/read/ui/search/SearchActivity.kt new file mode 100644 index 0000000..dc3504f --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/search/SearchActivity.kt @@ -0,0 +1,235 @@ +package com.novel.read.ui.search + +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.KeyEvent +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.chad.library.adapter.base.listener.OnLoadMoreListener +import com.google.android.flexbox.AlignItems +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.VMBaseActivity +import com.novel.read.constant.AppConst +import com.novel.read.lib.ATH +import com.novel.read.lib.dialogs.alert +import com.novel.read.lib.dialogs.noButton +import com.novel.read.lib.dialogs.yesButton +import com.novel.read.utils.ext.applyTint +import com.novel.read.utils.ext.getViewModel +import com.novel.read.utils.ext.requestInputMethod +import kotlinx.android.synthetic.main.activity_daily.* +import kotlinx.android.synthetic.main.activity_search.* +import kotlinx.android.synthetic.main.view_search.* + +//这个页面为了赶进度写的很蠢 +class SearchActivity : VMBaseActivity(R.layout.activity_search) { + + private lateinit var mHisAdapter: HistoryAdapter + private lateinit var mHotAdapter: HotAdapter + private lateinit var mSearchAdapter: SearchAdapter + + override val viewModel: SearchViewModel + get() = getViewModel(SearchViewModel::class.java) + + override fun onActivityCreated(savedInstanceState: Bundle?) { + ATH.applyEdgeEffectColor(rlv_history) + ATH.applyEdgeEffectColor(rlv_hot) + ATH.applyEdgeEffectColor(rlv_history) + viewModel.initData() + initHotAdapter() + initHisAdapter() + initSearchAdapter() + initRecycleData() + initClick() + initLoadMore() + } + + private fun initClick() { + tv_search.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + if (s.toString().trim { it <= ' ' } == "") { + head_hot.visibility = View.VISIBLE + head_history.visibility = View.VISIBLE + rlv_hot.visibility = View.VISIBLE + rlv_history.visibility = View.VISIBLE + rlv_search.visibility=View.GONE + } else { + head_hot.visibility = View.GONE + head_history.visibility = View.GONE + rlv_hot.visibility = View.GONE + rlv_history.visibility = View.GONE + viewModel.page = 1 + viewModel.searchKey = s.toString().trim() + onRefresh() + rlv_search.visibility=View.VISIBLE + } + + } + + override fun afterTextChanged(s: Editable) { + + } + }) + + //键盘的搜索 + tv_search.setOnKeyListener { v, keyCode, event -> + //修改回车键功能 + if (keyCode == KeyEvent.KEYCODE_ENTER) { + saveKey() + return@setOnKeyListener true + } + false + } + + tv_cancel.setOnClickListener { + onBackPressed() + } + + head_history.setOnClickListener { + alert(title = "操作提示", message = "確認清空全部記錄?") { + yesButton { + App.db.getSearchDao().deleteAll() + viewModel.getHisKey() + } + noButton { + + } + }.show().applyTint().requestInputMethod() + } + } + + private fun initRecycleData() { + viewModel.run { + hisKey.observe(this@SearchActivity) { + mHisAdapter.setList(it) + } + hotKey.observe(this@SearchActivity) { + if (it.searchTermsList.size > 8) { + mHotAdapter.setList(it.searchTermsList.subList(0, 7)) + } else { + mHotAdapter.setList(it.searchTermsList) + } + } + searchList.observe(this@SearchActivity) { + mSearchAdapter.setList(it) + } + pageStatus.observe(this@SearchActivity) { + when (it) { + AppConst.loading -> { + mSearchAdapter.isUseEmpty = true + } + AppConst.complete -> { + mSearchAdapter.isUseEmpty = false + } + AppConst.loadMore -> { + mSearchAdapter.loadMoreModule.isEnableLoadMore = true + } + AppConst.loadComplete -> { + mSearchAdapter.loadMoreModule.loadMoreComplete() + } + AppConst.noMore -> { + mSearchAdapter.loadMoreModule.loadMoreEnd() + } + AppConst.loadMoreFail -> { + mSearchAdapter.loadMoreModule.loadMoreFail() + } + else -> { + mSearchAdapter.setList(null) + mSearchAdapter.setEmptyView(getErrorView()) + mSearchAdapter.isUseEmpty = true + } + } + } + } + } + + private fun initSearchAdapter() { + rlv_search.layoutManager = LinearLayoutManager(this) + mSearchAdapter = SearchAdapter() + rlv_search.adapter = mSearchAdapter + + mSearchAdapter.setOnItemChildClickListener { adapter, view, position -> + tv_search.setText(viewModel.mList[position].getBBookName()) + saveKey() + } + } + + private fun initHisAdapter() { + val manager2 = FlexboxLayoutManager(this) + //设置主轴排列方式 + manager2.flexDirection = FlexDirection.ROW + //设置是否换行 + manager2.flexWrap = FlexWrap.WRAP + manager2.alignItems = AlignItems.STRETCH + mHisAdapter = HistoryAdapter() + rlv_history.layoutManager = manager2 + rlv_history.adapter = mHisAdapter + + mHisAdapter.setOnItemClickListener { adapter, view, position -> + rlv_search.visibility = View.VISIBLE + tv_search.setText(viewModel.hisKey.value?.get(position)?.getBKey()) + saveKey() + } + } + + private fun initHotAdapter() { + val manager = FlexboxLayoutManager(this) + //设置主轴排列方式 + manager.flexDirection = FlexDirection.ROW + //设置是否换行 + manager.flexWrap = FlexWrap.WRAP + manager.alignItems = AlignItems.STRETCH + rlv_hot.layoutManager = manager + mHotAdapter = HotAdapter() + rlv_hot.adapter = mHotAdapter + mHotAdapter.setOnItemClickListener { adapter, view, position -> + rlv_search.visibility = View.VISIBLE + tv_search.setText(mHotAdapter.data[position]) + saveKey() + } + } + + private fun initLoadMore() { + mSearchAdapter.loadMoreModule.setOnLoadMoreListener(object : OnLoadMoreListener { + override fun onLoadMore() { + if (viewModel.pageStatus.value == AppConst.loadMore) { + return + } + viewModel.loadMore() + } + }) + mSearchAdapter.loadMoreModule.isAutoLoadMore = true + mSearchAdapter.loadMoreModule.isEnableLoadMoreIfNotFullPage = false + } + + private fun saveKey() { + val key = tv_search.text.toString().trim { it <= ' ' } + viewModel.saveKey(key) + } + + private fun onRefresh() { + mSearchAdapter.setEmptyView(R.layout.view_loading) + viewModel.searchKey = tv_search.text.toString().trim() + viewModel.searchBook() + } + + private fun getErrorView(): View { + val errorView: View = layoutInflater.inflate(R.layout.view_net_error, rlv_daily, false) + errorView.setOnClickListener { onRefresh() } + return errorView + } + + override fun onBackPressed() { + super.onBackPressed() + overridePendingTransition(R.anim.message_fade_in, R.anim.message_fade_out) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/search/SearchAdapter.kt b/app/src/main/java/com/novel/read/ui/search/SearchAdapter.kt new file mode 100644 index 0000000..6060418 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/search/SearchAdapter.kt @@ -0,0 +1,32 @@ +package com.novel.read.ui.search + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.novel.read.R +import com.novel.read.data.model.SearchResp +import com.novel.read.ui.info.BookInfoActivity +import kotlinx.android.synthetic.main.item_book_common.view.* +import kotlinx.android.synthetic.main.item_init_search.view.tv_book_name +import org.jetbrains.anko.sdk27.listeners.onClick + +class SearchAdapter : BaseQuickAdapter(R.layout.item_book_common), + LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: SearchResp) { + holder.itemView.run { + iv_cover.load(item.coverImageUrl, item.getBBookName(), item.getBAuthorName()) + tv_book_name.text = item.getBBookName() + tv_book_description.text = item.getBIntroduction() + tv_book_author.text = item.getBAuthorName() + tv_word.text = context.getString(R.string.book_word, item.wordCount / 10000) + tv_category.text = item.getBCategoryName() + onClick { + BookInfoActivity.actionBookInfo(context,item.bookId,item.bookTypeId) + } + + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/search/SearchViewModel.kt b/app/src/main/java/com/novel/read/ui/search/SearchViewModel.kt new file mode 100644 index 0000000..27bab05 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/search/SearchViewModel.kt @@ -0,0 +1,80 @@ +package com.novel.read.ui.search + +import android.app.Application +import androidx.lifecycle.MutableLiveData +import com.novel.read.App +import com.novel.read.base.BaseViewModel +import com.novel.read.constant.AppConst +import com.novel.read.data.db.entity.SearchHistory +import com.novel.read.data.model.Pagination +import com.novel.read.data.model.SearchResp +import com.novel.read.network.repository.SearchRepository + +class SearchViewModel(application: Application) : BaseViewModel(application) { + + private val searchRepository by lazy { SearchRepository() } + var searchList = MutableLiveData>() + var hotKey = MutableLiveData>() + var hisKey = MutableLiveData>() + val pageStatus = MutableLiveData() + lateinit var mList: MutableList + var searchKey: String = "" + var page: Int = 1 + var pageSize: Int = 20 + + fun initData() { + getHisKey() + getHotKey() + } + + fun searchBook() { + launch(block = { + pageStatus.value = AppConst.loading + val data = searchRepository.searchBook(page, pageSize, searchKey) + mList = data.bookList + searchList.value = mList + if (pageSize > mList.size) { + pageStatus.value = AppConst.noMore + } + pageStatus.value = AppConst.complete + }, error = { + pageStatus.value = AppConst.error + }) + } + + fun loadMore() { + launch(block = { + pageStatus.value = AppConst.loadMore + page++ + val mData = searchRepository.searchBook(page, pageSize, searchKey).bookList + mList.addAll(mData) + searchList.value = mList + pageStatus.value = AppConst.loadComplete + if (pageSize > mData.size) { + pageStatus.value = AppConst.noMore + } + }, error = { + page-- + pageStatus.value = AppConst.loadMoreFail + }) + } + + private fun getHotKey() { + launch({ + hotKey.value = searchRepository.hotKey() + }, { + }) + } + + fun getHisKey() { + hisKey.postValue(App.db.getSearchDao().getListByTime()) + } + + fun saveKey(key: String) { + val searchListTable = SearchHistory() + searchListTable.key = key + searchListTable.saveTime = System.currentTimeMillis() + App.db.getSearchDao().insert(searchListTable, key) + hisKey.postValue(App.db.getSearchDao().getListByTime()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/setting/OtherConfigFragment.kt b/app/src/main/java/com/novel/read/ui/setting/OtherConfigFragment.kt new file mode 100644 index 0000000..d293e6e --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/setting/OtherConfigFragment.kt @@ -0,0 +1,131 @@ +package com.novel.read.ui.setting + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.View +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.observe +import androidx.preference.Preference +import com.allenliu.versionchecklib.v2.AllenVersionChecker +import com.allenliu.versionchecklib.v2.builder.UIData +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BasePreferenceFragment +import com.novel.read.constant.EventBus +import com.novel.read.constant.PreferKey +import com.novel.read.data.model.AppUpdateResp +import com.novel.read.help.AppConfig +import com.novel.read.help.BookHelp +import com.novel.read.lib.ATH +import com.novel.read.lib.dialogs.alert +import com.novel.read.lib.dialogs.noButton +import com.novel.read.lib.dialogs.okButton +import com.novel.read.network.repository.HomeRepository +import com.novel.read.utils.FileUtils +import com.novel.read.utils.LanguageUtils +import com.novel.read.utils.ext.* +import com.novel.read.help.coroutine.Coroutine +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlin.coroutines.CoroutineContext + + +class OtherConfigFragment : BasePreferenceFragment(), CoroutineScope by MainScope(), + SharedPreferences.OnSharedPreferenceChangeListener { + + private val homeRepository by lazy { HomeRepository() } + var appResp = MutableLiveData() + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.pref_config_other) + findPreference("check_update")?.summary = + "${getString(R.string.version)} ${App.versionName}" + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + ATH.applyEdgeEffectColor(listView) + appResp.observe(viewLifecycleOwner) { + updateApk(it) + } + } + + override fun onPreferenceTreeClick(preference: Preference?): Boolean { + when (preference?.key) { + PreferKey.cleanCache -> clearCache() + "check_update" -> { + appUpdate() + } + } + return super.onPreferenceTreeClick(preference) + } + + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + when (key) { + PreferKey.showRss -> postEvent(EventBus.SHOW_RSS, "") + PreferKey.language -> { + val lg = sharedPreferences?.all?.get("language") + if (lg == "zh") { + AppConfig.chineseConverterType = 1 + } else if (lg == "tw") { + AppConfig.chineseConverterType = 2 + } + LanguageUtils.setConfiguration(App.INSTANCE) + postEvent(EventBus.RECREATE, "") + } + + } + } + + private fun appUpdate() { + execute { + appResp.value = homeRepository.appUpdate() + } + } + + private fun updateApk(resp: AppUpdateResp?) { + val versionBean = resp?.appEdition + if (versionBean != null) { + val builder = AllenVersionChecker + .getInstance() + .downloadOnly( + UIData.create() + .setTitle(getString(R.string.new_version, versionBean.editionCode)) + .setContent(versionBean.upgradeContent) + .setDownloadUrl(versionBean.fileUrl) + ) + builder.executeMission(activity) + } + } + + fun execute( + scope: CoroutineScope = this, + context: CoroutineContext = Dispatchers.IO, + block: suspend CoroutineScope.() -> T + ): Coroutine { + return Coroutine.async(scope, context) { block() } + } + + private fun clearCache() { + requireContext().alert( + titleResource = R.string.clear_cache, + messageResource = R.string.sure_del + ) { + okButton { + BookHelp.clearCache() + FileUtils.deleteFile(requireActivity().cacheDir.absolutePath) + toast(R.string.clear_cache_success) + } + noButton() + }.show().applyTint() + } + + override fun onDestroy() { + super.onDestroy() + preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/setting/SettingActivity.kt b/app/src/main/java/com/novel/read/ui/setting/SettingActivity.kt new file mode 100644 index 0000000..ceaefa8 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/setting/SettingActivity.kt @@ -0,0 +1,26 @@ +package com.novel.read.ui.setting + +import android.os.Bundle +import com.novel.read.R +import com.novel.read.base.BaseActivity +import com.novel.read.constant.EventBus +import com.novel.read.utils.ext.observeEvent + +class SettingActivity : BaseActivity(R.layout.activity_setting_activity) { + + override fun onActivityCreated(savedInstanceState: Bundle?) { + val fTag = "otherConfigFragment" + var configFragment = supportFragmentManager.findFragmentByTag(fTag) + if (configFragment == null) configFragment = OtherConfigFragment() + supportFragmentManager.beginTransaction() + .replace(R.id.configFrameLayout, configFragment, fTag) + .commit() + } + + override fun observeLiveBus() { + super.observeLiveBus() + observeEvent(EventBus.RECREATE) { + recreate() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/theme/ThemeActivity.kt b/app/src/main/java/com/novel/read/ui/theme/ThemeActivity.kt new file mode 100644 index 0000000..b4f601b --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/theme/ThemeActivity.kt @@ -0,0 +1,11 @@ +package com.novel.read.ui.theme + +import android.os.Bundle +import com.novel.read.R +import com.novel.read.base.BaseActivity + +class ThemeActivity : BaseActivity(R.layout.activity_theme) { + override fun onActivityCreated(savedInstanceState: Bundle?) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/welcome/WelcomeActivity.kt b/app/src/main/java/com/novel/read/ui/welcome/WelcomeActivity.kt new file mode 100644 index 0000000..15fbf71 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/welcome/WelcomeActivity.kt @@ -0,0 +1,74 @@ +package com.novel.read.ui.welcome + +import android.Manifest +import android.content.Intent +import android.os.Bundle +import com.hankcs.hanlp.HanLP +import com.permissionx.guolindev.PermissionX +import com.novel.read.R +import com.novel.read.base.BaseActivity +import com.novel.read.help.AppConfig +import com.novel.read.ui.MainActivity +import com.novel.read.ui.read.ReadBookActivity +import com.novel.read.utils.ext.getPrefBoolean +import com.novel.read.help.coroutine.Coroutine +import kotlinx.android.synthetic.main.activity_welcome.* +import org.jetbrains.anko.startActivity +import org.jetbrains.anko.toast + +class WelcomeActivity : BaseActivity(R.layout.activity_welcome) { + + private var flag = false + + override fun onActivityCreated(savedInstanceState: Bundle?) { + // 避免从桌面启动程序后,会重新实例化入口类的activity + if (intent.flags and Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT != 0) { + finish() + } else { + init() + } + } + + private fun init() { + Coroutine.async { + //初始化简繁转换引擎 + when (AppConfig.chineseConverterType) { + 1 -> HanLP.convertToSimplifiedChinese("初始化") + 2 -> HanLP.convertToTraditionalChinese("初始化") + else -> null + } + } + + PermissionX.init(this) + .permissions( + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + root_view.postDelayed({ startMainActivity() }, 2500) + } else { + toast("权限被拒绝,将导致部分功能异常,请到设置中开启相关权限") +// finish() + } + } + + tvSkip.setOnClickListener { startMainActivity() } + } + + @Synchronized + private fun startMainActivity() { + if (!flag) { + startActivity() + if (getPrefBoolean(R.string.pk_default_read)) { + startActivity() + } + finish() + } + } + + override fun onDestroy() { + flag = true + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/ATECheckBox.kt b/app/src/main/java/com/novel/read/ui/widget/ATECheckBox.kt new file mode 100644 index 0000000..46c72f4 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/ATECheckBox.kt @@ -0,0 +1,17 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatCheckBox +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.accentColor + +/** + * @author Aidan Follestad (afollestad) + */ +class ATECheckBox(context: Context, attrs: AttributeSet) : AppCompatCheckBox(context, attrs) { + + init { + ATH.setTint(this, context.accentColor) + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/ATERadioNoButton.kt b/app/src/main/java/com/novel/read/ui/widget/ATERadioNoButton.kt new file mode 100644 index 0000000..29293ac --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/ATERadioNoButton.kt @@ -0,0 +1,67 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatRadioButton +import com.novel.read.R +import com.novel.read.lib.Selector +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* + +/** + * @author Aidan Follestad (afollestad) + */ +class ATERadioNoButton(context: Context, attrs: AttributeSet) : + AppCompatRadioButton(context, attrs) { + + private val isBottomBackground: Boolean + + init { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ATERadioNoButton) + isBottomBackground = + typedArray.getBoolean(R.styleable.ATERadioNoButton_isBottomBackground, false) + typedArray.recycle() + initTheme() + } + + private fun initTheme() { + when { + isInEditMode -> Unit + isBottomBackground -> { + val isLight = ColorUtils.isColorLight(context.bottomBackground) + val textColor = context.getPrimaryTextColor(isLight) + background = Selector.shapeBuild() + .setCornerRadius(1.dp) + .setStrokeWidth(1.dp) + .setCheckedBgColor(context.accentColor) + .setCheckedStrokeColor(context.accentColor) + .setDefaultStrokeColor(textColor) + .create() + setTextColor( + Selector.colorBuild() + .setDefaultColor(textColor) + .setCheckedColor(context.getPrimaryTextColor(ColorUtils.isColorLight(context.accentColor))) + .create() + ) + } + else -> { + val textColor = context.getCompatColor(R.color.primaryText) + background = Selector.shapeBuild() + .setCornerRadius(1.dp) + .setStrokeWidth(1.dp) + .setCheckedBgColor(context.accentColor) + .setCheckedStrokeColor(context.accentColor) + .setDefaultStrokeColor(textColor) + .create() + setTextColor( + Selector.colorBuild() + .setDefaultColor(textColor) + .setCheckedColor(context.getPrimaryTextColor(ColorUtils.isColorLight(context.accentColor))) + .create() + ) + } + } + + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/ATESeekBar.kt b/app/src/main/java/com/novel/read/ui/widget/ATESeekBar.kt new file mode 100644 index 0000000..fb8c215 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/ATESeekBar.kt @@ -0,0 +1,17 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatSeekBar +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.accentColor + +/** + * @author Aidan Follestad (afollestad) + */ +class ATESeekBar(context: Context, attrs: AttributeSet) : AppCompatSeekBar(context, attrs) { + + init { + ATH.setTint(this, context.accentColor) + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/ATESwitch.kt b/app/src/main/java/com/novel/read/ui/widget/ATESwitch.kt new file mode 100644 index 0000000..bc3b228 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/ATESwitch.kt @@ -0,0 +1,21 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.SwitchCompat +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.accentColor + +/** + * @author Aidan Follestad (afollestad) + */ +class ATESwitch(context: Context, attrs: AttributeSet) : SwitchCompat(context, attrs) { + + init { + if (!isInEditMode) { + ATH.setTint(this, context.accentColor) + } + + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/AccentBgTextView.kt b/app/src/main/java/com/novel/read/ui/widget/AccentBgTextView.kt new file mode 100644 index 0000000..72439d3 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/AccentBgTextView.kt @@ -0,0 +1,48 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView +import com.novel.read.R +import com.novel.read.lib.Selector +import com.novel.read.lib.ThemeStore +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* + +class AccentBgTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatTextView(context, attrs) { + + private var radius = 0 + + init { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.AccentBgTextView) + radius = typedArray.getDimensionPixelOffset(R.styleable.AccentBgTextView_radius, radius) + typedArray.recycle() + upBackground() + setTextColor(Color.WHITE) + } + + fun setRadius(radius: Int) { + this.radius = radius.dp + upBackground() + } + + private fun upBackground() { + background = if (isInEditMode) { + Selector.shapeBuild() + .setCornerRadius(radius) + .setDefaultBgColor(context.getCompatColor(R.color.accent)) + .setPressedBgColor(ColorUtils.darkenColor(context.getCompatColor(R.color.accent))) + .create() + } else { + Selector.shapeBuild() + .setCornerRadius(radius) + .setDefaultBgColor(ThemeStore.accentColor(context)) + .setPressedBgColor(ColorUtils.darkenColor(ThemeStore.accentColor(context))) + .create() + } + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/AccentTextView.kt b/app/src/main/java/com/novel/read/ui/widget/AccentTextView.kt new file mode 100644 index 0000000..ccc72ea --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/AccentTextView.kt @@ -0,0 +1,22 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView +import com.novel.read.R +import com.novel.read.utils.ext.accentColor +import org.jetbrains.anko.textColor +import org.jetbrains.anko.textColorResource + +class AccentTextView(context: Context, attrs: AttributeSet?) : + AppCompatTextView(context, attrs) { + + init { + if (!isInEditMode) { + textColor = context.accentColor + } else { + textColorResource = R.color.accent + } + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/AutoCompleteTextView.kt b/app/src/main/java/com/novel/read/ui/widget/AutoCompleteTextView.kt new file mode 100644 index 0000000..ffa1f73 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/AutoCompleteTextView.kt @@ -0,0 +1,71 @@ +package com.novel.read.ui.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.appcompat.widget.AppCompatAutoCompleteTextView +import com.novel.read.R +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.* +import kotlinx.android.synthetic.main.item_1line_text_and_del.view.* +import org.jetbrains.anko.sdk27.listeners.onClick + +@Suppress("unused") +class AutoCompleteTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatAutoCompleteTextView(context, attrs) { + + var delCallBack: ((value: String) -> Unit)? = null + + init { + ATH.applyAccentTint(this) + } + + override fun enoughToFilter(): Boolean { + return true + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent?): Boolean { + if (event?.action == MotionEvent.ACTION_DOWN) { + showDropDown() + } + return super.onTouchEvent(event) + } + + fun setFilterValues(values: List?) { + values?.let { + setAdapter(MyAdapter(context, values)) + } + } + + fun setFilterValues(vararg value: String) { + setAdapter(MyAdapter(context, value.toMutableList())) + } + + inner class MyAdapter(context: Context, values: List) : + ArrayAdapter(context, android.R.layout.simple_dropdown_item_1line, values) { + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view = convertView ?: LayoutInflater.from(context) + .inflate(R.layout.item_1line_text_and_del, parent, false) + view.text_view.text = getItem(position) + if (delCallBack != null) view.iv_delete.visible() else view.iv_delete.gone() + view.iv_delete.onClick { + getItem(position)?.let { + remove(it) + delCallBack?.invoke(it) + showDropDown() + } + } + return view + } + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/BadgeView.kt b/app/src/main/java/com/novel/read/ui/widget/BadgeView.kt new file mode 100644 index 0000000..2ebb39e --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/BadgeView.kt @@ -0,0 +1,229 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ShapeDrawable +import android.graphics.drawable.shapes.RoundRectShape +import android.text.TextUtils +import android.util.AttributeSet +import android.util.TypedValue +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.FrameLayout.LayoutParams +import androidx.appcompat.widget.AppCompatTextView +import com.novel.read.R +import com.novel.read.utils.ext.* + + +/** + * Created by milad heydari on 5/6/2016. + */ +@Suppress("MemberVisibilityCanBePrivate", "unused") +class BadgeView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatTextView(context, attrs) { + + var isHideOnNull = true + set(hideOnNull) { + field = hideOnNull + text = text + } + private var radius: Float = 0.toFloat() + private var flatangle: Boolean + + val badgeCount: Int? + get() { + if (text == null) { + return null + } + val text = text.toString() + return try { + Integer.parseInt(text) + } catch (e: NumberFormatException) { + null + } + + } + + var badgeGravity: Int + get() { + val params = layoutParams as LayoutParams + return params.gravity + } + set(gravity) { + val params = layoutParams as LayoutParams + params.gravity = gravity + layoutParams = params + } + + val badgeMargin: IntArray + get() { + val params = layoutParams as LayoutParams + return intArrayOf( + params.leftMargin, + params.topMargin, + params.rightMargin, + params.bottomMargin + ) + } + + init { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BadgeView) + val radios = + typedArray.getDimensionPixelOffset(R.styleable.BadgeView_radius, 8) + flatangle = + typedArray.getBoolean(R.styleable.BadgeView_up_flat_angle, false) + typedArray.recycle() + + if (layoutParams !is LayoutParams) { + val layoutParams = LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + Gravity.CENTER + ) + setLayoutParams(layoutParams) + } + + // set default font + setTextColor(Color.WHITE) + //setTypeface(Typeface.DEFAULT_BOLD); + setTextSize(TypedValue.COMPLEX_UNIT_SP, 11f) + setPadding(dip2Px(5f), dip2Px(1f), dip2Px(5f), dip2Px(1f)) + radius = radios.toFloat() + + // set default background + setBackground(radius, context.accentColor) + + gravity = Gravity.CENTER + + // default values + isHideOnNull = true + setBadgeCount(0) + minWidth = dip2Px(16f) + minHeight = dip2Px(16f) + } + + fun setBackground(dipRadius: Float, badgeColor: Int) { + val radius = dip2Px(dipRadius).toFloat() + val radiusArray = + floatArrayOf(radius, radius, radius, radius, radius, radius, radius, radius) + if (flatangle) { radiusArray.fill(0f, 0, 3) } + + val roundRect = RoundRectShape(radiusArray, null, null) + val bgDrawable = ShapeDrawable(roundRect) + bgDrawable.paint.color = badgeColor + background = bgDrawable + } + + fun setBackground(badgeColor: Int) { + setBackground(radius, badgeColor) + } + + /** + * @see android.widget.TextView.setText + */ + override fun setText(text: CharSequence, type: BufferType) { + if (isHideOnNull && TextUtils.isEmpty(text)) { + gone() + } else { + visible() + } + super.setText(text, type) + } + + fun setBadgeCount(count: Int) { + text = count.toString() + if (count == 0) { + gone() + } else { + visible() + } + } + + fun setHighlight(highlight: Boolean) { + if (highlight) { + setBackground(context.accentColor) + } else { + setBackground(context.getCompatColor(R.color.darker_gray)) + } + } + + fun setBadgeMargin(dipMargin: Int) { + setBadgeMargin(dipMargin, dipMargin, dipMargin, dipMargin) + } + + fun setBadgeMargin( + leftDipMargin: Int, + topDipMargin: Int, + rightDipMargin: Int, + bottomDipMargin: Int + ) { + val params = layoutParams as LayoutParams + params.leftMargin = dip2Px(leftDipMargin.toFloat()) + params.topMargin = dip2Px(topDipMargin.toFloat()) + params.rightMargin = dip2Px(rightDipMargin.toFloat()) + params.bottomMargin = dip2Px(bottomDipMargin.toFloat()) + layoutParams = params + } + + fun incrementBadgeCount(increment: Int) { + val count = badgeCount + if (count == null) { + setBadgeCount(increment) + } else { + setBadgeCount(increment + count) + } + } + + fun decrementBadgeCount(decrement: Int) { + incrementBadgeCount(-decrement) + } + + /** + * Attach the BadgeView to the target view + * @param target the view to attach the BadgeView + */ + fun setTargetView(target: View?) { + if (parent != null) { + (parent as ViewGroup).removeView(this) + } + + if (target == null) { + return + } + + if (target.parent is FrameLayout) { + (target.parent as FrameLayout).addView(this) + + } else if (target.parent is ViewGroup) { + // use a new FrameLayout container for adding badge + val parentContainer = target.parent as ViewGroup + val groupIndex = parentContainer.indexOfChild(target) + parentContainer.removeView(target) + + val badgeContainer = FrameLayout(context) + val parentLayoutParams = target.layoutParams + + badgeContainer.layoutParams = parentLayoutParams + target.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT + ) + + parentContainer.addView(badgeContainer, groupIndex, parentLayoutParams) + badgeContainer.addView(target) + + badgeContainer.addView(this) + } + + } + + /** + * converts dip to px + */ + private fun dip2Px(dip: Float): Int { + return (dip * context.resources.displayMetrics.density + 0.5f).toInt() + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/BatteryView.kt b/app/src/main/java/com/novel/read/ui/widget/BatteryView.kt new file mode 100644 index 0000000..ba89588 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/BatteryView.kt @@ -0,0 +1,65 @@ +package com.novel.read.ui.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.graphics.Typeface +import android.util.AttributeSet +import androidx.annotation.ColorInt +import androidx.appcompat.widget.AppCompatTextView +import com.novel.read.utils.ext.dp +import java.io.File + +class BatteryView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatTextView(context, attrs) { + private val batteryPaint = Paint() + private val outFrame = Rect() + private val polar = Rect() + var isBattery = false + + init { + setPadding(4.dp, 0, 6.dp, 0) + batteryPaint.strokeWidth = 1.dp.toFloat() + batteryPaint.isAntiAlias = true + batteryPaint.color = paint.color + typeface = Typeface.createFromAsset(context.assets, "font${File.separator}number.ttf") + } + + fun setColor(@ColorInt color: Int) { + setTextColor(color) + batteryPaint.color = color + invalidate() + } + + @SuppressLint("SetTextI18n") + fun setBattery(battery: Int) { + text = "$battery" + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + if (!isBattery) return + outFrame.set( + 1.dp, + layout.getLineBaseline(0) + layout.getLineAscent(0) + 2.dp, + width - 3.dp, + layout.getLineBaseline(0) + 2.dp + ) + val dj = (outFrame.bottom - outFrame.top) / 3 + polar.set( + outFrame.right, + outFrame.top + dj, + width - 1.dp, + outFrame.bottom - dj + ) + batteryPaint.style = Paint.Style.STROKE + canvas.drawRect(outFrame, batteryPaint) + batteryPaint.style = Paint.Style.FILL + canvas.drawRect(polar, batteryPaint) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/EditText.kt b/app/src/main/java/com/novel/read/ui/widget/EditText.kt new file mode 100644 index 0000000..c61185d --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/EditText.kt @@ -0,0 +1,17 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatEditText +import com.novel.read.lib.ATH +import com.novel.read.lib.ThemeStore + + +class EditText(context: Context, attrs: AttributeSet) : AppCompatEditText(context, attrs) { + + init { + if (!isInEditMode) { + ATH.setTint(this, ThemeStore.accentColor(context)) + } + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/HeadLayout.java b/app/src/main/java/com/novel/read/ui/widget/HeadLayout.java new file mode 100644 index 0000000..1272057 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/HeadLayout.java @@ -0,0 +1,69 @@ +package com.novel.read.ui.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import com.novel.read.R; + + +public class HeadLayout extends LinearLayout { + + private TextView mTvHead; + private TextView mTvMore; + public HeadLayout(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + LayoutInflater.from(context).inflate(R.layout.widget_head, this, true); + initViews(); + initAttr(attrs); + } + + + private void initViews() { + mTvHead=findViewById(R.id.tv_head); + mTvMore = findViewById(R.id.tv_more); + } + private void initAttr(AttributeSet attrs) { + TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.HeadLayout); + boolean showHead = typedArray.getBoolean(R.styleable.HeadLayout_showHead, true); + int headText=typedArray.getResourceId(R.styleable.HeadLayout_headText,R.string.empty_info); + int headImg= typedArray.getResourceId(R.styleable.HeadLayout_headImg, R.mipmap.ic_launcher); + boolean showRight = typedArray.getBoolean(R.styleable.HeadLayout_showRightText, true); + int rightText=typedArray.getResourceId(R.styleable.HeadLayout_rightText,R.string.empty_info); + int rightImg=typedArray.getResourceId(R.styleable.HeadLayout_rightImg,R.mipmap.ic_launcher); + if (showHead){ + mTvHead.setText(headText); + Drawable drawable = ContextCompat.getDrawable(getContext(), headImg); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + mTvHead.setCompoundDrawables(drawable, null, null, null); + }else { + mTvHead.setVisibility(GONE); + } + if (showRight){ + mTvMore.setText(rightText); + if (rightImg!=R.mipmap.ic_launcher){ + Drawable drawable = ContextCompat.getDrawable(getContext(), rightImg); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + mTvHead.setCompoundDrawables(null, null, drawable, null); + } + }else { + mTvMore.setVisibility(GONE); + } + + typedArray.recycle(); + } + + //设置点击右边文字的监听 + public void setRightTextClickListener(OnClickListener listener) { + mTvMore.setOnClickListener(listener); + } + + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/InertiaScrollTextView.kt b/app/src/main/java/com/novel/read/ui/widget/InertiaScrollTextView.kt new file mode 100644 index 0000000..6cd9909 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/InertiaScrollTextView.kt @@ -0,0 +1,228 @@ +package com.novel.read.ui.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.VelocityTracker +import android.view.ViewConfiguration +import android.view.animation.Interpolator +import android.widget.OverScroller +import androidx.appcompat.widget.AppCompatTextView +import androidx.core.view.ViewCompat +import kotlin.math.abs +import kotlin.math.max +import kotlin.math.min + + +@Suppress("unused") +open class InertiaScrollTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatTextView(context, attrs) { + + private val scrollStateIdle = 0 + private val scrollStateDragging = 1 + val scrollStateSettling = 2 + + private val mViewFling: ViewFling by lazy { ViewFling() } + private var velocityTracker: VelocityTracker? = null + private var mScrollState = scrollStateIdle + private var mLastTouchY: Int = 0 + private var mTouchSlop: Int = 0 + private var mMinFlingVelocity: Int = 0 + private var mMaxFlingVelocity: Int = 0 + + //滑动距离的最大边界 + private var mOffsetHeight: Int = 0 + + //f(x) = (x-1)^5 + 1 + private val sQuinticInterpolator = Interpolator { + var t = it + t -= 1.0f + t * t * t * t * t + 1.0f + } + + init { + val vc = ViewConfiguration.get(context) + mTouchSlop = vc.scaledTouchSlop + mMinFlingVelocity = vc.scaledMinimumFlingVelocity + mMaxFlingVelocity = vc.scaledMaximumFlingVelocity + } + + fun atTop(): Boolean { + return scrollY <= 0 + } + + fun atBottom(): Boolean { + return scrollY >= mOffsetHeight + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + initOffsetHeight() + } + + override fun onTextChanged( + text: CharSequence?, + start: Int, + lengthBefore: Int, + lengthAfter: Int + ) { + super.onTextChanged(text, start, lengthBefore, lengthAfter) + initOffsetHeight() + } + + private fun initOffsetHeight() { + val mLayoutHeight: Int + + //获得内容面板 + val mLayout = layout ?: return + //获得内容面板的高度 + mLayoutHeight = mLayout.height + + //计算滑动距离的边界 + mOffsetHeight = mLayoutHeight + totalPaddingTop + totalPaddingBottom - measuredHeight + } + + override fun scrollTo(x: Int, y: Int) { + super.scrollTo(x, min(y, mOffsetHeight)) + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent?): Boolean { + event?.let { + if (velocityTracker == null) { + velocityTracker = VelocityTracker.obtain() + } + velocityTracker?.addMovement(it) + when (event.action) { + MotionEvent.ACTION_DOWN -> { + setScrollState(scrollStateIdle) + mLastTouchY = (event.y + 0.5f).toInt() + } + MotionEvent.ACTION_MOVE -> { + val y = (event.y + 0.5f).toInt() + var dy = mLastTouchY - y + if (mScrollState != scrollStateDragging) { + var startScroll = false + + if (abs(dy) > mTouchSlop) { + if (dy > 0) { + dy -= mTouchSlop + } else { + dy += mTouchSlop + } + startScroll = true + } + if (startScroll) { + setScrollState(scrollStateDragging) + } + } + if (mScrollState == scrollStateDragging) { + mLastTouchY = y + } + } + MotionEvent.ACTION_UP -> { + velocityTracker?.computeCurrentVelocity(1000, mMaxFlingVelocity.toFloat()) + val yVelocity = velocityTracker?.yVelocity ?: 0f + if (abs(yVelocity) > mMinFlingVelocity) { + mViewFling.fling(-yVelocity.toInt()) + } else { + setScrollState(scrollStateIdle) + } + resetTouch() + } + MotionEvent.ACTION_CANCEL -> { + resetTouch() + } + } + } + return super.onTouchEvent(event) + } + + private fun resetTouch() { + velocityTracker?.clear() + } + + private fun setScrollState(state: Int) { + if (state == mScrollState) { + return + } + mScrollState = state + if (state != scrollStateSettling) { + mViewFling.stop() + } + } + + /** + * 惯性滚动 + */ + private inner class ViewFling : Runnable { + + private var mLastFlingY = 0 + private val mScroller: OverScroller = OverScroller(context, sQuinticInterpolator) + private var mEatRunOnAnimationRequest = false + private var mReSchedulePostAnimationCallback = false + + override fun run() { + disableRunOnAnimationRequests() + val scroller = mScroller + if (scroller.computeScrollOffset()) { + val y = scroller.currY + val dy = y - mLastFlingY + mLastFlingY = y + if (dy < 0 && scrollY > 0) { + scrollBy(0, max(dy, -scrollY)) + } else if (dy > 0 && scrollY < mOffsetHeight) { + scrollBy(0, min(dy, mOffsetHeight - scrollY)) + } + postOnAnimation() + } + enableRunOnAnimationRequests() + } + + fun fling(velocityY: Int) { + mLastFlingY = 0 + setScrollState(scrollStateSettling) + mScroller.fling( + 0, + 0, + 0, + velocityY, + Integer.MIN_VALUE, + Integer.MAX_VALUE, + Integer.MIN_VALUE, + Integer.MAX_VALUE + ) + postOnAnimation() + } + + fun stop() { + removeCallbacks(this) + mScroller.abortAnimation() + } + + private fun disableRunOnAnimationRequests() { + mReSchedulePostAnimationCallback = false + mEatRunOnAnimationRequest = true + } + + private fun enableRunOnAnimationRequests() { + mEatRunOnAnimationRequest = false + if (mReSchedulePostAnimationCallback) { + postOnAnimation() + } + } + + fun postOnAnimation() { + if (mEatRunOnAnimationRequest) { + mReSchedulePostAnimationCallback = true + } else { + removeCallbacks(this) + ViewCompat.postOnAnimation(this@InertiaScrollTextView, this) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/RefreshProgressBar.kt b/app/src/main/java/com/novel/read/ui/widget/RefreshProgressBar.kt new file mode 100644 index 0000000..06f0e38 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/RefreshProgressBar.kt @@ -0,0 +1,197 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.graphics.RectF +import android.os.Looper +import android.util.AttributeSet +import android.view.View +import com.novel.read.R + +@Suppress("unused", "MemberVisibilityCanBePrivate") +class RefreshProgressBar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : View(context, attrs) { + private var a = 1 + private var durProgress = 0 + private var secondDurProgress = 0 + var maxProgress = 100 + var secondMaxProgress = 100 + var bgColor = 0x00000000 + var secondColor = -0x3e3e3f + var fontColor = -0xc9c9ca + var speed = 2 + var secondFinalProgress = 0 + private set + private var paint: Paint = Paint() + private val bgRect = Rect() + private val secondRect = Rect() + private val fontRectF = RectF() + + var isAutoLoading: Boolean = false + set(loading) { + field = loading + if (!loading) { + secondDurProgress = 0 + secondFinalProgress = 0 + } + maxProgress = 0 + + invalidate() + } + + init { + paint.style = Paint.Style.FILL + + val a = context.obtainStyledAttributes(attrs, R.styleable.RefreshProgressBar) + speed = a.getDimensionPixelSize(R.styleable.RefreshProgressBar_speed, speed) + maxProgress = a.getInt(R.styleable.RefreshProgressBar_max_progress, maxProgress) + durProgress = a.getInt(R.styleable.RefreshProgressBar_dur_progress, durProgress) + secondDurProgress = a.getDimensionPixelSize( + R.styleable.RefreshProgressBar_second_dur_progress, + secondDurProgress + ) + secondFinalProgress = secondDurProgress + secondMaxProgress = a.getDimensionPixelSize( + R.styleable.RefreshProgressBar_second_max_progress, + secondMaxProgress + ) + bgColor = a.getColor(R.styleable.RefreshProgressBar_bg_color, bgColor) + secondColor = a.getColor(R.styleable.RefreshProgressBar_second_color, secondColor) + fontColor = a.getColor(R.styleable.RefreshProgressBar_font_color, fontColor) + a.recycle() + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + paint.color = bgColor + bgRect.set(0, 0, measuredWidth, measuredHeight) + canvas.drawRect(bgRect, paint) + + if (secondDurProgress > 0 && secondMaxProgress > 0) { + var secondDur = secondDurProgress + if (secondDur < 0) { + secondDur = 0 + } + if (secondDur > secondMaxProgress) { + secondDur = secondMaxProgress + } + paint.color = secondColor + val tempW = + (measuredWidth.toFloat() * 1.0f * (secondDur * 1.0f / secondMaxProgress)).toInt() + secondRect.set( + measuredWidth / 2 - tempW / 2, + 0, + measuredWidth / 2 + tempW / 2, + measuredHeight + ) + canvas.drawRect(secondRect, paint) + } + + if (durProgress > 0 && maxProgress > 0) { + paint.color = fontColor + fontRectF.set( + 0f, + 0f, + measuredWidth.toFloat() * 1.0f * (durProgress * 1.0f / maxProgress), + measuredHeight.toFloat() + ) + canvas.drawRect(fontRectF, paint) + } + + if (this.isAutoLoading) { + if (secondDurProgress >= secondMaxProgress) { + a = -1 + } else if (secondDurProgress <= 0) { + a = 1 + } + secondDurProgress += a * speed + if (secondDurProgress < 0) + secondDurProgress = 0 + else if (secondDurProgress > secondMaxProgress) + secondDurProgress = secondMaxProgress + secondFinalProgress = secondDurProgress + invalidate() + } else { + if (secondDurProgress != secondFinalProgress) { + if (secondDurProgress > secondFinalProgress) { + secondDurProgress -= speed + if (secondDurProgress < secondFinalProgress) { + secondDurProgress = secondFinalProgress + } + } else { + secondDurProgress += speed + if (secondDurProgress > secondFinalProgress) { + secondDurProgress = secondFinalProgress + } + } + this.invalidate() + } + } + } + + fun getDurProgress(): Int { + return durProgress + } + + fun setDurProgress(durProgress: Int) { + var durProgress1 = durProgress + if (durProgress1 < 0) { + durProgress1 = 0 + } + if (durProgress1 > maxProgress) { + durProgress1 = maxProgress + } + this.durProgress = durProgress1 + if (Looper.myLooper() == Looper.getMainLooper()) { + this.invalidate() + } else { + this.postInvalidate() + } + } + + fun getSecondDurProgress(): Int { + return secondDurProgress + } + + fun setSecondDurProgress(secondDur: Int) { + this.secondDurProgress = secondDur + this.secondFinalProgress = secondDurProgress + if (Looper.myLooper() == Looper.getMainLooper()) { + this.invalidate() + } else { + this.postInvalidate() + } + } + + fun setSecondDurProgressWithAnim(secondDur: Int) { + var secondDur1 = secondDur + if (secondDur1 < 0) { + secondDur1 = 0 + } + if (secondDur1 > secondMaxProgress) { + secondDur1 = secondMaxProgress + } + this.secondFinalProgress = secondDur1 + if (Looper.myLooper() == Looper.getMainLooper()) { + this.invalidate() + } else { + this.postInvalidate() + } + } + + fun clean() { + durProgress = 0 + secondDurProgress = 0 + secondFinalProgress = 0 + if (Looper.myLooper() == Looper.getMainLooper()) { + this.invalidate() + } else { + this.postInvalidate() + } + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/SearchView.kt b/app/src/main/java/com/novel/read/ui/widget/SearchView.kt new file mode 100644 index 0000000..958b1c1 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/SearchView.kt @@ -0,0 +1,104 @@ +package com.novel.read.ui.widget + +import android.annotation.SuppressLint +import android.app.SearchableInfo +import android.content.Context +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.drawable.Drawable +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.style.ImageSpan +import android.util.AttributeSet +import android.util.TypedValue +import android.view.Gravity +import android.widget.TextView +import androidx.appcompat.widget.SearchView +import com.novel.read.R + +class SearchView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : SearchView(context, attrs) { + private var mSearchHintIcon: Drawable? = null + private var textView: TextView? = null + + @SuppressLint("UseCompatLoadingForDrawables") + override fun onLayout( + changed: Boolean, + left: Int, + top: Int, + right: Int, + bottom: Int + ) { + super.onLayout(changed, left, top, right, bottom) + try { + if (textView == null) { + textView = findViewById(androidx.appcompat.R.id.search_src_text) + mSearchHintIcon = this.context.getDrawable(R.drawable.ic_search_hint) + updateQueryHint() + } + // 改变字体 + textView!!.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) + textView!!.gravity = Gravity.CENTER_VERTICAL + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun getDecoratedHint(hintText: CharSequence): CharSequence { + // If the field is always expanded or we don't have a search hint icon, + // then don't add the search icon to the hint. + if (mSearchHintIcon == null) { + return hintText + } + val textSize = (textView!!.textSize * 0.8).toInt() + mSearchHintIcon!!.setBounds(0, 0, textSize, textSize) + val ssb = SpannableStringBuilder(" ") + ssb.setSpan(CenteredImageSpan(mSearchHintIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + ssb.append(hintText) + return ssb + } + + private fun updateQueryHint() { + textView?.let { + it.hint = getDecoratedHint(queryHint ?: "") + } + } + + override fun setIconifiedByDefault(iconified: Boolean) { + super.setIconifiedByDefault(iconified) + updateQueryHint() + } + + override fun setSearchableInfo(searchable: SearchableInfo?) { + super.setSearchableInfo(searchable) + searchable?.let { + updateQueryHint() + } + } + + override fun setQueryHint(hint: CharSequence?) { + super.setQueryHint(hint) + updateQueryHint() + } + + internal class CenteredImageSpan(drawable: Drawable?) : ImageSpan(drawable!!) { + override fun draw( + canvas: Canvas, text: CharSequence, + start: Int, end: Int, x: Float, + top: Int, y: Int, bottom: Int, paint: Paint + ) { + // image to draw + val b = drawable + // font metrics of text to be replaced + val fm = paint.fontMetricsInt + val transY = ((y + fm.descent + y + fm.ascent) / 2 + - b.bounds.bottom / 2) + canvas.save() + canvas.translate(x, transY.toFloat()) + b.draw(canvas) + canvas.restore() + } + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/SmoothCheckBox.kt b/app/src/main/java/com/novel/read/ui/widget/SmoothCheckBox.kt new file mode 100644 index 0000000..823cda3 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/SmoothCheckBox.kt @@ -0,0 +1,326 @@ +package com.novel.read.ui.widget + +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.View +import android.view.animation.LinearInterpolator +import android.widget.Checkable +import com.novel.read.R +import com.novel.read.lib.ThemeStore +import com.novel.read.utils.ext.dp +import com.novel.read.utils.ext.getCompatColor +import kotlin.math.min +import kotlin.math.pow +import kotlin.math.roundToInt +import kotlin.math.sqrt + +class SmoothCheckBox @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : View(context, attrs), Checkable { + private var mPaint: Paint + private var mTickPaint: Paint + private var mFloorPaint: Paint + private var mTickPoints: Array + private var mCenterPoint: Point + private var mTickPath: Path + private var mLeftLineDistance = 0f + private var mRightLineDistance = 0f + private var mDrewDistance = 0f + private var mScaleVal = 1.0f + private var mFloorScale = 1.0f + private var mWidth = 0 + private var mAnimDuration = 0 + private var mStrokeWidth = 0 + private var mCheckedColor = 0 + private var mUnCheckedColor = 0 + private var mFloorColor = 0 + private var mFloorUnCheckedColor = 0 + private var mChecked = false + private var mTickDrawing = false + var onCheckedChangeListener: ((checkBox: SmoothCheckBox, isChecked: Boolean) -> Unit)? = null + + init { + val ta = context.obtainStyledAttributes(attrs, R.styleable.SmoothCheckBox) + var tickColor = ThemeStore.accentColor(context) + mCheckedColor = context.getCompatColor(R.color.background_menu) + mUnCheckedColor = context.getCompatColor(R.color.background_menu) + mFloorColor = context.getCompatColor(R.color.transparent30) + tickColor = ta.getColor(R.styleable.SmoothCheckBox_color_tick, tickColor) + mAnimDuration = ta.getInt(R.styleable.SmoothCheckBox_duration, DEF_ANIM_DURATION) + mFloorColor = ta.getColor(R.styleable.SmoothCheckBox_color_unchecked_stroke, mFloorColor) + mCheckedColor = ta.getColor(R.styleable.SmoothCheckBox_color_checked, mCheckedColor) + mUnCheckedColor = ta.getColor(R.styleable.SmoothCheckBox_color_unchecked, mUnCheckedColor) + mStrokeWidth = ta.getDimensionPixelSize(R.styleable.SmoothCheckBox_stroke_width, 0) + ta.recycle() + mFloorUnCheckedColor = mFloorColor + mTickPaint = Paint(Paint.ANTI_ALIAS_FLAG) + mTickPaint.style = Paint.Style.STROKE + mTickPaint.strokeCap = Paint.Cap.ROUND + mTickPaint.color = tickColor + mFloorPaint = Paint(Paint.ANTI_ALIAS_FLAG) + mFloorPaint.style = Paint.Style.FILL + mFloorPaint.color = mFloorColor + mPaint = Paint(Paint.ANTI_ALIAS_FLAG) + mPaint.style = Paint.Style.FILL + mPaint.color = mCheckedColor + mTickPath = Path() + mCenterPoint = Point() + mTickPoints = arrayOf(Point(), Point(), Point()) + setOnClickListener { + toggle() + mTickDrawing = false + mDrewDistance = 0f + if (isChecked) { + startCheckedAnimation() + } else { + startUnCheckedAnimation() + } + } + } + + override fun isChecked(): Boolean { + return mChecked + } + + override fun setChecked(checked: Boolean) { + mChecked = checked + reset() + invalidate() + onCheckedChangeListener?.invoke(this@SmoothCheckBox, mChecked) + } + + override fun toggle() { + this.isChecked = !isChecked + } + + /** + * checked with animation + * + * @param checked checked + * @param animate change with animation + */ + fun setChecked(checked: Boolean, animate: Boolean) { + if (animate) { + mTickDrawing = false + mChecked = checked + mDrewDistance = 0f + if (checked) { + startCheckedAnimation() + } else { + startUnCheckedAnimation() + } + onCheckedChangeListener?.invoke(this@SmoothCheckBox, mChecked) + } else { + this.isChecked = checked + } + } + + private fun reset() { + mTickDrawing = true + mFloorScale = 1.0f + mScaleVal = if (isChecked) 0f else 1.0f + mFloorColor = if (isChecked) mCheckedColor else mFloorUnCheckedColor + mDrewDistance = if (isChecked) mLeftLineDistance + mRightLineDistance else 0f + } + + private fun measureSize(measureSpec: Int): Int { + val defSize: Int = DEF_DRAW_SIZE.dp + val specSize = MeasureSpec.getSize(measureSpec) + val specMode = MeasureSpec.getMode(measureSpec) + var result = 0 + when (specMode) { + MeasureSpec.UNSPECIFIED, MeasureSpec.AT_MOST -> result = min(defSize, specSize) + MeasureSpec.EXACTLY -> result = specSize + } + return result + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + setMeasuredDimension(measureSize(widthMeasureSpec), measureSize(heightMeasureSpec)) + } + + override fun onLayout( + changed: Boolean, + left: Int, + top: Int, + right: Int, + bottom: Int + ) { + mWidth = measuredWidth + mStrokeWidth = if (mStrokeWidth == 0) measuredWidth / 10 else mStrokeWidth + mStrokeWidth = + if (mStrokeWidth > measuredWidth / 5) measuredWidth / 5 else mStrokeWidth + mStrokeWidth = if (mStrokeWidth < 3) 3 else mStrokeWidth + mCenterPoint.x = mWidth / 2 + mCenterPoint.y = measuredHeight / 2 + mTickPoints[0].x = (measuredWidth.toFloat() / 30 * 7).roundToInt() + mTickPoints[0].y = (measuredHeight.toFloat() / 30 * 14).roundToInt() + mTickPoints[1].x = (measuredWidth.toFloat() / 30 * 13).roundToInt() + mTickPoints[1].y = (measuredHeight.toFloat() / 30 * 20).roundToInt() + mTickPoints[2].x = (measuredWidth.toFloat() / 30 * 22).roundToInt() + mTickPoints[2].y = (measuredHeight.toFloat() / 30 * 10).roundToInt() + mLeftLineDistance = sqrt( + (mTickPoints[1].x - mTickPoints[0].x.toDouble()).pow(2.0) + + (mTickPoints[1].y - mTickPoints[0].y.toDouble()).pow(2.0) + ).toFloat() + mRightLineDistance = sqrt( + (mTickPoints[2].x - mTickPoints[1].x.toDouble()).pow(2.0) + + (mTickPoints[2].y - mTickPoints[1].y.toDouble()).pow(2.0) + ).toFloat() + mTickPaint.strokeWidth = mStrokeWidth.toFloat() + } + + override fun onDraw(canvas: Canvas) { + drawBorder(canvas) + drawCenter(canvas) + drawTick(canvas) + } + + private fun drawCenter(canvas: Canvas) { + mPaint.color = mUnCheckedColor + val radius = (mCenterPoint.x - mStrokeWidth) * mScaleVal + canvas.drawCircle(mCenterPoint.x.toFloat(), mCenterPoint.y.toFloat(), radius, mPaint) + } + + private fun drawBorder(canvas: Canvas) { + mFloorPaint.color = mFloorColor + val radius = mCenterPoint.x + canvas.drawCircle( + mCenterPoint.x.toFloat(), + mCenterPoint.y.toFloat(), + radius * mFloorScale, + mFloorPaint + ) + } + + private fun drawTick(canvas: Canvas) { + if (mTickDrawing && isChecked) { + drawTickPath(canvas) + } + } + + private fun drawTickPath(canvas: Canvas) { + mTickPath.reset() + // draw left of the tick + if (mDrewDistance < mLeftLineDistance) { + val step: Float = if (mWidth / 20.0f < 3) 3f else mWidth / 20.0f + mDrewDistance += step + val stopX = + mTickPoints[0].x + (mTickPoints[1].x - mTickPoints[0].x) * mDrewDistance / mLeftLineDistance + val stopY = + mTickPoints[0].y + (mTickPoints[1].y - mTickPoints[0].y) * mDrewDistance / mLeftLineDistance + mTickPath.moveTo(mTickPoints[0].x.toFloat(), mTickPoints[0].y.toFloat()) + mTickPath.lineTo(stopX, stopY) + canvas.drawPath(mTickPath, mTickPaint) + if (mDrewDistance > mLeftLineDistance) { + mDrewDistance = mLeftLineDistance + } + } else { + mTickPath.moveTo(mTickPoints[0].x.toFloat(), mTickPoints[0].y.toFloat()) + mTickPath.lineTo(mTickPoints[1].x.toFloat(), mTickPoints[1].y.toFloat()) + canvas.drawPath(mTickPath, mTickPaint) + // draw right of the tick + if (mDrewDistance < mLeftLineDistance + mRightLineDistance) { + val stopX = + mTickPoints[1].x + (mTickPoints[2].x - mTickPoints[1].x) * (mDrewDistance - mLeftLineDistance) / mRightLineDistance + val stopY = + mTickPoints[1].y - (mTickPoints[1].y - mTickPoints[2].y) * (mDrewDistance - mLeftLineDistance) / mRightLineDistance + mTickPath.reset() + mTickPath.moveTo(mTickPoints[1].x.toFloat(), mTickPoints[1].y.toFloat()) + mTickPath.lineTo(stopX, stopY) + canvas.drawPath(mTickPath, mTickPaint) + val step: Float = if (mWidth / 20f < 3) 3f else mWidth / 20f + mDrewDistance += step + } else { + mTickPath.reset() + mTickPath.moveTo(mTickPoints[1].x.toFloat(), mTickPoints[1].y.toFloat()) + mTickPath.lineTo(mTickPoints[2].x.toFloat(), mTickPoints[2].y.toFloat()) + canvas.drawPath(mTickPath, mTickPaint) + } + } + // invalidate + if (mDrewDistance < mLeftLineDistance + mRightLineDistance) { + postDelayed({ this.postInvalidate() }, 10) + } + } + + private fun startCheckedAnimation() { + val animator = ValueAnimator.ofFloat(1.0f, 0f) + animator.duration = mAnimDuration / 3 * 2.toLong() + animator.interpolator = LinearInterpolator() + animator.addUpdateListener { animation: ValueAnimator -> + mScaleVal = animation.animatedValue as Float + mFloorColor = getGradientColor( + mUnCheckedColor, + mCheckedColor, + 1 - mScaleVal + ) + postInvalidate() + } + animator.start() + val floorAnimator = ValueAnimator.ofFloat(1.0f, 0.8f, 1.0f) + floorAnimator.duration = mAnimDuration.toLong() + floorAnimator.interpolator = LinearInterpolator() + floorAnimator.addUpdateListener { animation: ValueAnimator -> + mFloorScale = animation.animatedValue as Float + postInvalidate() + } + floorAnimator.start() + drawTickDelayed() + } + + private fun startUnCheckedAnimation() { + val animator = ValueAnimator.ofFloat(0f, 1.0f) + animator.duration = mAnimDuration.toLong() + animator.interpolator = LinearInterpolator() + animator.addUpdateListener { animation: ValueAnimator -> + mScaleVal = animation.animatedValue as Float + mFloorColor = getGradientColor( + mCheckedColor, + mFloorUnCheckedColor, + mScaleVal + ) + postInvalidate() + } + animator.start() + val floorAnimator = ValueAnimator.ofFloat(1.0f, 0.8f, 1.0f) + floorAnimator.duration = mAnimDuration.toLong() + floorAnimator.interpolator = LinearInterpolator() + floorAnimator.addUpdateListener { animation: ValueAnimator -> + mFloorScale = animation.animatedValue as Float + postInvalidate() + } + floorAnimator.start() + } + + private fun drawTickDelayed() { + postDelayed({ + mTickDrawing = true + postInvalidate() + }, mAnimDuration.toLong()) + } + + companion object { + private const val DEF_DRAW_SIZE = 25 + private const val DEF_ANIM_DURATION = 300 + private fun getGradientColor(startColor: Int, endColor: Int, percent: Float): Int { + val startA = Color.alpha(startColor) + val startR = Color.red(startColor) + val startG = Color.green(startColor) + val startB = Color.blue(startColor) + val endA = Color.alpha(endColor) + val endR = Color.red(endColor) + val endG = Color.green(endColor) + val endB = Color.blue(endColor) + val currentA = (startA * (1 - percent) + endA * percent).toInt() + val currentR = (startR * (1 - percent) + endR * percent).toInt() + val currentG = (startG * (1 - percent) + endG * percent).toInt() + val currentB = (startB * (1 - percent) + endB * percent).toInt() + return Color.argb(currentA, currentR, currentG, currentB) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/StrokeTextView.kt b/app/src/main/java/com/novel/read/ui/widget/StrokeTextView.kt new file mode 100644 index 0000000..9ba4f3e --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/StrokeTextView.kt @@ -0,0 +1,89 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatTextView +import com.novel.read.R +import com.novel.read.lib.Selector +import com.novel.read.lib.ThemeStore +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* + + +open class StrokeTextView(context: Context, attrs: AttributeSet?) : + AppCompatTextView(context, attrs) { + + private var radius = 1.dp + private val isBottomBackground: Boolean + + init { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.StrokeTextView) + radius = typedArray.getDimensionPixelOffset(R.styleable.StrokeTextView_radius, radius) + isBottomBackground = + typedArray.getBoolean(R.styleable.StrokeTextView_isBottomBackground, false) + typedArray.recycle() + upBackground() + } + + fun setRadius(radius: Int) { + this.radius = radius.dp + upBackground() + } + + private fun upBackground() { + when { + isInEditMode -> { + background = Selector.shapeBuild() + .setCornerRadius(radius) + .setStrokeWidth(1.dp) + .setDisabledStrokeColor(context.getCompatColor(R.color.md_grey_500)) + .setDefaultStrokeColor(context.getCompatColor(R.color.secondaryText)) + .setSelectedStrokeColor(context.getCompatColor(R.color.accent)) + .setPressedBgColor(context.getCompatColor(R.color.transparent30)) + .create() + this.setTextColor( + Selector.colorBuild() + .setDefaultColor(context.getCompatColor(R.color.secondaryText)) + .setSelectedColor(context.getCompatColor(R.color.accent)) + .setDisabledColor(context.getCompatColor(R.color.md_grey_500)) + .create() + ) + } + isBottomBackground -> { + val isLight = ColorUtils.isColorLight(context.bottomBackground) + background = Selector.shapeBuild() + .setCornerRadius(radius) + .setStrokeWidth(1.dp) + .setDisabledStrokeColor(context.getCompatColor(R.color.md_grey_500)) + .setDefaultStrokeColor(context.getPrimaryTextColor(isLight)) + .setSelectedStrokeColor(context.accentColor) + .setPressedBgColor(context.getCompatColor(R.color.transparent30)) + .create() + this.setTextColor( + Selector.colorBuild() + .setDefaultColor(context.getPrimaryTextColor(isLight)) + .setSelectedColor(context.accentColor) + .setDisabledColor(context.getCompatColor(R.color.md_grey_500)) + .create() + ) + } + else -> { + background = Selector.shapeBuild() + .setCornerRadius(radius) + .setStrokeWidth(1.dp) + .setDisabledStrokeColor(context.getCompatColor(R.color.md_grey_500)) + .setDefaultStrokeColor(ThemeStore.textColorSecondary(context)) + .setSelectedStrokeColor(ThemeStore.accentColor(context)) + .setPressedBgColor(context.getCompatColor(R.color.transparent30)) + .create() + this.setTextColor( + Selector.colorBuild() + .setDefaultColor(ThemeStore.textColorSecondary(context)) + .setSelectedColor(ThemeStore.accentColor(context)) + .setDisabledColor(context.getCompatColor(R.color.md_grey_500)) + .create() + ) + } + } + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/TitleBar.kt b/app/src/main/java/com/novel/read/ui/widget/TitleBar.kt new file mode 100644 index 0000000..36b40df --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/TitleBar.kt @@ -0,0 +1,219 @@ +package com.novel.read.ui.widget + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.os.Build +import android.util.AttributeSet +import android.view.Menu +import android.view.View +import androidx.annotation.ColorInt +import androidx.annotation.StyleRes +import androidx.appcompat.widget.Toolbar +import com.google.android.material.appbar.AppBarLayout +import com.novel.read.R +import com.novel.read.help.AppConfig +import com.novel.read.utils.ext.* +import org.jetbrains.anko.backgroundColor +import org.jetbrains.anko.bottomPadding +import org.jetbrains.anko.topPadding + +@Suppress("unused") +class TitleBar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppBarLayout(context, attrs) { + + val toolbar: Toolbar + val menu: Menu + get() = toolbar.menu + + var title: CharSequence? + get() = toolbar.title + set(title) { + toolbar.title = title + } + + var subtitle: CharSequence? + get() = toolbar.subtitle + set(subtitle) { + toolbar.subtitle = subtitle + } + + private val displayHomeAsUp: Boolean + private val navigationIconTint: ColorStateList? + private val navigationIconTintMode: Int + private val attachToActivity: Boolean + + init { + val a = context.obtainStyledAttributes( + attrs, R.styleable.TitleBar, + R.attr.titleBarStyle, 0 + ) + navigationIconTint = a.getColorStateList(R.styleable.TitleBar_navigationIconTint) + navigationIconTintMode = a.getInt(R.styleable.TitleBar_navigationIconTintMode, 9) + attachToActivity = a.getBoolean(R.styleable.TitleBar_attachToActivity, true) + displayHomeAsUp = a.getBoolean(R.styleable.TitleBar_displayHomeAsUp, true) + + val navigationIcon = a.getDrawable(R.styleable.TitleBar_navigationIcon) + val navigationContentDescription = + a.getText(R.styleable.TitleBar_navigationContentDescription) + val titleText = a.getString(R.styleable.TitleBar_title) + val subtitleText = a.getString(R.styleable.TitleBar_subtitle) + + when (a.getInt(R.styleable.TitleBar_themeMode, 0)) { + 1 -> inflate(context, R.layout.view_title_bar_dark, this) + else -> inflate(context, R.layout.view_title_bar, this) + } + toolbar = findViewById(R.id.toolbar) + + toolbar.apply { + navigationIcon?.let { + this.navigationIcon = it + this.navigationContentDescription = navigationContentDescription + } + + if (a.hasValue(R.styleable.TitleBar_titleTextAppearance)) { + this.setTitleTextAppearance( + context, + a.getResourceId(R.styleable.TitleBar_titleTextAppearance, 0) + ) + } + + if (a.hasValue(R.styleable.TitleBar_titleTextColor)) { + this.setTitleTextColor(a.getColor(R.styleable.TitleBar_titleTextColor, -0x1)) + } + + if (a.hasValue(R.styleable.TitleBar_subtitleTextAppearance)) { + this.setSubtitleTextAppearance( + context, + a.getResourceId(R.styleable.TitleBar_subtitleTextAppearance, 0) + ) + } + + if (a.hasValue(R.styleable.TitleBar_subtitleTextColor)) { + this.setSubtitleTextColor(a.getColor(R.styleable.TitleBar_subtitleTextColor, -0x1)) + } + + + if (a.hasValue(R.styleable.TitleBar_contentInsetLeft) + || a.hasValue(R.styleable.TitleBar_contentInsetRight) + ) { + this.setContentInsetsAbsolute( + a.getDimensionPixelSize(R.styleable.TitleBar_contentInsetLeft, 0), + a.getDimensionPixelSize(R.styleable.TitleBar_contentInsetRight, 0) + ) + } + + if (a.hasValue(R.styleable.TitleBar_contentInsetStart) + || a.hasValue(R.styleable.TitleBar_contentInsetEnd) + ) { + this.setContentInsetsRelative( + a.getDimensionPixelSize(R.styleable.TitleBar_contentInsetStart, 0), + a.getDimensionPixelSize(R.styleable.TitleBar_contentInsetEnd, 0) + ) + } + + if (a.hasValue(R.styleable.TitleBar_contentInsetStartWithNavigation)) { + this.contentInsetStartWithNavigation = a.getDimensionPixelOffset( + R.styleable.TitleBar_contentInsetStartWithNavigation, 0 + ) + } + + if (a.hasValue(R.styleable.TitleBar_contentInsetEndWithActions)) { + this.contentInsetEndWithActions = a.getDimensionPixelOffset( + R.styleable.TitleBar_contentInsetEndWithActions, 0 + ) + } + + if (!titleText.isNullOrBlank()) { + this.title = titleText + } + + if (!subtitleText.isNullOrBlank()) { + this.subtitle = subtitleText + } + + if (a.hasValue(R.styleable.TitleBar_contentLayout)) { + inflate(context, a.getResourceId(R.styleable.TitleBar_contentLayout, 0), this) + } + } + + if (!isInEditMode) { + if (a.getBoolean(R.styleable.TitleBar_fitStatusBar, true)) { + topPadding = context.statusBarHeight + } + + if (a.getBoolean(R.styleable.TitleBar_fitNavigationBar, false)) { + bottomPadding = context.navigationBarHeight + } + + backgroundColor = context.primaryColor + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + stateListAnimator = null + elevation = if (AppConfig.elevation < 0) { + context.elevation + } else { + AppConfig.elevation.toFloat() + } + } + + } + a.recycle() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + attachToActivity() + } + + fun setNavigationOnClickListener(clickListener: ((View) -> Unit)) { + toolbar.setNavigationOnClickListener(clickListener) + } + + fun setTitle(titleId: Int) { + toolbar.setTitle(titleId) + } + + fun setSubTitle(subtitleId: Int) { + toolbar.setSubtitle(subtitleId) + } + + fun setTitleTextColor(@ColorInt color: Int) { + toolbar.setTitleTextColor(color) + } + + fun setTitleTextAppearance(@StyleRes resId: Int) { + toolbar.setTitleTextAppearance(context, resId) + } + + fun setSubTitleTextColor(@ColorInt color: Int) { + toolbar.setSubtitleTextColor(color) + } + + fun setSubTitleTextAppearance(@StyleRes resId: Int) { + toolbar.setSubtitleTextAppearance(context, resId) + } + + fun transparent() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + elevation = 0f + } + backgroundColor = Color.TRANSPARENT + } + + fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean, fullScreen: Boolean) { + topPadding = if (!isInMultiWindowMode && fullScreen) context.statusBarHeight else 0 + } + + private fun attachToActivity() { + if (attachToActivity) { + activity?.let { + it.setSupportActionBar(toolbar) + it.supportActionBar?.setDisplayHomeAsUpEnabled(displayHomeAsUp) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/UpLinearLayoutManager.kt b/app/src/main/java/com/novel/read/ui/widget/UpLinearLayoutManager.kt new file mode 100644 index 0000000..59d1fbd --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/UpLinearLayoutManager.kt @@ -0,0 +1,39 @@ +package com.novel.read.ui.widget + +import android.content.Context +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.LinearSmoothScroller + +@Suppress("MemberVisibilityCanBePrivate", "unused") +class UpLinearLayoutManager(val context: Context) : LinearLayoutManager(context) { + + fun smoothScrollToPosition(position: Int) { + smoothScrollToPosition(position, 0) + } + + fun smoothScrollToPosition(position: Int, offset: Int) { + val scroller = UpLinearSmoothScroller(context) + scroller.targetPosition = position + scroller.offset = offset + startSmoothScroll(scroller) + } +} + +class UpLinearSmoothScroller(context: Context?): LinearSmoothScroller(context) { + var offset = 0 + + override fun getVerticalSnapPreference(): Int { + return SNAP_TO_START + } + + override fun getHorizontalSnapPreference(): Int { + return SNAP_TO_START + } + + override fun calculateDtToFit(viewStart: Int, viewEnd: Int, boxStart: Int, boxEnd: Int, snapPreference: Int): Int { + if (snapPreference == SNAP_TO_START) { + return boxStart - viewStart + offset + } + throw IllegalArgumentException("snap preference should be SNAP_TO_START") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/VerticalDivider.kt b/app/src/main/java/com/novel/read/ui/widget/VerticalDivider.kt new file mode 100644 index 0000000..11eaecb --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/VerticalDivider.kt @@ -0,0 +1,16 @@ +package com.novel.read.ui.widget + +import android.content.Context +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.DividerItemDecoration +import com.novel.read.R + +class VerticalDivider(context: Context) : DividerItemDecoration(context, VERTICAL) { + + init { + ContextCompat.getDrawable(context, R.drawable.ic_divider)?.let { + this.setDrawable(it) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/anim/RotateLoading.kt b/app/src/main/java/com/novel/read/ui/widget/anim/RotateLoading.kt new file mode 100644 index 0000000..046355b --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/anim/RotateLoading.kt @@ -0,0 +1,219 @@ +package com.novel.read.ui.widget.anim + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.RectF +import android.util.AttributeSet +import android.view.View +import com.novel.read.R +import com.novel.read.utils.ext.* + +/** + * RotateLoading + * Created by Victor on 2015/4/28. + */ +@Suppress("MemberVisibilityCanBePrivate") +class RotateLoading @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : View(context, attrs) { + + private var mPaint: Paint + + private var loadingRectF: RectF? = null + private var shadowRectF: RectF? = null + + private var topDegree = 10 + private var bottomDegree = 190 + + private var arc: Float = 0.toFloat() + + private var thisWidth: Int = 0 + + private var changeBigger = true + + private var shadowPosition: Int = 0 + + var hideMode = GONE + + var isStarted = false + private set + + var loadingColor: Int = 0 + set(value) { + field = value + invalidate() + } + + private var speedOfDegree: Int = 0 + + private var speedOfArc: Float = 0.toFloat() + + private val shown = Runnable { this.startInternal() } + + private val hidden = Runnable { this.stopInternal() } + + init { + loadingColor = context.accentColor + thisWidth = DEFAULT_WIDTH.dp + shadowPosition = DEFAULT_SHADOW_POSITION.dp + speedOfDegree = DEFAULT_SPEED_OF_DEGREE + + if (null != attrs) { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.RotateLoading) + loadingColor = + typedArray.getColor(R.styleable.RotateLoading_loading_color, loadingColor) + thisWidth = typedArray.getDimensionPixelSize( + R.styleable.RotateLoading_loading_width, + DEFAULT_WIDTH.dp + ) + shadowPosition = typedArray.getInt(R.styleable.RotateLoading_shadow_position, DEFAULT_SHADOW_POSITION) + speedOfDegree = typedArray.getInt(R.styleable.RotateLoading_loading_speed, DEFAULT_SPEED_OF_DEGREE) + hideMode = when (typedArray.getInt(R.styleable.RotateLoading_hide_mode, 2)) { + 1 -> INVISIBLE + else -> GONE + } + typedArray.recycle() + } + speedOfArc = (speedOfDegree / 4).toFloat() + mPaint = Paint() + mPaint.color = loadingColor + mPaint.isAntiAlias = true + mPaint.style = Paint.Style.STROKE + mPaint.strokeWidth = thisWidth.toFloat() + mPaint.strokeCap = Paint.Cap.ROUND + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + + arc = 10f + + loadingRectF = + RectF( + (2 * thisWidth).toFloat(), + (2 * thisWidth).toFloat(), + (w - 2 * thisWidth).toFloat(), + (h - 2 * thisWidth).toFloat() + ) + shadowRectF = RectF( + (2 * thisWidth + shadowPosition).toFloat(), + (2 * thisWidth + shadowPosition).toFloat(), + (w - 2 * thisWidth + shadowPosition).toFloat(), + (h - 2 * thisWidth + shadowPosition).toFloat() + ) + } + + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + if (!isStarted) { + return + } + + mPaint.color = Color.parseColor("#1a000000") + shadowRectF?.let { + canvas.drawArc(it, topDegree.toFloat(), arc, false, mPaint) + canvas.drawArc(it, bottomDegree.toFloat(), arc, false, mPaint) + } + + mPaint.color = loadingColor + loadingRectF?.let { + canvas.drawArc(it, topDegree.toFloat(), arc, false, mPaint) + canvas.drawArc(it, bottomDegree.toFloat(), arc, false, mPaint) + } + + topDegree += speedOfDegree + bottomDegree += speedOfDegree + if (topDegree > 360) { + topDegree -= 360 + } + if (bottomDegree > 360) { + bottomDegree -= 360 + } + + if (changeBigger) { + if (arc < 160) { + arc += speedOfArc + invalidate() + } + } else { + if (arc > speedOfDegree) { + arc -= 2 * speedOfArc + invalidate() + } + } + if (arc >= 160 || arc <= 10) { + changeBigger = !changeBigger + invalidate() + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if (visibility == VISIBLE) { + startInternal() + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + isStarted = false + animate().cancel() + removeCallbacks(shown) + removeCallbacks(hidden) + } + + fun show() { + removeCallbacks(shown) + removeCallbacks(hidden) + post(shown) + } + + fun hide() { + removeCallbacks(shown) + removeCallbacks(hidden) + stopInternal() + } + + private fun startInternal() { + startAnimator() + isStarted = true + invalidate() + } + + private fun stopInternal() { + stopAnimator() + invalidate() + } + + private fun startAnimator() { + animate().cancel() + animate().scaleX(1.0f) + .scaleY(1.0f) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationStart(animation: Animator) { + visibility = VISIBLE + } + }) + .start() + } + + private fun stopAnimator() { + animate().cancel() + isStarted = false + this.visibility = hideMode + } + + companion object { + private const val DEFAULT_WIDTH = 6 + private const val DEFAULT_SHADOW_POSITION = 2 + private const val DEFAULT_SPEED_OF_DEGREE = 10 + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/widget/dialog/AppraiseDialog.kt b/app/src/main/java/com/novel/read/ui/widget/dialog/AppraiseDialog.kt similarity index 90% rename from app/src/main/java/com/novel/read/widget/dialog/AppraiseDialog.kt rename to app/src/main/java/com/novel/read/ui/widget/dialog/AppraiseDialog.kt index 1b6735f..2866d6c 100644 --- a/app/src/main/java/com/novel/read/widget/dialog/AppraiseDialog.kt +++ b/app/src/main/java/com/novel/read/ui/widget/dialog/AppraiseDialog.kt @@ -1,12 +1,10 @@ -package com.novel.read.widget.dialog +package com.novel.read.ui.widget.dialog import android.app.Dialog import android.content.Context -import android.view.LayoutInflater -import android.view.View +import android.view.* import android.widget.LinearLayout import android.widget.TextView - import com.novel.read.R import kotlinx.android.synthetic.main.dialog_go_appraise.* @@ -36,4 +34,4 @@ class AppraiseDialog(context: Context) : Dialog(context, R.style.dialog) { tv_appraise.setOnClickListener(receiveClickListener) } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/dialog/AutoReadDialog.kt b/app/src/main/java/com/novel/read/ui/widget/dialog/AutoReadDialog.kt new file mode 100644 index 0000000..a637fe4 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/dialog/AutoReadDialog.kt @@ -0,0 +1,111 @@ +package com.novel.read.ui.widget.dialog + +import android.os.Bundle +import android.view.* +import android.widget.SeekBar +import com.novel.read.R +import com.novel.read.base.BaseDialogFragment +import com.novel.read.help.ReadBookConfig +import com.novel.read.service.BaseReadAloudService +import com.novel.read.service.help.ReadAloud +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.bottomBackground +import com.novel.read.utils.ext.getPrimaryTextColor +import kotlinx.android.synthetic.main.dialog_auto_read.* +import org.jetbrains.anko.sdk27.listeners.onClick + +class AutoReadDialog : BaseDialogFragment() { + var callBack: CallBack? = null + + override fun onStart() { + super.onStart() + dialog?.window?.let { + it.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + it.setBackgroundDrawableResource(R.color.background) + it.decorView.setPadding(0, 0, 0, 0) + val attr = it.attributes + attr.dimAmount = 0.0f + attr.gravity = Gravity.BOTTOM + it.attributes = attr + it.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + callBack = activity as? CallBack + return inflater.inflate(R.layout.dialog_auto_read, container) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + val bg = requireContext().bottomBackground + val isLight = ColorUtils.isColorLight(bg) + val textColor = requireContext().getPrimaryTextColor(isLight) + root_view.setBackgroundColor(bg) + tv_read_speed_title.setTextColor(textColor) + tv_read_speed.setTextColor(textColor) + iv_catalog.setColorFilter(textColor) + tv_catalog.setTextColor(textColor) + iv_main_menu.setColorFilter(textColor) + tv_main_menu.setTextColor(textColor) + iv_auto_page_stop.setColorFilter(textColor) + tv_auto_page_stop.setTextColor(textColor) + iv_setting.setColorFilter(textColor) + tv_setting.setTextColor(textColor) + initOnChange() + initData() + initEvent() + } + + private fun initData() { + val speed = if (ReadBookConfig.autoReadSpeed < 10) 10 else ReadBookConfig.autoReadSpeed + tv_read_speed.text = String.format("%ds", speed) + seek_auto_read.progress = speed + } + + private fun initOnChange() { + seek_auto_read.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + val speed = if (progress < 10) 10 else progress + tv_read_speed.text = String.format("%ds", speed) + } + + override fun onStartTrackingTouch(seekBar: SeekBar) = Unit + + override fun onStopTrackingTouch(seekBar: SeekBar) { + ReadBookConfig.autoReadSpeed = + if (seek_auto_read.progress < 10) 10 else seek_auto_read.progress + upTtsSpeechRate() + } + }) + } + + private fun initEvent() { + ll_main_menu.onClick { callBack?.showMenuBar(); dismiss() } + ll_setting.onClick { + ReadAloudConfigDialog().show(childFragmentManager, "readAloudConfigDialog") + } + ll_catalog.onClick { callBack?.openChapterList() } + ll_auto_page_stop.onClick { + callBack?.autoPageStop() + dismiss() + } + } + + private fun upTtsSpeechRate() { + ReadAloud.upTtsSpeechRate(requireContext()) + if (!BaseReadAloudService.pause) { + ReadAloud.pause(requireContext()) + ReadAloud.resume(requireContext()) + } + } + + interface CallBack { + fun showMenuBar() + fun openChapterList() + fun autoPageStop() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/dialog/LoginDialog.kt b/app/src/main/java/com/novel/read/ui/widget/dialog/LoginDialog.kt new file mode 100644 index 0000000..98621f8 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/dialog/LoginDialog.kt @@ -0,0 +1,32 @@ +package com.novel.read.ui.widget.dialog + +import android.app.Dialog +import android.content.Context +import android.view.* +import android.widget.LinearLayout +import com.novel.read.R + +class LoginDialog(context: Context) : Dialog(context, R.style.dialog) { + private val view: View = LayoutInflater.from(context).inflate(R.layout.dialog_login, null) + + init { + view.setHasTransientState(true) + setContentView( + view, LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) + ) + setCancelable(true) + initView() + + } + + private fun initView() { + + } + + fun LoginDialog(receiveClickListener: View.OnClickListener) { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/dialog/PhotoDialog.kt b/app/src/main/java/com/novel/read/ui/widget/dialog/PhotoDialog.kt new file mode 100644 index 0000000..a05fa83 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/dialog/PhotoDialog.kt @@ -0,0 +1,68 @@ +package com.novel.read.ui.widget.dialog + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.FragmentManager +import com.novel.read.R +import com.novel.read.base.BaseDialogFragment +import com.novel.read.service.help.ReadBook +import io.legado.app.ui.book.read.page.provider.ImageProvider +import kotlinx.android.synthetic.main.dialog_photo_view.* + +class PhotoDialog : BaseDialogFragment() { + + companion object { + + fun show( + fragmentManager: FragmentManager, + chapterIndex: Int, + src: String + ) { + PhotoDialog().apply { + val bundle = Bundle() + bundle.putInt("chapterIndex", chapterIndex) + bundle.putString("src", src) + arguments = bundle + }.show(fragmentManager, "photoDialog") + } + + } + + override fun onStart() { + super.onStart() + dialog?.window?.setLayout( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.dialog_photo_view, container) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + arguments?.let { + val chapterIndex = it.getInt("chapterIndex") + val src = it.getString("src") + ReadBook.book?.let { book -> + src?.let { + execute { + ImageProvider.getImage(book, chapterIndex, src) + }.onSuccess { bitmap -> + if (bitmap != null) { + photo_view.setImageBitmap(bitmap) + } + } + } + } + } + + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/dialog/ReadAloudConfigDialog.kt b/app/src/main/java/com/novel/read/ui/widget/dialog/ReadAloudConfigDialog.kt new file mode 100644 index 0000000..b41ff23 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/dialog/ReadAloudConfigDialog.kt @@ -0,0 +1,128 @@ +package com.novel.read.ui.widget.dialog + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.fragment.app.DialogFragment +import androidx.preference.ListPreference +import androidx.preference.Preference +import com.novel.read.App +import com.novel.read.R +import com.novel.read.base.BasePreferenceFragment +import com.novel.read.constant.EventBus +import com.novel.read.constant.PreferKey +import com.novel.read.lib.ATH +import com.novel.read.service.BaseReadAloudService +import com.novel.read.service.help.ReadAloud +import com.novel.read.utils.ext.* + +class ReadAloudConfigDialog : DialogFragment() { + private val readAloudPreferTag = "readAloudPreferTag" + + override fun onStart() { + super.onStart() + val dm = requireActivity().getSize() + dialog?.window?.let { + it.setBackgroundDrawableResource(R.color.transparent) + it.setLayout((dm.widthPixels * 0.9).toInt(), ViewGroup.LayoutParams.WRAP_CONTENT) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = LinearLayout(requireContext()) + view.setBackgroundColor(requireContext().backgroundColor) + view.id = R.id.tag1 + container?.addView(view) + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + var preferenceFragment = childFragmentManager.findFragmentByTag(readAloudPreferTag) + if (preferenceFragment == null) preferenceFragment = ReadAloudPreferenceFragment() + childFragmentManager.beginTransaction() + .replace(view.id, preferenceFragment, readAloudPreferTag) + .commit() + } + + class ReadAloudPreferenceFragment : BasePreferenceFragment(), + SharedPreferences.OnSharedPreferenceChangeListener { + + private val speakEngineSummary: String + get() { + val eid = App.INSTANCE.getPrefLong(PreferKey.speakEngine) +// val ht = App.db.httpTTSDao().get(eid) +// return ht?.name ?: getString(R.string.local_tts) + return getString(R.string.local_tts) + } + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.pref_config_aloud) + upPreferenceSummary( + findPreference(PreferKey.speakEngine), + speakEngineSummary + ) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + ATH.applyEdgeEffectColor(listView) + } + + override fun onResume() { + super.onResume() + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + override fun onPause() { + preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + super.onPause() + } + + override fun onPreferenceTreeClick(preference: Preference?): Boolean { + when (preference?.key) { +// PreferKey.speakEngine -> +// SpeakEngineDialog().show(childFragmentManager, "speakEngine") + } + return super.onPreferenceTreeClick(preference) + } + + override fun onSharedPreferenceChanged( + sharedPreferences: SharedPreferences?, + key: String? + ) { + when (key) { + PreferKey.readAloudByPage -> { + if (BaseReadAloudService.isRun) { + postEvent(EventBus.MEDIA_BUTTON, false) + } + } + PreferKey.speakEngine -> { + upPreferenceSummary(findPreference(key), speakEngineSummary) + ReadAloud.upReadAloudClass() + } + } + } + + private fun upPreferenceSummary(preference: Preference?, value: String) { + when (preference) { + is ListPreference -> { + val index = preference.findIndexOfValue(value) + // Set the summary to reflect the new value. + preference.summary = if (index >= 0) preference.entries[index] else null + } + else -> { + preference?.summary = value + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/dialog/TextDialog.kt b/app/src/main/java/com/novel/read/ui/widget/dialog/TextDialog.kt new file mode 100644 index 0000000..fae31b9 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/dialog/TextDialog.kt @@ -0,0 +1,97 @@ +package com.novel.read.ui.widget.dialog + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.FragmentManager +import com.novel.read.R +import com.novel.read.base.BaseDialogFragment +import com.novel.read.utils.ext.* +import io.noties.markwon.Markwon +import io.noties.markwon.image.glide.GlideImagesPlugin +import kotlinx.android.synthetic.main.dialog_text_view.* +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +class TextDialog : BaseDialogFragment() { + + companion object { + const val MD = 1 + + fun show( + fragmentManager: FragmentManager, + content: String?, + mode: Int = 0, + time: Long = 0, + autoClose: Boolean = false + ) { + TextDialog().apply { + val bundle = Bundle() + bundle.putString("content", content) + bundle.putInt("mode", mode) + bundle.putLong("time", time) + arguments = bundle + isCancelable = false + this.autoClose = autoClose + }.show(fragmentManager, "textDialog") + } + + } + + private var time = 0L + + private var autoClose: Boolean = false + + override fun onStart() { + super.onStart() + val dm = requireActivity().getSize() + dialog?.window?.setLayout((dm.widthPixels * 0.9).toInt(), (dm.heightPixels * 0.9).toInt()) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.dialog_text_view, container) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + arguments?.let { + val content = it.getString("content") ?: "" + when (it.getInt("mode")) { + MD -> text_view.post { + Markwon.builder(requireContext()) + .usePlugin(GlideImagesPlugin.create(requireContext())) + .build() + .setMarkdown(text_view, content) + } + else -> text_view.text = content + } + time = it.getLong("time", 0L) + } + if (time > 0) { + badge_view.setBadgeCount((time / 1000).toInt()) + launch { + while (time > 0) { + delay(1000) + time -= 1000 + badge_view.setBadgeCount((time / 1000).toInt()) + if (time <= 0) { + view.post { + dialog?.setCancelable(true) + if (autoClose) dialog?.cancel() + } + } + } + } + } else { + view.post { + dialog?.setCancelable(true) + if (autoClose) dialog?.cancel() + } + } + } + +} diff --git a/app/src/main/java/com/novel/read/widget/RefreshLayout.java b/app/src/main/java/com/novel/read/ui/widget/dynamic/RefreshLayout.java similarity index 99% rename from app/src/main/java/com/novel/read/widget/RefreshLayout.java rename to app/src/main/java/com/novel/read/ui/widget/dynamic/RefreshLayout.java index d5511d5..e38e141 100644 --- a/app/src/main/java/com/novel/read/widget/RefreshLayout.java +++ b/app/src/main/java/com/novel/read/ui/widget/dynamic/RefreshLayout.java @@ -1,4 +1,4 @@ -package com.novel.read.widget; +package com.novel.read.ui.widget.dynamic; import android.content.Context; import android.content.res.TypedArray; diff --git a/app/src/main/java/com/novel/read/ui/widget/image/CircleImageView.kt b/app/src/main/java/com/novel/read/ui/widget/image/CircleImageView.kt new file mode 100644 index 0000000..c137bc4 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/image/CircleImageView.kt @@ -0,0 +1,466 @@ +package com.novel.read.ui.widget.image + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.* +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.net.Uri +import android.os.Build +import android.text.TextPaint +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import android.view.ViewOutlineProvider +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.annotation.RequiresApi +import androidx.appcompat.widget.AppCompatImageView +import com.novel.read.R +import com.novel.read.utils.ext.getCompatColor +import com.novel.read.utils.ext.sp +import kotlin.math.min +import kotlin.math.pow + +@Suppress("unused", "MemberVisibilityCanBePrivate") +class CircleImageView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatImageView(context, attrs) { + + private val mDrawableRect = RectF() + private val mBorderRect = RectF() + + private val mShaderMatrix = Matrix() + private val mBitmapPaint = Paint() + private val mBorderPaint = Paint() + private val mCircleBackgroundPaint = Paint() + private val textPaint by lazy { + val textPaint = TextPaint() + textPaint.isAntiAlias = true + textPaint.textAlign = Paint.Align.CENTER + textPaint + } + + private var mBorderColor = DEFAULT_BORDER_COLOR + private var mBorderWidth = DEFAULT_BORDER_WIDTH + private var mCircleBackgroundColor = DEFAULT_CIRCLE_BACKGROUND_COLOR + + private var mBitmap: Bitmap? = null + private var mBitmapShader: BitmapShader? = null + private var mBitmapWidth: Int = 0 + private var mBitmapHeight: Int = 0 + + private var mDrawableRadius: Float = 0.toFloat() + private var mBorderRadius: Float = 0.toFloat() + + private var mColorFilter: ColorFilter? = null + + private var mReady: Boolean = false + private var mSetupPending: Boolean = false + private var mBorderOverlay: Boolean = false + var isDisableCircularTransformation: Boolean = false + set(disableCircularTransformation) { + if (field == disableCircularTransformation) { + return + } + field = disableCircularTransformation + initializeBitmap() + } + + var borderColor: Int + get() = mBorderColor + set(@ColorInt borderColor) { + if (borderColor == mBorderColor) { + return + } + + mBorderColor = borderColor + mBorderPaint.color = mBorderColor + invalidate() + } + + var circleBackgroundColor: Int + get() = mCircleBackgroundColor + set(@ColorInt circleBackgroundColor) { + if (circleBackgroundColor == mCircleBackgroundColor) { + return + } + mCircleBackgroundColor = circleBackgroundColor + mCircleBackgroundPaint.color = circleBackgroundColor + invalidate() + } + + var borderWidth: Int + get() = mBorderWidth + set(borderWidth) { + if (borderWidth == mBorderWidth) { + return + } + + mBorderWidth = borderWidth + setup() + } + + var isBorderOverlay: Boolean + get() = mBorderOverlay + set(borderOverlay) { + if (borderOverlay == mBorderOverlay) { + return + } + + mBorderOverlay = borderOverlay + setup() + } + + private var text: String? = null + + private var textColor = context.getCompatColor(R.color.primaryText) + private var textBold = false + var isInView = false + + init { + super.setScaleType(SCALE_TYPE) + val a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView) + mBorderWidth = + a.getDimensionPixelSize( + R.styleable.CircleImageView_civ_border_width, + DEFAULT_BORDER_WIDTH + ) + mBorderColor = + a.getColor(R.styleable.CircleImageView_civ_border_color, DEFAULT_BORDER_COLOR) + mBorderOverlay = + a.getBoolean(R.styleable.CircleImageView_civ_border_overlay, DEFAULT_BORDER_OVERLAY) + mCircleBackgroundColor = + a.getColor( + R.styleable.CircleImageView_civ_circle_background_color, + DEFAULT_CIRCLE_BACKGROUND_COLOR + ) + text = a.getString(R.styleable.CircleImageView_text) + if (a.hasValue(R.styleable.CircleImageView_textColor)) { + textColor = a.getColor( + R.styleable.CircleImageView_textColor, + context.getCompatColor(R.color.primaryText) + ) + } + a.recycle() + + mReady = true + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + outlineProvider = OutlineProvider() + } + + if (mSetupPending) { + setup() + mSetupPending = false + } + } + + override fun getScaleType(): ScaleType { + return SCALE_TYPE + } + + override fun setScaleType(scaleType: ScaleType) { + if (scaleType != SCALE_TYPE) { + throw IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)) + } + } + + override fun setAdjustViewBounds(adjustViewBounds: Boolean) { + if (adjustViewBounds) { + throw IllegalArgumentException("adjustViewBounds not supported.") + } + } + + override fun onDraw(canvas: Canvas) { + if (isDisableCircularTransformation) { + super.onDraw(canvas) + return + } + if (mBitmap == null) { + return + } + + if (mCircleBackgroundColor != Color.TRANSPARENT) { + canvas.drawCircle( + mDrawableRect.centerX(), + mDrawableRect.centerY(), + mDrawableRadius, + mCircleBackgroundPaint + ) + } + canvas.drawCircle( + mDrawableRect.centerX(), + mDrawableRect.centerY(), + mDrawableRadius, + mBitmapPaint + ) + if (mBorderWidth > 0) { + canvas.drawCircle( + mBorderRect.centerX(), + mBorderRect.centerY(), + mBorderRadius, + mBorderPaint + ) + } + drawText(canvas) + } + + private fun drawText(canvas: Canvas) { + text?.let { + textPaint.color = textColor + textPaint.isFakeBoldText = textBold + textPaint.textSize = 15.sp.toFloat() + val fm = textPaint.fontMetrics + canvas.drawText( + it, + width * 0.5f, + (height * 0.5f + (fm.bottom - fm.top) * 0.5f - fm.bottom), + textPaint + ) + } + } + + fun setText(text: String?) { + this.text = text + invalidate() + } + + fun setTextColor(@ColorInt textColor: Int) { + this.textColor = textColor + invalidate() + } + + fun setTextBold(bold: Boolean) { + this.textBold = bold + invalidate() + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + setup() + } + + override fun setPadding(left: Int, top: Int, right: Int, bottom: Int) { + super.setPadding(left, top, right, bottom) + setup() + } + + override fun setPaddingRelative(start: Int, top: Int, end: Int, bottom: Int) { + super.setPaddingRelative(start, top, end, bottom) + setup() + } + + fun setCircleBackgroundColorResource(@ColorRes circleBackgroundRes: Int) { + circleBackgroundColor = context.getCompatColor(circleBackgroundRes) + } + + override fun setImageBitmap(bm: Bitmap) { + super.setImageBitmap(bm) + initializeBitmap() + } + + override fun setImageDrawable(drawable: Drawable?) { + super.setImageDrawable(drawable) + initializeBitmap() + } + + override fun setImageResource(@DrawableRes resId: Int) { + super.setImageResource(resId) + initializeBitmap() + } + + override fun setImageURI(uri: Uri?) { + super.setImageURI(uri) + initializeBitmap() + } + + override fun setColorFilter(cf: ColorFilter) { + if (cf === mColorFilter) { + return + } + + mColorFilter = cf + applyColorFilter() + invalidate() + } + + override fun getColorFilter(): ColorFilter? { + return mColorFilter + } + + private fun applyColorFilter() { + mBitmapPaint.colorFilter = mColorFilter + } + + private fun getBitmapFromDrawable(drawable: Drawable?): Bitmap? { + if (drawable == null) { + return null + } + + if (drawable is BitmapDrawable) { + return drawable.bitmap + } + + return try { + val bitmap: Bitmap = if (drawable is ColorDrawable) { + Bitmap.createBitmap( + COLOR_DRAWABLE_DIMENSION, + COLOR_DRAWABLE_DIMENSION, + BITMAP_CONFIG + ) + } else { + Bitmap.createBitmap( + drawable.intrinsicWidth, + drawable.intrinsicHeight, + BITMAP_CONFIG + ) + } + + val canvas = Canvas(bitmap) + drawable.setBounds(0, 0, canvas.width, canvas.height) + drawable.draw(canvas) + bitmap + } catch (e: Exception) { + e.printStackTrace() + null + } + + } + + private fun initializeBitmap() { + mBitmap = if (isDisableCircularTransformation) { + null + } else { + getBitmapFromDrawable(drawable) + } + setup() + } + + private fun setup() { + if (!mReady) { + mSetupPending = true + return + } + + if (width == 0 && height == 0) { + return + } + + if (mBitmap == null) { + invalidate() + return + } + + mBitmapShader = BitmapShader(mBitmap!!, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) + + mBitmapPaint.isAntiAlias = true + mBitmapPaint.shader = mBitmapShader + + mBorderPaint.style = Paint.Style.STROKE + mBorderPaint.isAntiAlias = true + mBorderPaint.color = mBorderColor + mBorderPaint.strokeWidth = mBorderWidth.toFloat() + + mCircleBackgroundPaint.style = Paint.Style.FILL + mCircleBackgroundPaint.isAntiAlias = true + mCircleBackgroundPaint.color = mCircleBackgroundColor + + mBitmapHeight = mBitmap!!.height + mBitmapWidth = mBitmap!!.width + + mBorderRect.set(calculateBounds()) + mBorderRadius = + min( + (mBorderRect.height() - mBorderWidth) / 2.0f, + (mBorderRect.width() - mBorderWidth) / 2.0f + ) + + mDrawableRect.set(mBorderRect) + if (!mBorderOverlay && mBorderWidth > 0) { + mDrawableRect.inset(mBorderWidth - 1.0f, mBorderWidth - 1.0f) + } + mDrawableRadius = min(mDrawableRect.height() / 2.0f, mDrawableRect.width() / 2.0f) + + applyColorFilter() + updateShaderMatrix() + invalidate() + } + + private fun calculateBounds(): RectF { + val availableWidth = width - paddingLeft - paddingRight + val availableHeight = height - paddingTop - paddingBottom + + val sideLength = min(availableWidth, availableHeight) + + val left = paddingLeft + (availableWidth - sideLength) / 2f + val top = paddingTop + (availableHeight - sideLength) / 2f + + return RectF(left, top, left + sideLength, top + sideLength) + } + + private fun updateShaderMatrix() { + val scale: Float + var dx = 0f + var dy = 0f + + mShaderMatrix.set(null) + + if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) { + scale = mDrawableRect.height() / mBitmapHeight.toFloat() + dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f + } else { + scale = mDrawableRect.width() / mBitmapWidth.toFloat() + dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f + } + + mShaderMatrix.setScale(scale, scale) + mShaderMatrix.postTranslate( + (dx + 0.5f).toInt() + mDrawableRect.left, + (dy + 0.5f).toInt() + mDrawableRect.top + ) + + mBitmapShader!!.setLocalMatrix(mShaderMatrix) + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent): Boolean { + when (event.action) { + MotionEvent.ACTION_DOWN -> { + isInView = (inTouchableArea(event.x, event.y)) + } + } + return super.onTouchEvent(event) + } + + private fun inTouchableArea(x: Float, y: Float): Boolean { + return (x - mBorderRect.centerX()).toDouble() + .pow(2.0) + (y - mBorderRect.centerY()).toDouble() + .pow(2.0) <= mBorderRadius.toDouble().pow(2.0) + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private inner class OutlineProvider : ViewOutlineProvider() { + + override fun getOutline(view: View, outline: Outline) { + val bounds = Rect() + mBorderRect.roundOut(bounds) + outline.setRoundRect(bounds, bounds.width() / 2.0f) + } + + } + + companion object { + private val SCALE_TYPE = ScaleType.CENTER_CROP + private val BITMAP_CONFIG = Bitmap.Config.ARGB_8888 + private const val COLOR_DRAWABLE_DIMENSION = 2 + private const val DEFAULT_BORDER_WIDTH = 0 + private const val DEFAULT_BORDER_COLOR = Color.BLACK + private const val DEFAULT_CIRCLE_BACKGROUND_COLOR = Color.TRANSPARENT + private const val DEFAULT_BORDER_OVERLAY = false + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/image/CoverImageView.kt b/app/src/main/java/com/novel/read/ui/widget/image/CoverImageView.kt new file mode 100644 index 0000000..7e16306 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/image/CoverImageView.kt @@ -0,0 +1,187 @@ +package com.novel.read.ui.widget.image + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.* +import android.graphics.drawable.Drawable +import android.text.TextPaint +import android.util.AttributeSet +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.novel.read.App +import com.novel.read.R +import com.novel.read.constant.PreferKey +import com.novel.read.help.ImageLoader +import com.novel.read.utils.ext.getPrefString + +/** + * 封面 + */ +@Suppress("unused") +class CoverImageView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : androidx.appcompat.widget.AppCompatImageView( + context, + attrs +) { + internal var width: Float = 0.toFloat() + internal var height: Float = 0.toFloat() + private var nameHeight = 0f + private var authorHeight = 0f + private val namePaint by lazy { + val textPaint = TextPaint() + textPaint.typeface = Typeface.DEFAULT_BOLD + textPaint.isAntiAlias = true + textPaint.textAlign = Paint.Align.CENTER + textPaint.textSkewX = -0.2f + textPaint + } + private val authorPaint by lazy { + val textPaint = TextPaint() + textPaint.typeface = Typeface.DEFAULT + textPaint.isAntiAlias = true + textPaint.textAlign = Paint.Align.CENTER + textPaint.textSkewX = -0.1f + textPaint + } + private var name: String? = null + private var author: String? = null + private var loadFailed = false + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val measuredWidth = MeasureSpec.getSize(widthMeasureSpec) + val measuredHeight = measuredWidth * 7 / 5 + super.onMeasure( + widthMeasureSpec, + MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY) + ) + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + width = getWidth().toFloat() + height = getHeight().toFloat() + namePaint.textSize = width / 6 + namePaint.strokeWidth = namePaint.textSize / 10 + authorPaint.textSize = width / 9 + authorPaint.strokeWidth = authorPaint.textSize / 10 + val fm = namePaint.fontMetrics + nameHeight = height * 0.5f + (fm.bottom - fm.top) * 0.5f + authorHeight = nameHeight + (fm.bottom - fm.top) * 0.6f + } + + override fun onDraw(canvas: Canvas) { + if (width >= 10 && height > 10) { + @SuppressLint("DrawAllocation") + val path = Path() + //四个圆角 + path.moveTo(10f, 0f) + path.lineTo(width - 10, 0f) + path.quadTo(width, 0f, width, 10f) + path.lineTo(width, height - 10) + path.quadTo(width, height, width - 10, height) + path.lineTo(10f, height) + path.quadTo(0f, height, 0f, height - 10) + path.lineTo(0f, 10f) + path.quadTo(0f, 0f, 10f, 0f) + + canvas.clipPath(path) + } + super.onDraw(canvas) + if (!loadFailed || !showBookName) return + name?.let { + namePaint.color = Color.WHITE + namePaint.style = Paint.Style.STROKE + canvas.drawText(it, width / 2, nameHeight, namePaint) + namePaint.color = Color.RED + namePaint.style = Paint.Style.FILL + canvas.drawText(it, width / 2, nameHeight, namePaint) + } + author?.let { + authorPaint.color = Color.WHITE + authorPaint.style = Paint.Style.STROKE + canvas.drawText(it, width / 2, authorHeight, authorPaint) + authorPaint.color = Color.RED + authorPaint.style = Paint.Style.FILL + canvas.drawText(it, width / 2, authorHeight, authorPaint) + } + } + + fun setHeight(height: Int) { + val width = height * 5 / 7 + minimumWidth = width + } + + private fun setText(name: String?, author: String?) { + this.name = + when { + name == null -> null + name.length > 5 -> name.substring(0, 4) + "…" + else -> name + } + this.author = + when { + author == null -> null + author.length > 8 -> author.substring(0, 7) + "…" + else -> author + } + } + + fun load(path: String?, name: String?, author: String?) { + setText(name, author) + ImageLoader.load(context, path)//Glide自动识别http://,content://和file:// + .placeholder(defaultDrawable) + .error(defaultDrawable) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + loadFailed = true + return false + } + + override fun onResourceReady( + resource: Drawable?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + loadFailed = false + return false + } + + }) + .centerCrop() + .into(this) + } + + companion object { + private var showBookName = false + lateinit var defaultDrawable: Drawable + + init { + upDefaultCover() + } + + @SuppressLint("UseCompatLoadingForDrawables") + fun upDefaultCover() { + val path = App.INSTANCE.getPrefString(PreferKey.defaultCover) + var dw = Drawable.createFromPath(path) + if (dw == null) { + showBookName = true + dw = App.INSTANCE.resources.getDrawable(R.drawable.image_cover_default, null) + } else { + showBookName = false + } + defaultDrawable = dw!! + } + + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/image/FilletImageView.kt b/app/src/main/java/com/novel/read/ui/widget/image/FilletImageView.kt new file mode 100644 index 0000000..9717170 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/image/FilletImageView.kt @@ -0,0 +1,99 @@ +package com.novel.read.ui.widget.image + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Canvas +import android.graphics.Path +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import com.novel.read.R +import com.novel.read.utils.ext.dp +import kotlin.math.max + +class FilletImageView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatImageView(context, attrs) { + internal var width: Float = 0.toFloat() + internal var height: Float = 0.toFloat() + private var leftTopRadius: Int = 0 + private var rightTopRadius: Int = 0 + private var rightBottomRadius: Int = 0 + private var leftBottomRadius: Int = 0 + + init { + // 读取配置 + val array = context.obtainStyledAttributes(attrs, R.styleable.FilletImageView) + val defaultRadius = 5.dp + val radius = + array.getDimensionPixelOffset(R.styleable.FilletImageView_radius, defaultRadius) + leftTopRadius = array.getDimensionPixelOffset( + R.styleable.FilletImageView_left_top_radius, + defaultRadius + ) + rightTopRadius = array.getDimensionPixelOffset( + R.styleable.FilletImageView_right_top_radius, + defaultRadius + ) + rightBottomRadius = + array.getDimensionPixelOffset( + R.styleable.FilletImageView_right_bottom_radius, + defaultRadius + ) + leftBottomRadius = array.getDimensionPixelOffset( + R.styleable.FilletImageView_left_bottom_radius, + defaultRadius + ) + + //如果四个角的值没有设置,那么就使用通用的radius的值。 + if (defaultRadius == leftTopRadius) { + leftTopRadius = radius + } + if (defaultRadius == rightTopRadius) { + rightTopRadius = radius + } + if (defaultRadius == rightBottomRadius) { + rightBottomRadius = radius + } + if (defaultRadius == leftBottomRadius) { + leftBottomRadius = radius + } + array.recycle() + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + width = getWidth().toFloat() + height = getHeight().toFloat() + } + + override fun onDraw(canvas: Canvas) { + //这里做下判断,只有图片的宽高大于设置的圆角距离的时候才进行裁剪 + val maxLeft = max(leftTopRadius, leftBottomRadius) + val maxRight = max(rightTopRadius, rightBottomRadius) + val minWidth = maxLeft + maxRight + val maxTop = max(leftTopRadius, rightTopRadius) + val maxBottom = max(leftBottomRadius, rightBottomRadius) + val minHeight = maxTop + maxBottom + if (width >= minWidth && height > minHeight) { + @SuppressLint("DrawAllocation") val path = Path() + //四个角:右上,右下,左下,左上 + path.moveTo(leftTopRadius.toFloat(), 0f) + path.lineTo(width - rightTopRadius, 0f) + path.quadTo(width, 0f, width, rightTopRadius.toFloat()) + + path.lineTo(width, height - rightBottomRadius) + path.quadTo(width, height, width - rightBottomRadius, height) + + path.lineTo(leftBottomRadius.toFloat(), height) + path.quadTo(0f, height, 0f, height - leftBottomRadius) + + path.lineTo(0f, leftTopRadius.toFloat()) + path.quadTo(0f, 0f, leftTopRadius.toFloat(), 0f) + + canvas.clipPath(path) + } + super.onDraw(canvas) + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/image/PhotoView.kt b/app/src/main/java/com/novel/read/ui/widget/image/PhotoView.kt new file mode 100644 index 0000000..3658151 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/image/PhotoView.kt @@ -0,0 +1,1258 @@ +package com.novel.read.ui.widget.image + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Canvas +import android.graphics.Matrix +import android.graphics.PointF +import android.graphics.RectF +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.* +import android.view.GestureDetector.SimpleOnGestureListener +import android.view.ScaleGestureDetector.OnScaleGestureListener +import android.view.animation.DecelerateInterpolator +import android.view.animation.Interpolator +import android.widget.ImageView +import android.widget.OverScroller +import android.widget.Scroller +import androidx.appcompat.widget.AppCompatImageView +import com.novel.read.R +import com.novel.read.ui.widget.image.photo.Info +import com.novel.read.ui.widget.image.photo.OnRotateListener +import com.novel.read.ui.widget.image.photo.RotateGestureDetector +import kotlin.math.abs +import kotlin.math.roundToInt + +@Suppress("UNUSED_PARAMETER", "unused", "MemberVisibilityCanBePrivate", "PropertyName") +class PhotoView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : AppCompatImageView(context, attrs) { + val MIN_ROTATE = 35 + val ANIMA_DURING = 340 + val MAX_SCALE = 2.5f + + private var mMinRotate = 0 + var mAnimaDuring = 0 + private var mMaxScale = 0f + + var MAX_OVER_SCROLL = 0 + var MAX_FLING_OVER_SCROLL = 0 + var MAX_OVER_RESISTANCE = 0 + var MAX_ANIM_FROM_WAITE = 500 + + private val mBaseMatrix: Matrix = Matrix() + private val mAnimMatrix: Matrix = Matrix() + private val mSynthesisMatrix: Matrix = Matrix() + private val mTmpMatrix: Matrix = Matrix() + + private val mRotateDetector: RotateGestureDetector + private val mDetector: GestureDetector + private val mScaleDetector: ScaleGestureDetector + private var mClickListener: OnClickListener? = null + + private var mScaleType: ScaleType? = null + + private var hasMultiTouch = false + private var hasDrawable = false + private var isKnowSize = false + private var hasOverTranslate = false + + //缩放 + var isEnable = true + + //旋转 + var isRotateEnable = false + private var isInit = false + private var mAdjustViewBounds = false + + // 当前是否处于放大状态 + private var isZoonUp = false + private var canRotate = false + + private var imgLargeWidth = false + private var imgLargeHeight = false + + private var mRotateFlag = 0f + private var mDegrees = 0f + private var mScale = 1.0f + private var mTranslateX = 0 + private var mTranslateY = 0 + + private var mHalfBaseRectWidth = 0f + private var mHalfBaseRectHeight = 0f + + private val mWidgetRect = RectF() + private val mBaseRect = RectF() + private val mImgRect = RectF() + private val mTmpRect = RectF() + private val mCommonRect = RectF() + + private val mScreenCenter = PointF() + private val mScaleCenter = PointF() + private val mRotateCenter = PointF() + + private val mTranslate: Transform = Transform() + + private var mClip: RectF? = null + private var mFromInfo: Info? = null + private var mInfoTime: Long = 0 + private var mCompleteCallBack: Runnable? = null + + private var mLongClick: OnLongClickListener? = null + + private val mRotateListener = RotateListener() + private val mGestureListener = GestureListener() + private val mScaleListener = ScaleGestureListener() + + init { + super.setScaleType(ScaleType.MATRIX) + if (mScaleType == null) mScaleType = ScaleType.CENTER_INSIDE + mRotateDetector = RotateGestureDetector(mRotateListener) + mDetector = GestureDetector(context, mGestureListener) + mScaleDetector = ScaleGestureDetector(context, mScaleListener) + val density = resources.displayMetrics.density + MAX_OVER_SCROLL = (density * 30).toInt() + MAX_FLING_OVER_SCROLL = (density * 30).toInt() + MAX_OVER_RESISTANCE = (density * 140).toInt() + mMinRotate = MIN_ROTATE + mAnimaDuring = ANIMA_DURING + mMaxScale = MAX_SCALE + } + + /** + * 获取默认的动画持续时间 + */ + fun getDefaultAnimDuring(): Int { + return ANIMA_DURING + } + + override fun setOnClickListener(l: OnClickListener?) { + super.setOnClickListener(l) + mClickListener = l + } + + override fun setScaleType(scaleType: ScaleType) { + if (scaleType == ScaleType.MATRIX) return + if (scaleType != mScaleType) { + mScaleType = scaleType + if (isInit) { + initBase() + } + } + } + + override fun setOnLongClickListener(l: OnLongClickListener?) { + mLongClick = l + } + + /** + * 设置动画的插入器 + */ + fun setInterpolator(interpolator: Interpolator?) { + mTranslate.setInterpolator(interpolator) + } + + /** + * 获取动画持续时间 + */ + fun getAnimDuring(): Int { + return mAnimaDuring + } + + /** + * 设置动画的持续时间 + */ + fun setAnimDuring(during: Int) { + mAnimaDuring = during + } + + /** + * 设置最大可以缩放的倍数 + */ + fun setMaxScale(maxScale: Float) { + mMaxScale = maxScale + } + + /** + * 获取最大可以缩放的倍数 + */ + fun getMaxScale(): Float { + return mMaxScale + } + + /** + */ + fun setMaxAnimFromWaiteTime(wait: Int) { + MAX_ANIM_FROM_WAITE = wait + } + + @SuppressLint("UseCompatLoadingForDrawables") + override fun setImageResource(resId: Int) { + var drawable: Drawable? = null + try { + drawable = resources.getDrawable(resId, null) + } catch (e: Exception) { + } + setImageDrawable(drawable) + } + + override fun setImageDrawable(drawable: Drawable?) { + super.setImageDrawable(drawable) + if (drawable == null) { + hasDrawable = false + return + } + if (!hasSize(drawable)) return + if (!hasDrawable) { + hasDrawable = true + } + initBase() + } + + private fun hasSize(d: Drawable): Boolean { + return !((d.intrinsicHeight <= 0 || d.intrinsicWidth <= 0) + && (d.minimumWidth <= 0 || d.minimumHeight <= 0) + && (d.bounds.width() <= 0 || d.bounds.height() <= 0)) + } + + private fun getDrawableWidth(d: Drawable): Int { + var width = d.intrinsicWidth + if (width <= 0) width = d.minimumWidth + if (width <= 0) width = d.bounds.width() + return width + } + + private fun getDrawableHeight(d: Drawable): Int { + var height = d.intrinsicHeight + if (height <= 0) height = d.minimumHeight + if (height <= 0) height = d.bounds.height() + return height + } + + private fun initBase() { + if (!hasDrawable) return + if (!isKnowSize) return + mBaseMatrix.reset() + mAnimMatrix.reset() + isZoonUp = false + val img = drawable + val w = width + val h = height + val imgW = getDrawableWidth(img) + val imgH = getDrawableHeight(img) + mBaseRect[0f, 0f, imgW.toFloat()] = imgH.toFloat() + + // 以图片中心点居中位移 + val tx = (w - imgW) / 2 + val ty = (h - imgH) / 2 + var sx = 1f + var sy = 1f + + // 缩放,默认不超过屏幕大小 + if (imgW > w) { + sx = w.toFloat() / imgW + } + if (imgH > h) { + sy = h.toFloat() / imgH + } + val scale = if (sx < sy) sx else sy + mBaseMatrix.reset() + mBaseMatrix.postTranslate(tx.toFloat(), ty.toFloat()) + mBaseMatrix.postScale(scale, scale, mScreenCenter.x, mScreenCenter.y) + mBaseMatrix.mapRect(mBaseRect) + mHalfBaseRectWidth = mBaseRect.width() / 2 + mHalfBaseRectHeight = mBaseRect.height() / 2 + mScaleCenter.set(mScreenCenter) + mRotateCenter.set(mScaleCenter) + executeTranslate() + when (mScaleType) { + ScaleType.CENTER -> initCenter() + ScaleType.CENTER_CROP -> initCenterCrop() + ScaleType.CENTER_INSIDE -> initCenterInside() + ScaleType.FIT_CENTER -> initFitCenter() + ScaleType.FIT_START -> initFitStart() + ScaleType.FIT_END -> initFitEnd() + ScaleType.FIT_XY -> initFitXY() + else -> { + } + } + isInit = true + mFromInfo?.let { + if (System.currentTimeMillis() - mInfoTime < MAX_ANIM_FROM_WAITE) { + animaFrom(it) + } + } + mFromInfo = null + } + + private fun initCenter() { + if (!hasDrawable) return + if (!isKnowSize) return + val img = drawable + val imgW = getDrawableWidth(img) + val imgH = getDrawableHeight(img) + if (imgW > mWidgetRect.width() || imgH > mWidgetRect.height()) { + val scaleX = imgW / mImgRect.width() + val scaleY = imgH / mImgRect.height() + mScale = if (scaleX > scaleY) scaleX else scaleY + mAnimMatrix.postScale(mScale, mScale, mScreenCenter.x, mScreenCenter.y) + executeTranslate() + resetBase() + } + } + + private fun initCenterCrop() { + if (mImgRect.width() < mWidgetRect.width() || mImgRect.height() < mWidgetRect.height()) { + val scaleX = mWidgetRect.width() / mImgRect.width() + val scaleY = mWidgetRect.height() / mImgRect.height() + mScale = if (scaleX > scaleY) scaleX else scaleY + mAnimMatrix.postScale(mScale, mScale, mScreenCenter.x, mScreenCenter.y) + executeTranslate() + resetBase() + } + } + + private fun initCenterInside() { + if (mImgRect.width() > mWidgetRect.width() || mImgRect.height() > mWidgetRect.height()) { + val scaleX = mWidgetRect.width() / mImgRect.width() + val scaleY = mWidgetRect.height() / mImgRect.height() + mScale = if (scaleX < scaleY) scaleX else scaleY + mAnimMatrix.postScale(mScale, mScale, mScreenCenter.x, mScreenCenter.y) + executeTranslate() + resetBase() + } + } + + private fun initFitCenter() { + if (mImgRect.width() < mWidgetRect.width()) { + mScale = mWidgetRect.width() / mImgRect.width() + mAnimMatrix.postScale(mScale, mScale, mScreenCenter.x, mScreenCenter.y) + executeTranslate() + resetBase() + } + } + + private fun initFitStart() { + initFitCenter() + val ty = -mImgRect.top + mAnimMatrix.postTranslate(0f, ty) + executeTranslate() + resetBase() + mTranslateY += ty.toInt() + } + + private fun initFitEnd() { + initFitCenter() + val ty = mWidgetRect.bottom - mImgRect.bottom + mTranslateY += ty.toInt() + mAnimMatrix.postTranslate(0f, ty) + executeTranslate() + resetBase() + } + + private fun initFitXY() { + val scaleX = mWidgetRect.width() / mImgRect.width() + val scaleY = mWidgetRect.height() / mImgRect.height() + mAnimMatrix.postScale(scaleX, scaleY, mScreenCenter.x, mScreenCenter.y) + executeTranslate() + resetBase() + } + + private fun resetBase() { + val img = drawable + val imgW = getDrawableWidth(img) + val imgH = getDrawableHeight(img) + mBaseRect[0f, 0f, imgW.toFloat()] = imgH.toFloat() + mBaseMatrix.set(mSynthesisMatrix) + mBaseMatrix.mapRect(mBaseRect) + mHalfBaseRectWidth = mBaseRect.width() / 2 + mHalfBaseRectHeight = mBaseRect.height() / 2 + mScale = 1f + mTranslateX = 0 + mTranslateY = 0 + mAnimMatrix.reset() + } + + private fun executeTranslate() { + mSynthesisMatrix.set(mBaseMatrix) + mSynthesisMatrix.postConcat(mAnimMatrix) + imageMatrix = mSynthesisMatrix + mAnimMatrix.mapRect(mImgRect, mBaseRect) + imgLargeWidth = mImgRect.width() > mWidgetRect.width() + imgLargeHeight = mImgRect.height() > mWidgetRect.height() + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + if (!hasDrawable) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + return + } + val d = drawable + val drawableW = getDrawableWidth(d) + val drawableH = getDrawableHeight(d) + val pWidth = MeasureSpec.getSize(widthMeasureSpec) + val pHeight = MeasureSpec.getSize(heightMeasureSpec) + val widthMode = MeasureSpec.getMode(widthMeasureSpec) + val heightMode = MeasureSpec.getMode(heightMeasureSpec) + var width: Int + var height: Int + var p = layoutParams + if (p == null) { + p = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + } + width = if (p.width == ViewGroup.LayoutParams.MATCH_PARENT) { + if (widthMode == MeasureSpec.UNSPECIFIED) { + drawableW + } else { + pWidth + } + } else { + if (widthMode == MeasureSpec.EXACTLY) { + pWidth + } else if (widthMode == MeasureSpec.AT_MOST) { + if (drawableW > pWidth) pWidth else drawableW + } else { + drawableW + } + } + height = if (p.height == ViewGroup.LayoutParams.MATCH_PARENT) { + if (heightMode == MeasureSpec.UNSPECIFIED) { + drawableH + } else { + pHeight + } + } else { + if (heightMode == MeasureSpec.EXACTLY) { + pHeight + } else if (heightMode == MeasureSpec.AT_MOST) { + if (drawableH > pHeight) pHeight else drawableH + } else { + drawableH + } + } + if (mAdjustViewBounds && drawableW.toFloat() / drawableH != width.toFloat() / height) { + val hScale = height.toFloat() / drawableH + val wScale = width.toFloat() / drawableW + val scale = if (hScale < wScale) hScale else wScale + width = + if (p.width == ViewGroup.LayoutParams.MATCH_PARENT) width else (drawableW * scale).toInt() + height = + if (p.height == ViewGroup.LayoutParams.MATCH_PARENT) height else (drawableH * scale).toInt() + } + setMeasuredDimension(width, height) + } + + override fun setAdjustViewBounds(adjustViewBounds: Boolean) { + super.setAdjustViewBounds(adjustViewBounds) + mAdjustViewBounds = adjustViewBounds + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + mWidgetRect[0f, 0f, w.toFloat()] = h.toFloat() + mScreenCenter[w / 2.toFloat()] = h / 2.toFloat() + if (!isKnowSize) { + isKnowSize = true + initBase() + } + } + + override fun draw(canvas: Canvas) { + mClip?.let { + canvas.clipRect(it) + mClip = null + } + super.draw(canvas) + } + + override fun dispatchTouchEvent(event: MotionEvent): Boolean { + return if (isEnable) { + val action = event.actionMasked + if (event.pointerCount >= 2) hasMultiTouch = true + mDetector.onTouchEvent(event) + if (isRotateEnable) { + mRotateDetector.onTouchEvent(event) + } + mScaleDetector.onTouchEvent(event) + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) onUp() + true + } else { + super.dispatchTouchEvent(event) + } + } + + private fun onUp() { + if (mTranslate.isRunning) return + if (canRotate || mDegrees % 90 != 0f) { + var toDegrees = (mDegrees / 90).toInt() * 90.toFloat() + val remainder = mDegrees % 90 + if (remainder > 45) toDegrees += 90f else if (remainder < -45) toDegrees -= 90f + mTranslate.withRotate(mDegrees.toInt(), toDegrees.toInt()) + mDegrees = toDegrees + } + var scale = mScale + if (mScale < 1) { + scale = 1f + mTranslate.withScale(mScale, 1F) + } else if (mScale > mMaxScale) { + scale = mMaxScale + mTranslate.withScale(mScale, mMaxScale) + } + val cx = mImgRect.left + mImgRect.width() / 2 + val cy = mImgRect.top + mImgRect.height() / 2 + mScaleCenter[cx] = cy + mRotateCenter[cx] = cy + mTranslateX = 0 + mTranslateY = 0 + mTmpMatrix.reset() + mTmpMatrix.postTranslate(-mBaseRect.left, -mBaseRect.top) + mTmpMatrix.postTranslate(cx - mHalfBaseRectWidth, cy - mHalfBaseRectHeight) + mTmpMatrix.postScale(scale, scale, cx, cy) + mTmpMatrix.postRotate(mDegrees, cx, cy) + mTmpMatrix.mapRect(mTmpRect, mBaseRect) + doTranslateReset(mTmpRect) + mTranslate.start() + } + + private fun doTranslateReset(imgRect: RectF) { + var tx = 0 + var ty = 0 + if (imgRect.width() <= mWidgetRect.width()) { + if (!isImageCenterWidth(imgRect)) tx = + (-((mWidgetRect.width() - imgRect.width()) / 2 - imgRect.left)).toInt() + } else { + if (imgRect.left > mWidgetRect.left) { + tx = (imgRect.left - mWidgetRect.left).toInt() + } else if (imgRect.right < mWidgetRect.right) { + tx = (imgRect.right - mWidgetRect.right).toInt() + } + } + if (imgRect.height() <= mWidgetRect.height()) { + if (!isImageCenterHeight(imgRect)) ty = + (-((mWidgetRect.height() - imgRect.height()) / 2 - imgRect.top)).toInt() + } else { + if (imgRect.top > mWidgetRect.top) { + ty = (imgRect.top - mWidgetRect.top).toInt() + } else if (imgRect.bottom < mWidgetRect.bottom) { + ty = (imgRect.bottom - mWidgetRect.bottom).toInt() + } + } + if (tx != 0 || ty != 0) { + if (!mTranslate.mFlingScroller.isFinished) mTranslate.mFlingScroller.abortAnimation() + mTranslate.withTranslate(mTranslateX, mTranslateY, -tx, -ty) + } + } + + private fun isImageCenterHeight(rect: RectF): Boolean { + return abs(rect.top.roundToInt() - (mWidgetRect.height() - rect.height()) / 2) < 1 + } + + private fun isImageCenterWidth(rect: RectF): Boolean { + return abs(rect.left.roundToInt() - (mWidgetRect.width() - rect.width()) / 2) < 1 + } + + private fun resistanceScrollByX( + overScroll: Float, + detalX: Float + ): Float { + return detalX * (abs(abs(overScroll) - MAX_OVER_RESISTANCE) / MAX_OVER_RESISTANCE.toFloat()) + } + + private fun resistanceScrollByY( + overScroll: Float, + detalY: Float + ): Float { + return detalY * (abs(abs(overScroll) - MAX_OVER_RESISTANCE) / MAX_OVER_RESISTANCE.toFloat()) + } + + /** + * 匹配两个Rect的共同部分输出到out,若无共同部分则输出0,0,0,0 + */ + private fun mapRect(r1: RectF, r2: RectF, out: RectF) { + val l: Float = if (r1.left > r2.left) r1.left else r2.left + val r: Float = if (r1.right < r2.right) r1.right else r2.right + if (l > r) { + out[0f, 0f, 0f] = 0f + return + } + val t: Float = if (r1.top > r2.top) r1.top else r2.top + val b: Float = if (r1.bottom < r2.bottom) r1.bottom else r2.bottom + if (t > b) { + out[0f, 0f, 0f] = 0f + return + } + out[l, t, r] = b + } + + private fun checkRect() { + if (!hasOverTranslate) { + mapRect(mWidgetRect, mImgRect, mCommonRect) + } + } + + private val mClickRunnable = Runnable { + mClickListener?.onClick(this) + } + + fun canScrollHorizontallySelf(direction: Float): Boolean { + if (mImgRect.width() <= mWidgetRect.width()) + return false + if (direction < 0 && mImgRect.left.roundToInt() - direction >= mWidgetRect.left) + return false + return !(direction > 0 && mImgRect.right.roundToInt() - direction <= mWidgetRect.right) + } + + fun canScrollVerticallySelf(direction: Float): Boolean { + if (mImgRect.height() <= mWidgetRect.height()) + return false + if (direction < 0 && mImgRect.top.roundToInt() - direction >= mWidgetRect.top) + return false + return !(direction > 0 && mImgRect.bottom.roundToInt() - direction <= mWidgetRect.bottom) + } + + override fun canScrollHorizontally(direction: Int): Boolean { + return if (hasMultiTouch) true else canScrollHorizontallySelf(direction.toFloat()) + } + + override fun canScrollVertically(direction: Int): Boolean { + return if (hasMultiTouch) true else canScrollVerticallySelf(direction.toFloat()) + } + + private inner class InterpolatorProxy : Interpolator { + private var mTarget: Interpolator? + + init { + mTarget = DecelerateInterpolator() + } + + fun setTargetInterpolator(interpolator: Interpolator?) { + mTarget = interpolator + } + + override fun getInterpolation(input: Float): Float { + return mTarget?.getInterpolation(input) ?: input + } + + } + + private inner class Transform : Runnable { + var isRunning = false + var mTranslateScroller: OverScroller + var mFlingScroller: OverScroller + var mScaleScroller: Scroller + var mClipScroller: Scroller + var mRotateScroller: Scroller + var c: ClipCalculate? = null + var mLastFlingX = 0 + var mLastFlingY = 0 + var mLastTranslateX = 0 + var mLastTranslateY = 0 + var mClipRect = RectF() + var mInterpolatorProxy = InterpolatorProxy() + + fun setInterpolator(interpolator: Interpolator?) { + mInterpolatorProxy.setTargetInterpolator(interpolator) + } + + init { + val ctx: Context = context + mTranslateScroller = OverScroller(ctx, mInterpolatorProxy) + mScaleScroller = Scroller(ctx, mInterpolatorProxy) + mFlingScroller = OverScroller(ctx, mInterpolatorProxy) + mClipScroller = Scroller(ctx, mInterpolatorProxy) + mRotateScroller = Scroller(ctx, mInterpolatorProxy) + } + + fun withTranslate(startX: Int, startY: Int, deltaX: Int, deltaY: Int) { + mLastTranslateX = 0 + mLastTranslateY = 0 + mTranslateScroller.startScroll(0, 0, deltaX, deltaY, mAnimaDuring) + } + + fun withScale(form: Float, to: Float) { + mScaleScroller.startScroll( + (form * 10000).toInt(), + 0, + ((to - form) * 10000).toInt(), + 0, + mAnimaDuring + ) + } + + fun withClip( + fromX: Float, + fromY: Float, + deltaX: Float, + deltaY: Float, + d: Int, + c: ClipCalculate? + ) { + mClipScroller.startScroll( + (fromX * 10000).toInt(), + (fromY * 10000).toInt(), + (deltaX * 10000).toInt(), + (deltaY * 10000).toInt(), + d + ) + this.c = c + } + + fun withRotate(fromDegrees: Int, toDegrees: Int) { + mRotateScroller.startScroll(fromDegrees, 0, toDegrees - fromDegrees, 0, mAnimaDuring) + } + + fun withRotate(fromDegrees: Int, toDegrees: Int, during: Int) { + mRotateScroller.startScroll(fromDegrees, 0, toDegrees - fromDegrees, 0, during) + } + + fun withFling(velocityX: Float, velocityY: Float) { + mLastFlingX = if (velocityX < 0) Int.MAX_VALUE else 0 + var distanceX = + (if (velocityX > 0) abs(mImgRect.left) else mImgRect.right - mWidgetRect.right).toInt() + distanceX = if (velocityX < 0) Int.MAX_VALUE - distanceX else distanceX + var minX = if (velocityX < 0) distanceX else 0 + var maxX = if (velocityX < 0) Int.MAX_VALUE else distanceX + val overX = if (velocityX < 0) Int.MAX_VALUE - minX else distanceX + mLastFlingY = if (velocityY < 0) Int.MAX_VALUE else 0 + var distanceY = + (if (velocityY > 0) abs(mImgRect.top) else mImgRect.bottom - mWidgetRect.bottom).toInt() + distanceY = if (velocityY < 0) Int.MAX_VALUE - distanceY else distanceY + var minY = if (velocityY < 0) distanceY else 0 + var maxY = if (velocityY < 0) Int.MAX_VALUE else distanceY + val overY = if (velocityY < 0) Int.MAX_VALUE - minY else distanceY + if (velocityX == 0f) { + maxX = 0 + minX = 0 + } + if (velocityY == 0f) { + maxY = 0 + minY = 0 + } + mFlingScroller.fling( + mLastFlingX, + mLastFlingY, + velocityX.toInt(), + velocityY.toInt(), + minX, + maxX, + minY, + maxY, + if (abs(overX) < MAX_FLING_OVER_SCROLL * 2) 0 else MAX_FLING_OVER_SCROLL, + if (abs(overY) < MAX_FLING_OVER_SCROLL * 2) 0 else MAX_FLING_OVER_SCROLL + ) + } + + fun start() { + isRunning = true + postExecute() + } + + fun stop() { + removeCallbacks(this) + mTranslateScroller.abortAnimation() + mScaleScroller.abortAnimation() + mFlingScroller.abortAnimation() + mRotateScroller.abortAnimation() + isRunning = false + } + + override fun run() { + + // if (!isRuning) return; + var endAnima = true + if (mScaleScroller.computeScrollOffset()) { + mScale = mScaleScroller.currX / 10000f + endAnima = false + } + if (mTranslateScroller.computeScrollOffset()) { + val tx = mTranslateScroller.currX - mLastTranslateX + val ty = mTranslateScroller.currY - mLastTranslateY + mTranslateX += tx + mTranslateY += ty + mLastTranslateX = mTranslateScroller.currX + mLastTranslateY = mTranslateScroller.currY + endAnima = false + } + if (mFlingScroller.computeScrollOffset()) { + val x = mFlingScroller.currX - mLastFlingX + val y = mFlingScroller.currY - mLastFlingY + mLastFlingX = mFlingScroller.currX + mLastFlingY = mFlingScroller.currY + mTranslateX += x + mTranslateY += y + endAnima = false + } + if (mRotateScroller.computeScrollOffset()) { + mDegrees = mRotateScroller.currX.toFloat() + endAnima = false + } + if (mClipScroller.computeScrollOffset() || mClip != null) { + val sx = mClipScroller.currX / 10000f + val sy = mClipScroller.currY / 10000f + mTmpMatrix.setScale( + sx, + sy, + (mImgRect.left + mImgRect.right) / 2, + c!!.calculateTop() + ) + mTmpMatrix.mapRect(mClipRect, mImgRect) + if (sx == 1f) { + mClipRect.left = mWidgetRect.left + mClipRect.right = mWidgetRect.right + } + if (sy == 1f) { + mClipRect.top = mWidgetRect.top + mClipRect.bottom = mWidgetRect.bottom + } + mClip = mClipRect + } + if (!endAnima) { + applyAnima() + postExecute() + } else { + isRunning = false + + // 修复动画结束后边距有些空隙, + var needFix = false + if (imgLargeWidth) { + if (mImgRect.left > 0) { + mTranslateX -= mImgRect.left.toInt() + } else if (mImgRect.right < mWidgetRect.width()) { + mTranslateX -= (mWidgetRect.width() - mImgRect.right).toInt() + } + needFix = true + } + if (imgLargeHeight) { + if (mImgRect.top > 0) { + mTranslateY -= mImgRect.top.toInt() + } else if (mImgRect.bottom < mWidgetRect.height()) { + mTranslateY -= (mWidgetRect.height() - mImgRect.bottom).toInt() + } + needFix = true + } + if (needFix) { + applyAnima() + } + invalidate() + mCompleteCallBack?.let { + it.run() + mCompleteCallBack = null + } + } + } + + private fun applyAnima() { + mAnimMatrix.reset() + mAnimMatrix.postTranslate(-mBaseRect.left, -mBaseRect.top) + mAnimMatrix.postTranslate(mRotateCenter.x, mRotateCenter.y) + mAnimMatrix.postTranslate(-mHalfBaseRectWidth, -mHalfBaseRectHeight) + mAnimMatrix.postRotate(mDegrees, mRotateCenter.x, mRotateCenter.y) + mAnimMatrix.postScale(mScale, mScale, mScaleCenter.x, mScaleCenter.y) + mAnimMatrix.postTranslate(mTranslateX.toFloat(), mTranslateY.toFloat()) + executeTranslate() + } + + private fun postExecute() { + if (isRunning) post(this) + } + + } + + fun getInfo(): Info { + val rect = RectF() + val p = IntArray(2) + getLocation(this, p) + rect[p[0] + mImgRect.left, p[1] + mImgRect.top, p[0] + mImgRect.right] = + p[1] + mImgRect.bottom + return Info( + rect, + mImgRect, + mWidgetRect, + mBaseRect, + mScreenCenter, + mScale, + mDegrees, + mScaleType + ) + } + + fun getImageViewInfo(imgView: ImageView): Info? { + val p = IntArray(2) + getLocation(imgView, p) + val drawable: Drawable = imgView.drawable + val matrix: Matrix = imgView.imageMatrix + val width = getDrawableWidth(drawable) + val height = getDrawableHeight(drawable) + val imgRect = RectF(0F, 0F, width.toFloat(), height.toFloat()) + matrix.mapRect(imgRect) + val rect = RectF( + p[0] + imgRect.left, + p[1] + imgRect.top, + p[0] + imgRect.right, + p[1] + imgRect.bottom + ) + val widgetRect = RectF(0F, 0F, imgView.width.toFloat(), imgView.height.toFloat()) + val baseRect = RectF(widgetRect) + val screenCenter = PointF(widgetRect.width() / 2, widgetRect.height() / 2) + return Info( + rect, + imgRect, + widgetRect, + baseRect, + screenCenter, + 1F, + 0F, + imgView.scaleType + ) + } + + private fun getLocation(target: View, position: IntArray) { + position[0] += target.left + position[1] += target.top + var viewParent: ViewParent = target.parent + while (viewParent is View) { + val view: View = viewParent + if (view.id == R.id.content) return + position[0] -= view.scrollX + position[1] -= view.scrollY + position[0] += view.left + position[1] += view.top + viewParent = view.parent + } + position[0] = (position[0] + 0.5f).toInt() + position[1] = (position[1] + 0.5f).toInt() + } + + private fun reset() { + mAnimMatrix.reset() + executeTranslate() + mScale = 1f + mTranslateX = 0 + mTranslateY = 0 + } + + interface ClipCalculate { + fun calculateTop(): Float + } + + inner class START : ClipCalculate { + override fun calculateTop(): Float { + return mImgRect.top + } + } + + inner class END : ClipCalculate { + override fun calculateTop(): Float { + return mImgRect.bottom + } + } + + inner class OTHER : ClipCalculate { + override fun calculateTop(): Float { + return (mImgRect.top + mImgRect.bottom) / 2 + } + } + + /** + * 在PhotoView内部还没有图片的时候同样可以调用该方法 + * + * + * 此时并不会播放动画,当给PhotoView设置图片后会自动播放动画。 + * + * + * 若等待时间过长也没有给控件设置图片,则会忽略该动画,若要再次播放动画则需要重新调用该方法 + * (等待的时间默认500毫秒,可以通过setMaxAnimFromWaiteTime(int)设置最大等待时间) + */ + fun animaFrom(info: Info) { + if (isInit) { + reset() + val mine = getInfo() + val scaleX = info.mImgRect.width() / mine.mImgRect.width() + val scaleY = info.mImgRect.height() / mine.mImgRect.height() + val scale = if (scaleX < scaleY) scaleX else scaleY + val ocx = info.mRect.left + info.mRect.width() / 2 + val ocy = info.mRect.top + info.mRect.height() / 2 + val mcx = mine.mRect.left + mine.mRect.width() / 2 + val mcy = mine.mRect.top + mine.mRect.height() / 2 + mAnimMatrix.reset() + // mAnimaMatrix.postTranslate(-mBaseRect.left, -mBaseRect.top); + mAnimMatrix.postTranslate(ocx - mcx, ocy - mcy) + mAnimMatrix.postScale(scale, scale, ocx, ocy) + mAnimMatrix.postRotate(info.mDegrees, ocx, ocy) + executeTranslate() + mScaleCenter[ocx] = ocy + mRotateCenter[ocx] = ocy + mTranslate.withTranslate(0, 0, (-(ocx - mcx)).toInt(), (-(ocy - mcy)).toInt()) + mTranslate.withScale(scale, 1F) + mTranslate.withRotate(info.mDegrees.toInt(), 0) + if (info.mWidgetRect.width() < info.mImgRect.width() || info.mWidgetRect.height() < info.mImgRect.height()) { + var clipX = info.mWidgetRect.width() / info.mImgRect.width() + var clipY = info.mWidgetRect.height() / info.mImgRect.height() + clipX = if (clipX > 1) 1F else clipX + clipY = if (clipY > 1) 1F else clipY + val c = + if (info.mScaleType == ScaleType.FIT_START) START() else if (info.mScaleType == ScaleType.FIT_END) END() else OTHER() + mTranslate.withClip(clipX, clipY, 1 - clipX, 1 - clipY, mAnimaDuring / 3, c) + mTmpMatrix.setScale( + clipX, + clipY, + (mImgRect.left + mImgRect.right) / 2, + c.calculateTop() + ) + mTmpMatrix.mapRect(mTranslate.mClipRect, mImgRect) + mClip = mTranslate.mClipRect + } + mTranslate.start() + } else { + mFromInfo = info + mInfoTime = System.currentTimeMillis() + } + } + + fun animaTo( + info: Info, + completeCallBack: Runnable + ) { + if (isInit) { + mTranslate.stop() + mTranslateX = 0 + mTranslateY = 0 + val tcx = info.mRect.left + info.mRect.width() / 2 + val tcy = info.mRect.top + info.mRect.height() / 2 + mScaleCenter[mImgRect.left + mImgRect.width() / 2] = + mImgRect.top + mImgRect.height() / 2 + mRotateCenter.set(mScaleCenter) + + // 将图片旋转回正常位置,用以计算 + mAnimMatrix.postRotate(-mDegrees, mScaleCenter.x, mScaleCenter.y) + mAnimMatrix.mapRect(mImgRect, mBaseRect) + + // 缩放 + val scaleX = info.mImgRect.width() / mBaseRect.width() + val scaleY = info.mImgRect.height() / mBaseRect.height() + val scale = if (scaleX > scaleY) scaleX else scaleY + mAnimMatrix.postRotate(mDegrees, mScaleCenter.x, mScaleCenter.y) + mAnimMatrix.mapRect(mImgRect, mBaseRect) + mDegrees %= 360 + mTranslate.withTranslate( + 0, + 0, + (tcx - mScaleCenter.x).toInt(), + (tcy - mScaleCenter.y).toInt() + ) + mTranslate.withScale(mScale, scale) + mTranslate.withRotate(mDegrees.toInt(), info.mDegrees.toInt(), mAnimaDuring * 2 / 3) + if (info.mWidgetRect.width() < info.mRect.width() || info.mWidgetRect.height() < info.mRect.height()) { + var clipX = info.mWidgetRect.width() / info.mRect.width() + var clipY = info.mWidgetRect.height() / info.mRect.height() + clipX = if (clipX > 1) 1F else clipX + clipY = if (clipY > 1) 1F else clipY + val cx = clipX + val cy = clipY + val c = + if (info.mScaleType == ScaleType.FIT_START) START() else if (info.mScaleType == ScaleType.FIT_END) END() else OTHER() + postDelayed( + { mTranslate.withClip(1F, 1F, -1 + cx, -1 + cy, mAnimaDuring / 2, c) }, + mAnimaDuring / 2.toLong() + ) + } + mCompleteCallBack = completeCallBack + mTranslate.start() + } + } + + fun rotate(degrees: Float) { + mDegrees += degrees + val centerX = (mWidgetRect.left + mWidgetRect.width() / 2).toInt() + val centerY = (mWidgetRect.top + mWidgetRect.height() / 2).toInt() + mAnimMatrix.postRotate(degrees, centerX.toFloat(), centerY.toFloat()) + executeTranslate() + } + + inner class RotateListener : OnRotateListener { + override fun onRotate( + degrees: Float, + focusX: Float, + focusY: Float + ) { + mRotateFlag += degrees + if (canRotate) { + mDegrees += degrees + mAnimMatrix.postRotate(degrees, focusX, focusY) + } else { + if (abs(mRotateFlag) >= mMinRotate) { + canRotate = true + mRotateFlag = 0f + } + } + } + } + + inner class GestureListener : SimpleOnGestureListener() { + override fun onLongPress(e: MotionEvent) { + mLongClick?.onLongClick(this@PhotoView) + } + + override fun onDown(e: MotionEvent): Boolean { + hasOverTranslate = false + hasMultiTouch = false + canRotate = false + removeCallbacks(mClickRunnable) + return false + } + + override fun onFling( + e1: MotionEvent, + e2: MotionEvent, + velocityX: Float, + velocityY: Float + ): Boolean { + if (hasMultiTouch) return false + if (!imgLargeWidth && !imgLargeHeight) return false + if (mTranslate.isRunning) return false + var vx = velocityX + var vy = velocityY + if (mImgRect.left.roundToInt() >= mWidgetRect.left + || mImgRect.right.roundToInt() <= mWidgetRect.right + ) { + vx = 0f + } + if (mImgRect.top.roundToInt() >= mWidgetRect.top + || mImgRect.bottom.roundToInt() <= mWidgetRect.bottom + ) { + vy = 0f + } + if (canRotate || mDegrees % 90 != 0f) { + var toDegrees = (mDegrees / 90).toInt() * 90.toFloat() + val remainder = mDegrees % 90 + if (remainder > 45) toDegrees += 90f else if (remainder < -45) toDegrees -= 90f + mTranslate.withRotate(mDegrees.toInt(), toDegrees.toInt()) + mDegrees = toDegrees + } + doTranslateReset(mImgRect) + mTranslate.withFling(vx, vy) + mTranslate.start() + // onUp(e2); + return super.onFling(e1, e2, velocityX, velocityY) + } + + override fun onScroll( + e1: MotionEvent, + e2: MotionEvent, + distanceX: Float, + distanceY: Float + ): Boolean { + var x = distanceX + var y = distanceY + if (mTranslate.isRunning) { + mTranslate.stop() + } + if (canScrollHorizontallySelf(x)) { + if (x < 0 && mImgRect.left - x > mWidgetRect.left) + x = mImgRect.left + if (x > 0 && mImgRect.right - x < mWidgetRect.right) + x = mImgRect.right - mWidgetRect.right + mAnimMatrix.postTranslate(-x, 0f) + mTranslateX -= x.toInt() + } else if (imgLargeWidth || hasMultiTouch || hasOverTranslate) { + checkRect() + if (!hasMultiTouch) { + if (x < 0 && mImgRect.left - x > mCommonRect.left) x = + resistanceScrollByX(mImgRect.left - mCommonRect.left, x) + if (x > 0 && mImgRect.right - x < mCommonRect.right) x = + resistanceScrollByX(mImgRect.right - mCommonRect.right, x) + } + mTranslateX -= x.toInt() + mAnimMatrix.postTranslate(-x, 0f) + hasOverTranslate = true + } + if (canScrollVerticallySelf(y)) { + if (y < 0 && mImgRect.top - y > mWidgetRect.top) y = + mImgRect.top + if (y > 0 && mImgRect.bottom - y < mWidgetRect.bottom) y = + mImgRect.bottom - mWidgetRect.bottom + mAnimMatrix.postTranslate(0f, -y) + mTranslateY -= y.toInt() + } else if (imgLargeHeight || hasOverTranslate || hasMultiTouch) { + checkRect() + if (!hasMultiTouch) { + if (y < 0 && mImgRect.top - y > mCommonRect.top) y = + resistanceScrollByY(mImgRect.top - mCommonRect.top, y) + if (y > 0 && mImgRect.bottom - y < mCommonRect.bottom) y = + resistanceScrollByY(mImgRect.bottom - mCommonRect.bottom, y) + } + mAnimMatrix.postTranslate(0f, -y) + mTranslateY -= y.toInt() + hasOverTranslate = true + } + executeTranslate() + return true + } + + override fun onSingleTapUp(e: MotionEvent): Boolean { + postDelayed(mClickRunnable, 250) + return false + } + + override fun onDoubleTap(e: MotionEvent): Boolean { + mTranslate.stop() + val from: Float + val to: Float + val imgCx = mImgRect.left + mImgRect.width() / 2 + val imgCy = mImgRect.top + mImgRect.height() / 2 + mScaleCenter[imgCx] = imgCy + mRotateCenter[imgCx] = imgCy + mTranslateX = 0 + mTranslateY = 0 + if (isZoonUp) { + from = mScale + to = 1f + } else { + from = mScale + to = mMaxScale + mScaleCenter[e.x] = e.y + } + mTmpMatrix.reset() + mTmpMatrix.postTranslate(-mBaseRect.left, -mBaseRect.top) + mTmpMatrix.postTranslate(mRotateCenter.x, mRotateCenter.y) + mTmpMatrix.postTranslate(-mHalfBaseRectWidth, -mHalfBaseRectHeight) + mTmpMatrix.postRotate(mDegrees, mRotateCenter.x, mRotateCenter.y) + mTmpMatrix.postScale(to, to, mScaleCenter.x, mScaleCenter.y) + mTmpMatrix.postTranslate(mTranslateX.toFloat(), mTranslateY.toFloat()) + mTmpMatrix.mapRect(mTmpRect, mBaseRect) + doTranslateReset(mTmpRect) + isZoonUp = !isZoonUp + mTranslate.withScale(from, to) + mTranslate.start() + return false + } + } + + inner class ScaleGestureListener : OnScaleGestureListener { + override fun onScale(detector: ScaleGestureDetector): Boolean { + val scaleFactor = detector.scaleFactor + if (java.lang.Float.isNaN(scaleFactor) || java.lang.Float.isInfinite(scaleFactor)) return false + mScale *= scaleFactor + //mScaleCenter.set(detector.getFocusX(), detector.getFocusY()); + mAnimMatrix.postScale( + scaleFactor, + scaleFactor, + detector.focusX, + detector.focusY + ) + executeTranslate() + return true + } + + override fun onScaleBegin(detector: ScaleGestureDetector): Boolean { + return true + } + + override fun onScaleEnd(detector: ScaleGestureDetector) {} + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/image/photo/Info.kt b/app/src/main/java/com/novel/read/ui/widget/image/photo/Info.kt new file mode 100644 index 0000000..2ddabba --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/image/photo/Info.kt @@ -0,0 +1,49 @@ +package com.novel.read.ui.widget.image.photo + +import android.graphics.PointF + +import android.graphics.RectF +import android.widget.ImageView + + +@Suppress("MemberVisibilityCanBePrivate") +class Info( + rect: RectF, + img: RectF, + widget: RectF, + base: RectF, + screenCenter: PointF, + scale: Float, + degrees: Float, + scaleType: ImageView.ScaleType? +) { + // 内部图片在整个手机界面的位置 + var mRect = RectF() + + // 控件在窗口的位置 + var mImgRect = RectF() + + var mWidgetRect = RectF() + + var mBaseRect = RectF() + + var mScreenCenter = PointF() + + var mScale = 0f + + var mDegrees = 0f + + var mScaleType: ImageView.ScaleType? = null + + init { + mRect.set(rect) + mImgRect.set(img) + mWidgetRect.set(widget) + mScale = scale + mScaleType = scaleType + mDegrees = degrees + mBaseRect.set(base) + mScreenCenter.set(screenCenter) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/image/photo/RotateGestureDetector.kt b/app/src/main/java/com/novel/read/ui/widget/image/photo/RotateGestureDetector.kt new file mode 100644 index 0000000..00fcc53 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/image/photo/RotateGestureDetector.kt @@ -0,0 +1,54 @@ +package com.novel.read.ui.widget.image.photo + +import android.view.MotionEvent +import kotlin.math.abs +import kotlin.math.atan + +class RotateGestureDetector(private val mListener: OnRotateListener) { + + private val MAX_DEGREES_STEP = 120 + + private var mPrevSlope = 0f + private var mCurrSlope = 0f + + private val x1 = 0f + private val y1 = 0f + private val x2 = 0f + private val y2 = 0f + + fun onTouchEvent(event: MotionEvent) { + + when (event.actionMasked) { + MotionEvent.ACTION_POINTER_DOWN, + MotionEvent.ACTION_POINTER_UP -> { + if (event.pointerCount == 2) mPrevSlope = calculateSlope(event) + } + MotionEvent.ACTION_MOVE -> if (event.pointerCount > 1) { + mCurrSlope = calculateSlope(event) + + val currDegrees = Math.toDegrees(atan(mCurrSlope.toDouble())) + val prevDegrees = Math.toDegrees(atan(mPrevSlope.toDouble())) + + val deltaSlope = currDegrees - prevDegrees + + if (abs(deltaSlope) <= MAX_DEGREES_STEP) { + mListener.onRotate(deltaSlope.toFloat(), (x2 + x1) / 2, (y2 + y1) / 2) + } + mPrevSlope = mCurrSlope + } + } + + } + + private fun calculateSlope(event: MotionEvent): Float { + val x1 = event.getX(0) + val y1 = event.getY(0) + val x2 = event.getX(1) + val y2 = event.getY(1) + return (y2 - y1) / (x2 - x1) + } +} + +interface OnRotateListener { + fun onRotate(degrees: Float, focusX: Float, focusY: Float) +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/prefs/EditTextPreferenceDialog.kt b/app/src/main/java/com/novel/read/ui/widget/prefs/EditTextPreferenceDialog.kt new file mode 100644 index 0000000..bdb8c0f --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/prefs/EditTextPreferenceDialog.kt @@ -0,0 +1,29 @@ +package com.novel.read.ui.widget.prefs + +import android.app.Dialog +import android.os.Bundle +import androidx.preference.EditTextPreferenceDialogFragmentCompat +import androidx.preference.PreferenceDialogFragmentCompat +import com.novel.read.lib.ATH + +class EditTextPreferenceDialog : EditTextPreferenceDialogFragmentCompat() { + + companion object { + + fun newInstance(key: String): EditTextPreferenceDialog { + val fragment = EditTextPreferenceDialog() + val b = Bundle(1) + b.putString(PreferenceDialogFragmentCompat.ARG_KEY, key) + fragment.arguments = b + return fragment + } + + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + dialog.window?.setBackgroundDrawable(ATH.getDialogBackground()) + return dialog + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/prefs/ListPreferenceDialog.kt b/app/src/main/java/com/novel/read/ui/widget/prefs/ListPreferenceDialog.kt new file mode 100644 index 0000000..562f582 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/prefs/ListPreferenceDialog.kt @@ -0,0 +1,29 @@ +package com.novel.read.ui.widget.prefs + +import android.app.Dialog +import android.os.Bundle +import androidx.preference.ListPreferenceDialogFragmentCompat +import androidx.preference.PreferenceDialogFragmentCompat +import com.novel.read.lib.ATH + +class ListPreferenceDialog : ListPreferenceDialogFragmentCompat() { + + companion object { + + fun newInstance(key: String?): ListPreferenceDialog { + val fragment = ListPreferenceDialog() + val b = Bundle(1) + b.putString(PreferenceDialogFragmentCompat.ARG_KEY, key) + fragment.arguments = b + return fragment + } + + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + dialog.window?.setBackgroundDrawable(ATH.getDialogBackground()) + return dialog + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/prefs/MultiSelectListPreferenceDialog.kt b/app/src/main/java/com/novel/read/ui/widget/prefs/MultiSelectListPreferenceDialog.kt new file mode 100644 index 0000000..ee5f87c --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/prefs/MultiSelectListPreferenceDialog.kt @@ -0,0 +1,32 @@ +package com.novel.read.ui.widget.prefs + +import android.app.Dialog +import android.os.Bundle +import androidx.preference.MultiSelectListPreferenceDialogFragmentCompat +import androidx.preference.PreferenceDialogFragmentCompat +import com.novel.read.lib.ATH + +class MultiSelectListPreferenceDialog : MultiSelectListPreferenceDialogFragmentCompat() { + + companion object { + + fun newInstance(key: String?): MultiSelectListPreferenceDialog { + val fragment = + MultiSelectListPreferenceDialog() + val b = Bundle(1) + b.putString(PreferenceDialogFragmentCompat.ARG_KEY, key) + fragment.arguments = b + return fragment + } + + } + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + dialog.window?.setBackgroundDrawable(ATH.getDialogBackground()) + return dialog + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/prefs/NameListPreference.kt b/app/src/main/java/com/novel/read/ui/widget/prefs/NameListPreference.kt new file mode 100644 index 0000000..7b947a9 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/prefs/NameListPreference.kt @@ -0,0 +1,47 @@ +package com.novel.read.ui.widget.prefs + +import android.content.Context +import android.util.AttributeSet +import android.widget.TextView +import androidx.preference.ListPreference +import androidx.preference.PreferenceViewHolder +import com.novel.read.R +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* + + +class NameListPreference(context: Context, attrs: AttributeSet) : ListPreference(context, attrs) { + + private val isBottomBackground: Boolean + + init { + layoutResource = R.layout.view_preference + widgetLayoutResource = R.layout.item_fillet_text + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.Preference) + isBottomBackground = typedArray.getBoolean(R.styleable.Preference_isBottomBackground, false) + typedArray.recycle() + } + + override fun onBindViewHolder(holder: PreferenceViewHolder?) { + val v = Preference.bindView( + context, + holder, + icon, + title, + summary, + widgetLayoutResource, + R.id.text_view, + isBottomBackground = isBottomBackground + ) + if (v is TextView) { + v.text = entry + if (isBottomBackground) { + val bgColor = context.bottomBackground + val pTextColor = context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor)) + v.setTextColor(pTextColor) + } + } + super.onBindViewHolder(holder) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/prefs/Preference.kt b/app/src/main/java/com/novel/read/ui/widget/prefs/Preference.kt new file mode 100644 index 0000000..d5f90af --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/prefs/Preference.kt @@ -0,0 +1,123 @@ +package com.novel.read.ui.widget.prefs + +import android.content.Context +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.TextView +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.preference.PreferenceViewHolder +import com.novel.read.R +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* +import org.jetbrains.anko.layoutInflater +import org.jetbrains.anko.sdk27.listeners.onLongClick +import kotlin.math.roundToInt + +class Preference(context: Context, attrs: AttributeSet) : + androidx.preference.Preference(context, attrs) { + + var onLongClick: (() -> Unit)? = null + private val isBottomBackground: Boolean + + init { + layoutResource = R.layout.view_preference + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.Preference) + isBottomBackground = typedArray.getBoolean(R.styleable.Preference_isBottomBackground, false) + typedArray.recycle() + } + + companion object { + + fun bindView( + context: Context, + it: PreferenceViewHolder?, + icon: Drawable?, + title: CharSequence?, + summary: CharSequence?, + weightLayoutRes: Int? = null, + viewId: Int? = null, + weightWidth: Int = 0, + weightHeight: Int = 0, + isBottomBackground: Boolean = false + ): T? { + if (it == null) return null + val tvTitle = it.findViewById(R.id.preference_title) as TextView + tvTitle.text = title + tvTitle.isVisible = title != null && title.isNotEmpty() + val tvSummary = it.findViewById(R.id.preference_desc) as? TextView + tvSummary?.let { + tvSummary.text = summary + tvSummary.isGone = summary.isNullOrEmpty() + } + if (isBottomBackground && !tvTitle.isInEditMode) { + val isLight = ColorUtils.isColorLight(context.bottomBackground) + val pTextColor = context.getPrimaryTextColor(isLight) + tvTitle.setTextColor(pTextColor) + val sTextColor = context.getSecondaryTextColor(isLight) + tvSummary?.setTextColor(sTextColor) + } + val iconView = it.findViewById(R.id.preference_icon) + if (iconView is ImageView) { + iconView.isVisible = icon != null + iconView.setImageDrawable(icon) + iconView.setColorFilter(context.accentColor) + } + + if (weightLayoutRes != null && weightLayoutRes != 0 && viewId != null && viewId != 0) { + val lay = it.findViewById(R.id.preference_widget) + if (lay is FrameLayout) { + var needRequestLayout = false + var v = it.itemView.findViewById(viewId) + if (v == null) { + val inflater: LayoutInflater = context.layoutInflater + val childView = inflater.inflate(weightLayoutRes, null) + lay.removeAllViews() + lay.addView(childView) + lay.isVisible = true + v = lay.findViewById(viewId) + } else + needRequestLayout = true + + if (weightWidth > 0 || weightHeight > 0) { + val lp = lay.layoutParams + if (weightHeight > 0) + lp.height = + (context.resources.displayMetrics.density * weightHeight).roundToInt() + if (weightWidth > 0) + lp.width = + (context.resources.displayMetrics.density * weightWidth).roundToInt() + lay.layoutParams = lp + } else if (needRequestLayout) + v.requestLayout() + + return v + } + } + + return null + } + + } + + override fun onBindViewHolder(holder: PreferenceViewHolder?) { + bindView( + context, + holder, + icon, + title, + summary, + isBottomBackground = isBottomBackground + ) + super.onBindViewHolder(holder) + holder?.itemView?.onLongClick { + onLongClick?.invoke() + true + } + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/prefs/PreferenceCategory.kt b/app/src/main/java/com/novel/read/ui/widget/prefs/PreferenceCategory.kt new file mode 100644 index 0000000..9a6b190 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/prefs/PreferenceCategory.kt @@ -0,0 +1,53 @@ +package com.novel.read.ui.widget.prefs + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.widget.TextView +import androidx.core.view.isVisible +import androidx.preference.PreferenceCategory +import androidx.preference.PreferenceViewHolder +import com.novel.read.R +import com.novel.read.help.AppConfig +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* + + +class PreferenceCategory(context: Context, attrs: AttributeSet) : PreferenceCategory(context, attrs) { + + init { + isPersistent = true + layoutResource = R.layout.view_preference_category + } + + override fun onBindViewHolder(holder: PreferenceViewHolder?) { + super.onBindViewHolder(holder) + holder?.let { + val view = it.findViewById(R.id.preference_title) + if (view is TextView) { // && !view.isInEditMode + view.text = title + if (view.isInEditMode) return + view.setBackgroundColor(context.backgroundColor) + view.setTextColor(context.accentColor) + view.isVisible = title != null && title.isNotEmpty() + + val da = it.findViewById(R.id.preference_divider_above) + val dividerColor = if (AppConfig.isNightTheme) { + ColorUtils.shiftColor(context.backgroundColor, 1.05f) + } else { + ColorUtils.shiftColor(context.backgroundColor, 0.95f) + } + if (da is View) { + da.setBackgroundColor(dividerColor) + da.isVisible = it.isDividerAllowedAbove + } + val db = it.findViewById(R.id.preference_divider_below) + if (db is View) { + db.setBackgroundColor(dividerColor) + db.isVisible = it.isDividerAllowedBelow + } + } + } + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/prefs/SwitchPreference.kt b/app/src/main/java/com/novel/read/ui/widget/prefs/SwitchPreference.kt new file mode 100644 index 0000000..228288e --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/prefs/SwitchPreference.kt @@ -0,0 +1,41 @@ +package com.novel.read.ui.widget.prefs + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.SwitchCompat +import androidx.preference.PreferenceViewHolder +import androidx.preference.SwitchPreferenceCompat +import com.novel.read.R +import com.novel.read.lib.ATH +import com.novel.read.utils.ext.accentColor + +class SwitchPreference(context: Context, attrs: AttributeSet) : + SwitchPreferenceCompat(context, attrs) { + + private val isBottomBackground: Boolean + + init { + layoutResource = R.layout.view_preference + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.Preference) + isBottomBackground = typedArray.getBoolean(R.styleable.Preference_isBottomBackground, false) + typedArray.recycle() + } + + override fun onBindViewHolder(holder: PreferenceViewHolder?) { + val v = Preference.bindView( + context, + holder, + icon, + title, + summary, + widgetLayoutResource, + R.id.switchWidget, + isBottomBackground = isBottomBackground + ) + if (v is SwitchCompat && !v.isInEditMode) { + ATH.setTint(v, context.accentColor) + } + super.onBindViewHolder(holder) + } + +} diff --git a/app/src/main/java/com/novel/read/ui/widget/recycler/ItemTouchCallback.kt b/app/src/main/java/com/novel/read/ui/widget/recycler/ItemTouchCallback.kt new file mode 100644 index 0000000..7bea5de --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/recycler/ItemTouchCallback.kt @@ -0,0 +1,133 @@ +package com.novel.read.ui.widget.recycler + + +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import androidx.viewpager.widget.ViewPager + +@Suppress("MemberVisibilityCanBePrivate") +class ItemTouchCallback(private val callback: Callback) : ItemTouchHelper.Callback() { + + private var swipeRefreshLayout: SwipeRefreshLayout? = null + private var viewPager: ViewPager? = null + + /** + * 是否可以拖拽 + */ + var isCanDrag = false + + /** + * 是否可以被滑动 + */ + var isCanSwipe = false + + /** + * 当Item被长按的时候是否可以被拖拽 + */ + override fun isLongPressDragEnabled(): Boolean { + return isCanDrag + } + + /** + * Item是否可以被滑动(H:左右滑动,V:上下滑动) + */ + override fun isItemViewSwipeEnabled(): Boolean { + return isCanSwipe + } + + /** + * 当用户拖拽或者滑动Item的时候需要我们告诉系统滑动或者拖拽的方向 + */ + override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { + val layoutManager = recyclerView.layoutManager + if (layoutManager is GridLayoutManager) {// GridLayoutManager + // flag如果值是0,相当于这个功能被关闭 + val dragFlag = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT or ItemTouchHelper.UP or ItemTouchHelper.DOWN + val swipeFlag = 0 + // create make + return makeMovementFlags(dragFlag, swipeFlag) + } else if (layoutManager is LinearLayoutManager) {// linearLayoutManager + val linearLayoutManager = layoutManager as LinearLayoutManager? + val orientation = linearLayoutManager!!.orientation + + var dragFlag = 0 + var swipeFlag = 0 + + // 为了方便理解,相当于分为横着的ListView和竖着的ListView + if (orientation == LinearLayoutManager.HORIZONTAL) {// 如果是横向的布局 + swipeFlag = ItemTouchHelper.UP or ItemTouchHelper.DOWN + dragFlag = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT + } else if (orientation == LinearLayoutManager.VERTICAL) {// 如果是竖向的布局,相当于ListView + dragFlag = ItemTouchHelper.UP or ItemTouchHelper.DOWN + swipeFlag = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT + } + return makeMovementFlags(dragFlag, swipeFlag) + } + return 0 + } + + /** + * 当Item被拖拽的时候被回调 + * + * @param recyclerView recyclerView + * @param srcViewHolder 拖拽的ViewHolder + * @param targetViewHolder 目的地的viewHolder + */ + override fun onMove( + recyclerView: RecyclerView, + srcViewHolder: RecyclerView.ViewHolder, + targetViewHolder: RecyclerView.ViewHolder + ): Boolean { + return callback.onMove(srcViewHolder.adapterPosition, targetViewHolder.adapterPosition) + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + callback.onSwiped(viewHolder.adapterPosition) + } + + override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { + super.onSelectedChanged(viewHolder, actionState) + val swiping = actionState == ItemTouchHelper.ACTION_STATE_DRAG + swipeRefreshLayout?.isEnabled = !swiping + viewPager?.requestDisallowInterceptTouchEvent(swiping) + } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + callback.onClearView(recyclerView, viewHolder) + } + + interface Callback { + + /** + * 当某个Item被滑动删除的时候 + * + * @param adapterPosition item的position + */ + fun onSwiped(adapterPosition: Int) { + + } + + /** + * 当两个Item位置互换的时候被回调 + * + * @param srcPosition 拖拽的item的position + * @param targetPosition 目的地的Item的position + * @return 开发者处理了操作应该返回true,开发者没有处理就返回false + */ + fun onMove(srcPosition: Int, targetPosition: Int): Boolean { + return true + } + + /** + * 手指松开 + */ + fun onClearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + + } + + } +} diff --git a/app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollRecyclerView.kt b/app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollRecyclerView.kt new file mode 100644 index 0000000..5aca7c6 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollRecyclerView.kt @@ -0,0 +1,165 @@ +package com.novel.read.ui.widget.scroller + +import android.content.Context +import android.util.AttributeSet +import android.view.ViewGroup +import androidx.annotation.ColorInt +import androidx.recyclerview.widget.RecyclerView +import com.novel.read.R + +@Suppress("MemberVisibilityCanBePrivate", "unused") +class FastScrollRecyclerView : RecyclerView { + + private lateinit var mFastScroller: FastScroller + + constructor(context: Context) : super(context) { + layout(context, null) + layoutParams = + LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + } + + @JvmOverloads + constructor( + context: Context, + attrs: AttributeSet, + defStyleAttr: Int = 0 + ) : super(context, attrs, defStyleAttr) { + layout(context, attrs) + } + + private fun layout(context: Context, attrs: AttributeSet?) { + mFastScroller = FastScroller(context, attrs) + mFastScroller.id = R.id.fast_scroller + } + + override fun setAdapter(adapter: Adapter<*>?) { + super.setAdapter(adapter) + if (adapter is FastScroller.SectionIndexer) { + setSectionIndexer(adapter as FastScroller.SectionIndexer?) + } else if (adapter == null) { + setSectionIndexer(null) + } + } + + + override fun setVisibility(visibility: Int) { + super.setVisibility(visibility) + mFastScroller.visibility = visibility + } + + + /** + * Set the [FastScroller.SectionIndexer] for the [FastScroller]. + * + * @param sectionIndexer The SectionIndexer that provides section text for the FastScroller + */ + fun setSectionIndexer(sectionIndexer: FastScroller.SectionIndexer?) { + mFastScroller.setSectionIndexer(sectionIndexer) + } + + + /** + * Set the enabled state of fast scrolling. + * + * @param enabled True to enable fast scrolling, false otherwise + */ + fun setFastScrollEnabled(enabled: Boolean) { + mFastScroller.isEnabled = enabled + } + + + /** + * Hide the scrollbar when not scrolling. + * + * @param hideScrollbar True to hide the scrollbar, false to show + */ + fun setHideScrollbar(hideScrollbar: Boolean) { + mFastScroller.setFadeScrollbar(hideScrollbar) + } + + /** + * Display a scroll track while scrolling. + * + * @param visible True to show scroll track, false to hide + */ + fun setTrackVisible(visible: Boolean) { + mFastScroller.setTrackVisible(visible) + } + + /** + * Set the color of the scroll track. + * + * @param color The color for the scroll track + */ + fun setTrackColor(@ColorInt color: Int) { + mFastScroller.setTrackColor(color) + } + + + /** + * Set the color for the scroll handle. + * + * @param color The color for the scroll handle + */ + fun setHandleColor(@ColorInt color: Int) { + mFastScroller.setHandleColor(color) + } + + + /** + * Show the section bubble while scrolling. + * + * @param visible True to show the bubble, false to hide + */ + fun setBubbleVisible(visible: Boolean) { + mFastScroller.setBubbleVisible(visible) + } + + + /** + * Set the background color of the index bubble. + * + * @param color The background color for the index bubble + */ + fun setBubbleColor(@ColorInt color: Int) { + mFastScroller.setBubbleColor(color) + } + + + /** + * Set the text color of the index bubble. + * + * @param color The text color for the index bubble + */ + fun setBubbleTextColor(@ColorInt color: Int) { + mFastScroller.setBubbleTextColor(color) + } + + + /** + * Set the fast scroll state change listener. + * + * @param fastScrollStateChangeListener The interface that will listen to fastscroll state change events + */ + fun setFastScrollStateChangeListener(fastScrollStateChangeListener: FastScrollStateChangeListener) { + mFastScroller.setFastScrollStateChangeListener(fastScrollStateChangeListener) + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + mFastScroller.attachRecyclerView(this) + val parent = parent + if (parent is ViewGroup) { + parent.addView(mFastScroller) + mFastScroller.setLayoutParams(parent) + } + } + + + override fun onDetachedFromWindow() { + mFastScroller.detachRecyclerView() + super.onDetachedFromWindow() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollStateChangeListener.kt b/app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollStateChangeListener.kt new file mode 100644 index 0000000..8302a84 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/scroller/FastScrollStateChangeListener.kt @@ -0,0 +1,15 @@ +package com.novel.read.ui.widget.scroller + + +interface FastScrollStateChangeListener { + + /** + * Called when fast scrolling begins + */ + fun onFastScrollStart(fastScroller: FastScroller) + + /** + * Called when fast scrolling ends + */ + fun onFastScrollStop(fastScroller: FastScroller) +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/ui/widget/scroller/FastScroller.kt b/app/src/main/java/com/novel/read/ui/widget/scroller/FastScroller.kt new file mode 100644 index 0000000..d237253 --- /dev/null +++ b/app/src/main/java/com/novel/read/ui/widget/scroller/FastScroller.kt @@ -0,0 +1,519 @@ +package com.novel.read.ui.widget.scroller + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.view.ViewPropertyAnimator +import android.widget.* +import androidx.annotation.ColorInt +import androidx.annotation.IdRes +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat +import androidx.core.view.GravityCompat +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.novel.read.R +import com.novel.read.utils.ColorUtils +import com.novel.read.utils.ext.* +import kotlin.math.max +import kotlin.math.min +import kotlin.math.roundToInt + + +@Suppress("SameParameterValue") +class FastScroller : LinearLayout { + @ColorInt + private var mBubbleColor: Int = 0 + + @ColorInt + private var mHandleColor: Int = 0 + private var mBubbleHeight: Int = 0 + private var mHandleHeight: Int = 0 + private var mViewHeight: Int = 0 + private var mFadeScrollbar: Boolean = false + private var mShowBubble: Boolean = false + private var mSectionIndexer: SectionIndexer? = null + private var mScrollbarAnimator: ViewPropertyAnimator? = null + private var mBubbleAnimator: ViewPropertyAnimator? = null + private var mRecyclerView: RecyclerView? = null + private lateinit var mBubbleView: TextView + private lateinit var mHandleView: ImageView + private lateinit var mTrackView: ImageView + private lateinit var mScrollbar: View + private var mBubbleImage: Drawable? = null + private var mHandleImage: Drawable? = null + private var mTrackImage: Drawable? = null + private var mFastScrollStateChangeListener: FastScrollStateChangeListener? = null + private val mScrollbarHider = Runnable { this.hideScrollbar() } + + private val mScrollListener = object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + if (!mHandleView.isSelected && isEnabled) { + setViewPositions(getScrollProportion(recyclerView)) + } + } + + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + if (isEnabled) { + when (newState) { + RecyclerView.SCROLL_STATE_DRAGGING -> { + handler.removeCallbacks(mScrollbarHider) + cancelAnimation(mScrollbarAnimator) + if (!isViewVisible(mScrollbar)) { + showScrollbar() + } + } + RecyclerView.SCROLL_STATE_IDLE -> if (mFadeScrollbar && !mHandleView.isSelected) { + handler.postDelayed(mScrollbarHider, sScrollbarHideDelay.toLong()) + } + } + } + } + } + + constructor(context: Context) : super(context) { + layout(context, null) + layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT) + } + + @JvmOverloads + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int = 0) : super(context, attrs, defStyleAttr) { + layout(context, attrs) + layoutParams = generateLayoutParams(attrs) + } + + override fun setLayoutParams(params: ViewGroup.LayoutParams) { + params.width = LayoutParams.WRAP_CONTENT + super.setLayoutParams(params) + } + + fun setLayoutParams(viewGroup: ViewGroup) { + @IdRes val recyclerViewId = mRecyclerView?.id ?: View.NO_ID + val marginTop = resources.getDimensionPixelSize(R.dimen.fastscroll_scrollbar_margin_top) + val marginBottom = resources.getDimensionPixelSize(R.dimen.fastscroll_scrollbar_margin_bottom) + require(recyclerViewId != View.NO_ID) { "RecyclerView must have a view ID" } + when (viewGroup) { + is ConstraintLayout -> { + val constraintSet = ConstraintSet() + @IdRes val layoutId = id + constraintSet.clone(viewGroup) + constraintSet.connect(layoutId, ConstraintSet.TOP, recyclerViewId, ConstraintSet.TOP) + constraintSet.connect(layoutId, ConstraintSet.BOTTOM, recyclerViewId, ConstraintSet.BOTTOM) + constraintSet.connect(layoutId, ConstraintSet.END, recyclerViewId, ConstraintSet.END) + constraintSet.applyTo(viewGroup) + val layoutParams = layoutParams as ConstraintLayout.LayoutParams + layoutParams.setMargins(0, marginTop, 0, marginBottom) + setLayoutParams(layoutParams) + } + is CoordinatorLayout -> { + val layoutParams = layoutParams as CoordinatorLayout.LayoutParams + layoutParams.anchorId = recyclerViewId + layoutParams.anchorGravity = GravityCompat.END + layoutParams.setMargins(0, marginTop, 0, marginBottom) + setLayoutParams(layoutParams) + } + is FrameLayout -> { + val layoutParams = layoutParams as FrameLayout.LayoutParams + layoutParams.gravity = GravityCompat.END + layoutParams.setMargins(0, marginTop, 0, marginBottom) + setLayoutParams(layoutParams) + } + is RelativeLayout -> { + val layoutParams = layoutParams as RelativeLayout.LayoutParams + val endRule = RelativeLayout.ALIGN_END + layoutParams.addRule(RelativeLayout.ALIGN_TOP, recyclerViewId) + layoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, recyclerViewId) + layoutParams.addRule(endRule, recyclerViewId) + layoutParams.setMargins(0, marginTop, 0, marginBottom) + setLayoutParams(layoutParams) + } + else -> throw IllegalArgumentException("Parent ViewGroup must be a ConstraintLayout, CoordinatorLayout, FrameLayout, or RelativeLayout") + } + updateViewHeights() + } + + fun setSectionIndexer(sectionIndexer: SectionIndexer?) { + mSectionIndexer = sectionIndexer + } + + fun attachRecyclerView(recyclerView: RecyclerView) { + mRecyclerView = recyclerView + if (mRecyclerView != null) { + mRecyclerView!!.addOnScrollListener(mScrollListener) + post { + // set initial positions for bubble and handle + setViewPositions(getScrollProportion(mRecyclerView)) + } + } + } + + fun detachRecyclerView() { + if (mRecyclerView != null) { + mRecyclerView!!.removeOnScrollListener(mScrollListener) + mRecyclerView = null + } + } + + /** + * Hide the scrollbar when not scrolling. + * + * @param fadeScrollbar True to hide the scrollbar, false to show + */ + fun setFadeScrollbar(fadeScrollbar: Boolean) { + mFadeScrollbar = fadeScrollbar + mScrollbar.visibility = if (fadeScrollbar) View.INVISIBLE else View.VISIBLE + } + + /** + * Show the section bubble while scrolling. + * + * @param visible True to show the bubble, false to hide + */ + fun setBubbleVisible(visible: Boolean) { + mShowBubble = visible + } + + /** + * Display a scroll track while scrolling. + * + * @param visible True to show scroll track, false to hide + */ + fun setTrackVisible(visible: Boolean) { + mTrackView.visibility = if (visible) View.VISIBLE else View.INVISIBLE + } + + /** + * Set the color of the scroll track. + * + * @param color The color for the scroll track + */ + fun setTrackColor(@ColorInt color: Int) { + if (mTrackImage == null) { + val drawable = ContextCompat.getDrawable(context, R.drawable.fastscroll_track) + if (drawable != null) { + mTrackImage = DrawableCompat.wrap(drawable) + } + } + DrawableCompat.setTint(mTrackImage!!, color) + mTrackView.setImageDrawable(mTrackImage) + } + + /** + * Set the color for the scroll handle. + * + * @param color The color for the scroll handle + */ + fun setHandleColor(@ColorInt color: Int) { + mHandleColor = color + if (mHandleImage == null) { + val drawable = ContextCompat.getDrawable(context, R.drawable.fastscroll_handle) + if (drawable != null) { + mHandleImage = DrawableCompat.wrap(drawable) + } + } + DrawableCompat.setTint(mHandleImage!!, mHandleColor) + mHandleView.setImageDrawable(mHandleImage) + } + + /** + * Set the background color of the index bubble. + * + * @param color The background color for the index bubble + */ + fun setBubbleColor(@ColorInt color: Int) { + mBubbleColor = color + if (mBubbleImage == null) { + val drawable = ContextCompat.getDrawable(context, R.drawable.fastscroll_bubble) + if (drawable != null) { + mBubbleImage = DrawableCompat.wrap(drawable) + } + } + DrawableCompat.setTint(mBubbleImage!!, mBubbleColor) + mBubbleView.background = mBubbleImage + } + + /** + * Set the text color of the index bubble. + * + * @param color The text color for the index bubble + */ + fun setBubbleTextColor(@ColorInt color: Int) { + mBubbleView.setTextColor(color) + } + + /** + * Set the fast scroll state change listener. + * + * @param fastScrollStateChangeListener The interface that will listen to fastscroll state change events + */ + fun setFastScrollStateChangeListener(fastScrollStateChangeListener: FastScrollStateChangeListener) { + mFastScrollStateChangeListener = fastScrollStateChangeListener + } + + override fun setEnabled(enabled: Boolean) { + super.setEnabled(enabled) + visibility = if (enabled) View.VISIBLE else View.INVISIBLE + } + + @SuppressLint("ClickableViewAccessibility") + override fun onTouchEvent(event: MotionEvent): Boolean { + when (event.action) { + MotionEvent.ACTION_DOWN -> { + if (event.x < mHandleView.x - ViewCompat.getPaddingStart(mHandleView)) { + return false + } + requestDisallowInterceptTouchEvent(true) + setHandleSelected(true) + handler.removeCallbacks(mScrollbarHider) + cancelAnimation(mScrollbarAnimator) + cancelAnimation(mBubbleAnimator) + if (!isViewVisible(mScrollbar)) { + showScrollbar() + } + if (mShowBubble && mSectionIndexer != null) { + showBubble() + } + if (mFastScrollStateChangeListener != null) { + mFastScrollStateChangeListener!!.onFastScrollStart(this) + } + val y = event.y + setViewPositions(y) + setRecyclerViewPosition(y) + return true + } + MotionEvent.ACTION_MOVE -> { + val y = event.y + setViewPositions(y) + setRecyclerViewPosition(y) + return true + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + requestDisallowInterceptTouchEvent(false) + setHandleSelected(false) + if (mFadeScrollbar) { + handler.postDelayed(mScrollbarHider, sScrollbarHideDelay.toLong()) + } + hideBubble() + if (mFastScrollStateChangeListener != null) { + mFastScrollStateChangeListener!!.onFastScrollStop(this) + } + return true + } + } + return super.onTouchEvent(event) + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + mViewHeight = h + } + + private fun setRecyclerViewPosition(y: Float) { + if (mRecyclerView != null && mRecyclerView!!.adapter != null) { + val itemCount = mRecyclerView!!.adapter!!.itemCount + val proportion: Float = when { + mHandleView.y == 0f -> 0f + mHandleView.y + mHandleHeight >= mViewHeight - sTrackSnapRange -> 1f + else -> y / mViewHeight.toFloat() + } + var scrolledItemCount = (proportion * itemCount).roundToInt() + if (isLayoutReversed(mRecyclerView!!.layoutManager!!)) { + scrolledItemCount = itemCount - scrolledItemCount + } + val targetPos = getValueInRange(0, itemCount - 1, scrolledItemCount) + mRecyclerView!!.layoutManager!!.scrollToPosition(targetPos) + if (mShowBubble && mSectionIndexer != null) { + mBubbleView.text = mSectionIndexer!!.getSectionText(targetPos) + } + } + } + + private fun getScrollProportion(recyclerView: RecyclerView?): Float { + if (recyclerView == null) { + return 0f + } + val verticalScrollOffset = recyclerView.computeVerticalScrollOffset() + val verticalScrollRange = recyclerView.computeVerticalScrollRange() + val rangeDiff = (verticalScrollRange - mViewHeight).toFloat() + val proportion = verticalScrollOffset.toFloat() / if (rangeDiff > 0) rangeDiff else 1f + return mViewHeight * proportion + } + + private fun getValueInRange(min: Int, max: Int, value: Int): Int { + val minimum = max(min, value) + return min(minimum, max) + } + + private fun setViewPositions(y: Float) { + mBubbleHeight = mBubbleView.height + mHandleHeight = mHandleView.height + val bubbleY = getValueInRange(0, mViewHeight - mBubbleHeight - mHandleHeight / 2, (y - mBubbleHeight).toInt()) + val handleY = getValueInRange(0, mViewHeight - mHandleHeight, (y - mHandleHeight / 2).toInt()) + if (mShowBubble) { + mBubbleView.y = bubbleY.toFloat() + } + mHandleView.y = handleY.toFloat() + } + + private fun updateViewHeights() { + val measureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED) + mBubbleView.measure(measureSpec, measureSpec) + mBubbleHeight = mBubbleView.measuredHeight + mHandleView.measure(measureSpec, measureSpec) + mHandleHeight = mHandleView.measuredHeight + } + + private fun isLayoutReversed(layoutManager: RecyclerView.LayoutManager): Boolean { + if (layoutManager is LinearLayoutManager) { + return layoutManager.reverseLayout + } else if (layoutManager is StaggeredGridLayoutManager) { + return layoutManager.reverseLayout + } + return false + } + + private fun isViewVisible(view: View?): Boolean { + return view != null && view.visibility == View.VISIBLE + } + + private fun cancelAnimation(animator: ViewPropertyAnimator?) { + animator?.cancel() + } + + private fun showBubble() { + if (!isViewVisible(mBubbleView)) { + mBubbleView.visibility = View.VISIBLE + mBubbleAnimator = mBubbleView.animate().alpha(1f) + .setDuration(sBubbleAnimDuration.toLong()) + .setListener(object : AnimatorListenerAdapter() { + + // adapter required for new alpha value to stick + }) + } + } + + private fun hideBubble() { + if (isViewVisible(mBubbleView)) { + mBubbleAnimator = mBubbleView.animate().alpha(0f) + .setDuration(sBubbleAnimDuration.toLong()) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + mBubbleView.visibility = View.INVISIBLE + mBubbleAnimator = null + } + + override fun onAnimationCancel(animation: Animator) { + super.onAnimationCancel(animation) + mBubbleView.visibility = View.INVISIBLE + mBubbleAnimator = null + } + }) + } + } + + private fun showScrollbar() { + mRecyclerView?.let { mRecyclerView -> + if (mRecyclerView.computeVerticalScrollRange() - mViewHeight > 0) { + val transX = resources.getDimensionPixelSize(R.dimen.fastscroll_scrollbar_padding_end).toFloat() + mScrollbar.translationX = transX + mScrollbar.visibility = View.VISIBLE + mScrollbarAnimator = mScrollbar.animate().translationX(0f).alpha(1f) + .setDuration(sScrollbarAnimDuration.toLong()) + .setListener(object : AnimatorListenerAdapter() { + + // adapter required for new alpha value to stick + }) + } + } + } + + private fun hideScrollbar() { + val transX = resources.getDimensionPixelSize(R.dimen.fastscroll_scrollbar_padding_end).toFloat() + mScrollbarAnimator = mScrollbar.animate().translationX(transX).alpha(0f) + .setDuration(sScrollbarAnimDuration.toLong()) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + mScrollbar.visibility = View.INVISIBLE + mScrollbarAnimator = null + } + + override fun onAnimationCancel(animation: Animator) { + super.onAnimationCancel(animation) + mScrollbar.visibility = View.INVISIBLE + mScrollbarAnimator = null + } + }) + } + + private fun setHandleSelected(selected: Boolean) { + mHandleView.isSelected = selected + DrawableCompat.setTint(mHandleImage!!, if (selected) mBubbleColor else mHandleColor) + } + + private fun layout(context: Context, attrs: AttributeSet?) { + View.inflate(context, R.layout.view_fastscroller, this) + clipChildren = false + orientation = HORIZONTAL + mBubbleView = findViewById(R.id.fastscroll_bubble) + mHandleView = findViewById(R.id.fastscroll_handle) + mTrackView = findViewById(R.id.fastscroll_track) + mScrollbar = findViewById(R.id.fastscroll_scrollbar) + @ColorInt var bubbleColor = ColorUtils.adjustAlpha(context.accentColor, 0.8f) + @ColorInt var handleColor = context.accentColor + @ColorInt var trackColor = context.getCompatColor(R.color.transparent30) + @ColorInt var textColor = + if (ColorUtils.isColorLight(bubbleColor)) Color.BLACK else Color.WHITE + var fadeScrollbar = true + var showBubble = false + var showTrack = true + if (attrs != null) { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.FastScroller, 0, 0) + try { + bubbleColor = typedArray.getColor(R.styleable.FastScroller_bubbleColor, bubbleColor) + handleColor = typedArray.getColor(R.styleable.FastScroller_handleColor, handleColor) + trackColor = typedArray.getColor(R.styleable.FastScroller_trackColor, trackColor) + textColor = typedArray.getColor(R.styleable.FastScroller_bubbleTextColor, textColor) + fadeScrollbar = + typedArray.getBoolean(R.styleable.FastScroller_fadeScrollbar, fadeScrollbar) + showBubble = typedArray.getBoolean(R.styleable.FastScroller_showBubble, showBubble) + showTrack = typedArray.getBoolean(R.styleable.FastScroller_showTrack, showTrack) + } finally { + typedArray.recycle() + } + } + setTrackColor(trackColor) + setHandleColor(handleColor) + setBubbleColor(bubbleColor) + setBubbleTextColor(textColor) + setFadeScrollbar(fadeScrollbar) + setBubbleVisible(showBubble) + setTrackVisible(showTrack) + } + + interface SectionIndexer { + fun getSectionText(position: Int): String + } + + companion object { + private const val sBubbleAnimDuration = 100 + private const val sScrollbarAnimDuration = 300 + private const val sScrollbarHideDelay = 1000 + private const val sTrackSnapRange = 5 + } + +} diff --git a/app/src/main/java/com/novel/read/user/UserManager.kt b/app/src/main/java/com/novel/read/user/UserManager.kt new file mode 100644 index 0000000..f00860a --- /dev/null +++ b/app/src/main/java/com/novel/read/user/UserManager.kt @@ -0,0 +1,5 @@ +package com.novel.read.user + +object UserManager { + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/user/VipHelper.kt b/app/src/main/java/com/novel/read/user/VipHelper.kt new file mode 100644 index 0000000..1dc9170 --- /dev/null +++ b/app/src/main/java/com/novel/read/user/VipHelper.kt @@ -0,0 +1,28 @@ +package com.novel.read.user + +import com.novel.read.App +import com.novel.read.data.db.entity.User + +object VipHelper { + + var user: User? = null + + fun notifyUser() { + user = App.db.getUserDao().getUser() + } + + fun showAd(): Boolean { + return false +// return if (user == null) { +// true +// } else { +// !isVip(user) +// } + } + + private fun isVip(user: User?): Boolean { + val currentTime = System.currentTimeMillis() + return user?.vipStatus == 1 && currentTime > user.vipStartTime!! && currentTime < user.vipEndTime!! + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/AnimationUtilsSupport.kt b/app/src/main/java/com/novel/read/utils/AnimationUtilsSupport.kt new file mode 100644 index 0000000..b688ea0 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/AnimationUtilsSupport.kt @@ -0,0 +1,17 @@ +package com.novel.read.utils + +import android.content.Context +import android.view.animation.Animation +import android.view.animation.AnimationUtils +import androidx.annotation.AnimRes +import com.novel.read.help.AppConfig + +object AnimationUtilsSupport { + fun loadAnimation(context: Context, @AnimRes id: Int): Animation { + val animation = AnimationUtils.loadAnimation(context, id) + if (AppConfig.isEInkMode) { + animation.duration = 0 + } + return animation + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/BitmapUtils.kt b/app/src/main/java/com/novel/read/utils/BitmapUtils.kt new file mode 100644 index 0000000..72e566a --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/BitmapUtils.kt @@ -0,0 +1,286 @@ +package com.novel.read.utils + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Bitmap.Config +import android.graphics.BitmapFactory +import android.graphics.Canvas +import android.graphics.Color +import android.renderscript.Allocation +import android.renderscript.Element +import android.renderscript.RenderScript +import android.renderscript.ScriptIntrinsicBlur +import android.view.View +import com.novel.read.App +import java.io.IOException +import kotlin.jvm.Throws +import kotlin.math.* + + +@Suppress("unused", "WeakerAccess") +object BitmapUtils { + + /** + * 从path中获取图片信息,在通过BitmapFactory.decodeFile(String path)方法将突破转成Bitmap时, + * 遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。所以用到了我们上面提到的BitmapFactory.Options这个类。 + * + * @param path 文件路径 + * @param width 想要显示的图片的宽度 + * @param height 想要显示的图片的高度 + * @return + */ + fun decodeBitmap(path: String, width: Int, height: Int): Bitmap { + val op = BitmapFactory.Options() + // inJustDecodeBounds如果设置为true,仅仅返回图片实际的宽和高,宽和高是赋值给opts.outWidth,opts.outHeight; + op.inJustDecodeBounds = true + BitmapFactory.decodeFile(path, op) //获取尺寸信息 + //获取比例大小 + val wRatio = ceil((op.outWidth / width).toDouble()).toInt() + val hRatio = ceil((op.outHeight / height).toDouble()).toInt() + //如果超出指定大小,则缩小相应的比例 + if (wRatio > 1 && hRatio > 1) { + if (wRatio > hRatio) { + op.inSampleSize = wRatio + } else { + op.inSampleSize = hRatio + } + } + op.inJustDecodeBounds = false + return BitmapFactory.decodeFile(path, op) + } + + /** 从path中获取Bitmap图片 + * @param path 图片路径 + * @return + */ + fun decodeBitmap(path: String): Bitmap { + val opts = BitmapFactory.Options() + opts.inJustDecodeBounds = true + BitmapFactory.decodeFile(path, opts) + opts.inSampleSize = computeSampleSize(opts, -1, 128 * 128) + opts.inJustDecodeBounds = false + + return BitmapFactory.decodeFile(path, opts) + } + + /** + * 以最省内存的方式读取本地资源的图片 + * @param context 设备上下文 + * @param resId 资源ID + * @return + */ + fun decodeBitmap(context: Context, resId: Int): Bitmap? { + val opt = BitmapFactory.Options() + opt.inPreferredConfig = Config.RGB_565 + //获取资源图片 + val `is` = context.resources.openRawResource(resId) + return BitmapFactory.decodeStream(`is`, null, opt) + } + + /** + * @param context 设备上下文 + * @param resId 资源ID + * @param width + * @param height + * @return + */ + fun decodeBitmap(context: Context, resId: Int, width: Int, height: Int): Bitmap? { + + var inputStream = context.resources.openRawResource(resId) + + val op = BitmapFactory.Options() + // inJustDecodeBounds如果设置为true,仅仅返回图片实际的宽和高,宽和高是赋值给opts.outWidth,opts.outHeight; + op.inJustDecodeBounds = true + BitmapFactory.decodeStream(inputStream, null, op) //获取尺寸信息 + //获取比例大小 + val wRatio = ceil((op.outWidth / width).toDouble()).toInt() + val hRatio = ceil((op.outHeight / height).toDouble()).toInt() + //如果超出指定大小,则缩小相应的比例 + if (wRatio > 1 && hRatio > 1) { + if (wRatio > hRatio) { + op.inSampleSize = wRatio + } else { + op.inSampleSize = hRatio + } + } + inputStream = context.resources.openRawResource(resId) + op.inJustDecodeBounds = false + return BitmapFactory.decodeStream(inputStream, null, op) + } + + /** + * @param context 设备上下文 + * @param fileNameInAssets Assets里面文件的名称 + * @param width 图片的宽度 + * @param height 图片的高度 + * @return Bitmap + * @throws IOException + */ + @Throws(IOException::class) + fun decodeAssetsBitmap( + context: Context, + fileNameInAssets: String, + width: Int, + height: Int + ): Bitmap? { + var inputStream = context.assets.open(fileNameInAssets) + val op = BitmapFactory.Options() + // inJustDecodeBounds如果设置为true,仅仅返回图片实际的宽和高,宽和高是赋值给opts.outWidth,opts.outHeight; + op.inJustDecodeBounds = true + BitmapFactory.decodeStream(inputStream, null, op) //获取尺寸信息 + //获取比例大小 + val wRatio = ceil((op.outWidth / width).toDouble()).toInt() + val hRatio = ceil((op.outHeight / height).toDouble()).toInt() + //如果超出指定大小,则缩小相应的比例 + if (wRatio > 1 && hRatio > 1) { + if (wRatio > hRatio) { + op.inSampleSize = wRatio + } else { + op.inSampleSize = hRatio + } + } + inputStream = context.assets.open(fileNameInAssets) + op.inJustDecodeBounds = false + return BitmapFactory.decodeStream(inputStream, null, op) + } + + + //图片不被压缩 + fun convertViewToBitmap(view: View, bitmapWidth: Int, bitmapHeight: Int): Bitmap { + val bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Config.ARGB_8888) + view.draw(Canvas(bitmap)) + return bitmap + } + + + /** + * @param options + * @param minSideLength + * @param maxNumOfPixels + * @return + * 设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。 + * 设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。 + * 有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。 + * 查看Android源码,Android提供了下面这种动态计算的方法。 + */ + fun computeSampleSize( + options: BitmapFactory.Options, + minSideLength: Int, + maxNumOfPixels: Int + ): Int { + val initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels) + var roundedSize: Int + if (initialSize <= 8) { + roundedSize = 1 + while (roundedSize < initialSize) { + roundedSize = roundedSize shl 1 + } + } else { + roundedSize = (initialSize + 7) / 8 * 8 + } + return roundedSize + } + + + private fun computeInitialSampleSize( + options: BitmapFactory.Options, + minSideLength: Int, + maxNumOfPixels: Int + ): Int { + + val w = options.outWidth.toDouble() + val h = options.outHeight.toDouble() + + val lowerBound = when (maxNumOfPixels) { + -1 -> 1 + else -> ceil(sqrt(w * h / maxNumOfPixels)).toInt() + } + + val upperBound = when (minSideLength) { + -1 -> 128 + else -> min( + floor(w / minSideLength), + floor(h / minSideLength) + ).toInt() + } + + if (upperBound < lowerBound) { + // return the larger one when there is no overlapping zone. + return lowerBound + } + + return when { + maxNumOfPixels == -1 && minSideLength == -1 -> { + 1 + } + minSideLength == -1 -> { + lowerBound + } + else -> { + upperBound + } + } + } + + /** + * 高斯模糊 + */ + fun stackBlur(srcBitmap: Bitmap?): Bitmap? { + if (srcBitmap == null) return null + val rs = RenderScript.create(App.INSTANCE) + val blurredBitmap = srcBitmap.copy(Config.ARGB_8888, true) + + //分配用于渲染脚本的内存 + val input = Allocation.createFromBitmap( + rs, + blurredBitmap, + Allocation.MipmapControl.MIPMAP_FULL, + Allocation.USAGE_SHARED + ) + val output = Allocation.createTyped(rs, input.type) + + //加载我们想要使用的特定脚本的实例。 + val script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)) + script.setInput(input) + + //设置模糊半径 + script.setRadius(8f) + + //启动 ScriptIntrinsicBlur + script.forEach(output) + + //将输出复制到模糊的位图 + output.copyTo(blurredBitmap) + + return blurredBitmap + } + + fun getMeanColor(bitmap: Bitmap): Int { + val width: Int = bitmap.width + val height: Int = bitmap.height + var pixel: Int + var pixelSumRed = 0 + var pixelSumBlue = 0 + var pixelSumGreen = 0 + for (i in 0..99) { + for (j in 70..99) { + pixel = bitmap.getPixel( + (i * width / 100.toFloat()).roundToInt(), + (j * height / 100.toFloat()).roundToInt() + ) + pixelSumRed += Color.red(pixel) + pixelSumGreen += Color.green(pixel) + pixelSumBlue += Color.blue(pixel) + } + } + val averagePixelRed = pixelSumRed / 3000 + val averagePixelBlue = pixelSumBlue / 3000 + val averagePixelGreen = pixelSumGreen / 3000 + return Color.rgb( + averagePixelRed + 3, + averagePixelGreen + 3, + averagePixelBlue + 3 + ) + } + +} diff --git a/app/src/main/java/com/novel/read/utils/BooksDiffCallBack.kt b/app/src/main/java/com/novel/read/utils/BooksDiffCallBack.kt new file mode 100644 index 0000000..f73fd5a --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/BooksDiffCallBack.kt @@ -0,0 +1,76 @@ +package com.novel.read.utils + +import androidx.annotation.NonNull +import androidx.core.os.bundleOf +import androidx.recyclerview.widget.DiffUtil +import com.novel.read.data.db.entity.Book + +class BooksDiffCallBack : DiffUtil.ItemCallback() { + /** + * 判断是否是同一个item + * + * @param oldItem New data + * @param newItem old Data + * @return + */ + override fun areItemsTheSame( + @NonNull oldItem: Book, + @NonNull newItem: Book + ): Boolean { + return oldItem.bookId === newItem.bookId + } + + /** + * 当是同一个item时,再判断内容是否发生改变 + * + * @param oldItem New data + * @param newItem old Data + * @return + */ + override fun areContentsTheSame( + @NonNull oldItem: Book, + @NonNull newItem: Book + ): Boolean { + return (oldItem.bookName.equals(newItem.bookName) + && oldItem.introduction.equals(newItem.introduction) + && oldItem.lastUpdateChapterDate.equals(newItem.lastUpdateChapterDate)) + } + + /** + * 可选实现 + * 如果需要精确修改某一个view中的内容,请实现此方法。 + * 如果不实现此方法,或者返回null,将会直接刷新整个item。 + * + * @param oldItem Old data + * @param newItem New data + * @return Payload info. if return null, the entire item will be refreshed. + */ + override fun getChangePayload( + @NonNull oldItem: Book, + @NonNull newItem: Book + ): Any? { + val bundle = bundleOf() + if (oldItem.bookName != newItem.bookName) { + bundle.putString("name", newItem.bookName) + } + if (oldItem.authorPenname != newItem.authorPenname) { + bundle.putString("author", newItem.authorPenname) + } + if (oldItem.durChapterTitle != newItem.durChapterTitle) { + bundle.putString("dur", newItem.durChapterTitle) + } +// if (oldItem.latestChapterTitle != newItem.latestChapterTitle) { +// bundle.putString("last", newItem.latestChapterTitle) +// } + if (oldItem.coverImageUrl != newItem.coverImageUrl) { + bundle.putString("cover", newItem.coverImageUrl) + } + if (oldItem.lastUpdateChapterDate != newItem.lastUpdateChapterDate + || oldItem.durChapterTime != newItem.durChapterTime + ) { + bundle.putBoolean("refresh", true) + } + if (bundle.isEmpty) return null + return bundle + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ColorUtils.kt b/app/src/main/java/com/novel/read/utils/ColorUtils.kt new file mode 100644 index 0000000..ab1ff27 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ColorUtils.kt @@ -0,0 +1,252 @@ +package com.novel.read.utils + +import android.graphics.Color + +import androidx.annotation.ColorInt +import androidx.annotation.FloatRange +import java.util.* +import kotlin.math.* + +@Suppress("unused", "MemberVisibilityCanBePrivate") +object ColorUtils { + + fun intToString(intColor: Int): String { + return String.format("#%06X", 0xFFFFFF and intColor) + } + + + fun stripAlpha(@ColorInt color: Int): Int { + return -0x1000000 or color + } + + @ColorInt + fun shiftColor(@ColorInt color: Int, @FloatRange(from = 0.0, to = 2.0) by: Float): Int { + if (by == 1f) return color + val alpha = Color.alpha(color) + val hsv = FloatArray(3) + Color.colorToHSV(color, hsv) + hsv[2] *= by // value component + return (alpha shl 24) + (0x00ffffff and Color.HSVToColor(hsv)) + } + + @ColorInt + fun darkenColor(@ColorInt color: Int): Int { + return shiftColor(color, 0.9f) + } + + @ColorInt + fun lightenColor(@ColorInt color: Int): Int { + return shiftColor(color, 1.1f) + } + + fun isColorLight(@ColorInt color: Int): Boolean { + val darkness = + 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255 + return darkness < 0.4 + } + + @ColorInt + fun invertColor(@ColorInt color: Int): Int { + val r = 255 - Color.red(color) + val g = 255 - Color.green(color) + val b = 255 - Color.blue(color) + return Color.argb(Color.alpha(color), r, g, b) + } + + @ColorInt + fun adjustAlpha(@ColorInt color: Int, @FloatRange(from = 0.0, to = 1.0) factor: Float): Int { + val alpha = (Color.alpha(color) * factor).roundToInt() + val red = Color.red(color) + val green = Color.green(color) + val blue = Color.blue(color) + return Color.argb(alpha, red, green, blue) + } + + @ColorInt + fun withAlpha(@ColorInt baseColor: Int, @FloatRange(from = 0.0, to = 1.0) alpha: Float): Int { + val a = min(255, max(0, (alpha * 255).toInt())) shl 24 + val rgb = 0x00ffffff and baseColor + return a + rgb + } + + /** + * Taken from CollapsingToolbarLayout's CollapsingTextHelper class. + */ + fun blendColors(color1: Int, color2: Int, @FloatRange(from = 0.0, to = 1.0) ratio: Float): Int { + val inverseRatio = 1f - ratio + val a = Color.alpha(color1) * inverseRatio + Color.alpha(color2) * ratio + val r = Color.red(color1) * inverseRatio + Color.red(color2) * ratio + val g = Color.green(color1) * inverseRatio + Color.green(color2) * ratio + val b = Color.blue(color1) * inverseRatio + Color.blue(color2) * ratio + return Color.argb(a.toInt(), r.toInt(), g.toInt(), b.toInt()) + } + + /** + * 按条件的到随机颜色 + * + * @param alpha 透明 + * @param lower 下边界 + * @param upper 上边界 + * @return 颜色值 + */ + fun getRandomColor(alpha: Int, lower: Int, upper: Int): Int { + return RandomColor(alpha, lower, upper).color + } + + /** + * @return 获取随机色 + */ + fun getRandomColor(): Int { + return RandomColor(255, 80, 200).color + } + + + /** + * 随机颜色 + */ + class RandomColor(alpha: Int, lower: Int, upper: Int) { + private var alpha: Int = 0 + private var lower: Int = 0 + private var upper: Int = 0 + + //随机数是前闭 后开 + val color: Int + get() { + val red = getLower() + Random().nextInt(getUpper() - getLower() + 1) + val green = getLower() + Random().nextInt(getUpper() - getLower() + 1) + val blue = getLower() + Random().nextInt(getUpper() - getLower() + 1) + + return Color.argb(getAlpha(), red, green, blue) + } + + init { + require(upper > lower) { "must be lower < upper" } + setAlpha(alpha) + setLower(lower) + setUpper(upper) + } + + private fun getAlpha(): Int { + return alpha + } + + private fun setAlpha(alpha: Int) { + var alpha1 = alpha + if (alpha1 > 255) alpha1 = 255 + if (alpha1 < 0) alpha1 = 0 + this.alpha = alpha1 + } + + private fun getLower(): Int { + return lower + } + + private fun setLower(lower: Int) { + var lower1 = lower + if (lower1 < 0) lower1 = 0 + this.lower = lower1 + } + + private fun getUpper(): Int { + return upper + } + + private fun setUpper(upper: Int) { + var upper1 = upper + if (upper1 > 255) upper1 = 255 + this.upper = upper1 + } + } + + fun argb(R: Int, G: Int, B: Int): Int { + return argb(Byte.MAX_VALUE.toInt(), R, G, B) + } + + fun argb(A: Int, R: Int, G: Int, B: Int): Int { + val colorByteArr = + byteArrayOf(A.toByte(), R.toByte(), G.toByte(), B.toByte()) + return byteArrToInt(colorByteArr) + } + + fun rgb(argb: Int): IntArray? { + return intArrayOf(argb shr 16 and 0xFF, argb shr 8 and 0xFF, argb and 0xFF) + } + + fun byteArrToInt(colorByteArr: ByteArray): Int { + return ((colorByteArr[0].toInt() shl 24) + (colorByteArr[1].toInt() and 0xFF shl 16) + + (colorByteArr[2].toInt() and 0xFF shl 8) + (colorByteArr[3].toInt() and 0xFF)) + } + + fun rgb2lab(R: Int, G: Int, B: Int): IntArray { + val x: Float + val y: Float + val z: Float + val fx: Float + val fy: Float + val fz: Float + val xr: Float + val yr: Float + val zr: Float + val ls: Float + val `as`: Float + val bs: Float + val eps = 216f / 24389f + val k = 24389f / 27f + val xr1 = 0.964221f // reference white D50 + val yr1 = 1.0f + val zr1 = 0.825211f + + // RGB to XYZ + var r: Float = R / 255f //R 0..1 + var g: Float = G / 255f //G 0..1 + var b: Float = B / 255f //B 0..1 + + // assuming sRGB (D65) + r = if (r <= 0.04045) r / 12 else ((r + 0.055) / 1.055).pow(2.4).toFloat() + g = if (g <= 0.04045) g / 12 else ((g + 0.055) / 1.055).pow(2.4).toFloat() + b = if (b <= 0.04045) b / 12 else ((b + 0.055) / 1.055).pow(2.4).toFloat() + x = 0.436052025f * r + 0.385081593f * g + 0.143087414f * b + y = 0.222491598f * r + 0.71688606f * g + 0.060621486f * b + z = 0.013929122f * r + 0.097097002f * g + 0.71418547f * b + + // XYZ to Lab + xr = x / xr1 + yr = y / yr1 + zr = z / zr1 + fx = if (xr > eps) xr.toDouble().pow(1 / 3.0) + .toFloat() else ((k * xr + 16.0) / 116.0).toFloat() + fy = if (yr > eps) yr.toDouble().pow(1 / 3.0) + .toFloat() else ((k * yr + 16.0) / 116.0).toFloat() + fz = if (zr > eps) zr.toDouble().pow(1 / 3.0) + .toFloat() else ((k * zr + 16.0) / 116).toFloat() + ls = 116 * fy - 16 + `as` = 500 * (fx - fy) + bs = 200 * (fy - fz) + val lab = IntArray(3) + lab[0] = (2.55 * ls + .5).toInt() + lab[1] = (`as` + .5).toInt() + lab[2] = (bs + .5).toInt() + return lab + } + + /** + * Computes the difference between two RGB colors by converting them to the L*a*b scale and + * comparing them using the CIE76 algorithm { http://en.wikipedia.org/wiki/Color_difference#CIE76} + */ + fun getColorDifference(a: Int, b: Int): Double { + val r1: Int = Color.red(a) + val g1: Int = Color.green(a) + val b1: Int = Color.blue(a) + val r2: Int = Color.red(b) + val g2: Int = Color.green(b) + val b2: Int = Color.blue(b) + val lab1 = rgb2lab(r1, g1, b1) + val lab2 = rgb2lab(r2, g2, b2) + return sqrt( + (lab2[0] - lab1[0].toDouble()) + .pow(2.0) + (lab2[1] - lab1[1].toDouble()) + .pow(2.0) + (lab2[2] - lab1[2].toDouble()) + .pow(2.0) + ) + } +} diff --git a/app/src/main/java/com/novel/read/utils/ConvertUtils.kt b/app/src/main/java/com/novel/read/utils/ConvertUtils.kt new file mode 100644 index 0000000..f85eb39 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ConvertUtils.kt @@ -0,0 +1,122 @@ +package com.novel.read.utils + +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import java.io.BufferedReader +import java.io.IOException +import java.io.InputStream +import java.io.InputStreamReader +import java.text.DecimalFormat + +/** + * 数据类型转换、单位转换 + * + * @author 李玉江[QQ:1023694760] + * @since 2014-4-18 + */ +@Suppress("MemberVisibilityCanBePrivate") +object ConvertUtils { + const val GB: Long = 1073741824 + const val MB: Long = 1048576 + const val KB: Long = 1024 + + fun toInt(obj: Any): Int { + return try { + Integer.parseInt(obj.toString()) + } catch (e: NumberFormatException) { + -1 + } + } + + fun toInt(bytes: ByteArray): Int { + var result = 0 + var byte: Byte + for (i in bytes.indices) { + byte = bytes[i] + result += (byte.toInt() and 0xFF).shl(8 * i) + } + return result + } + + fun toFloat(obj: Any): Float { + return try { + java.lang.Float.parseFloat(obj.toString()) + } catch (e: NumberFormatException) { + -1f + } + } + + fun toString(objects: Array, tag: String): String { + val sb = StringBuilder() + for (`object` in objects) { + sb.append(`object`) + sb.append(tag) + } + return sb.toString() + } + + @JvmOverloads + fun toBitmap(bytes: ByteArray, width: Int = -1, height: Int = -1): Bitmap? { + var bitmap: Bitmap? = null + if (bytes.isNotEmpty()) { + try { + val options = BitmapFactory.Options() + // 设置让解码器以最佳方式解码 + options.inPreferredConfig = null + if (width > 0 && height > 0) { + options.outWidth = width + options.outHeight = height + } + bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options) + bitmap!!.density = 96// 96 dpi + } catch (e: Exception) { + } + } + return bitmap + } + + private fun toDrawable(bitmap: Bitmap?): Drawable? { + return if (bitmap == null) null else BitmapDrawable(Resources.getSystem(), bitmap) + } + + fun toDrawable(bytes: ByteArray): Drawable? { + return toDrawable(toBitmap(bytes)) + } + + fun toFileSizeString(fileSize: Long): String { + val df = DecimalFormat("0.00") + val fileSizeString: String + fileSizeString = when { + fileSize < KB -> fileSize.toString() + "B" + fileSize < MB -> df.format(fileSize.toDouble() / KB) + "K" + fileSize < GB -> df.format(fileSize.toDouble() / MB) + "M" + else -> df.format(fileSize.toDouble() / GB) + "G" + } + return fileSizeString + } + + @JvmOverloads + fun toString(`is`: InputStream, charset: String = "utf-8"): String { + val sb = StringBuilder() + try { + val reader = BufferedReader(InputStreamReader(`is`, charset)) + while (true) { + val line = reader.readLine() + if (line == null) { + break + } else { + sb.append(line).append("\n") + } + } + reader.close() + `is`.close() + } catch (e: IOException) { + } + + return sb.toString() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/DrawableUtils.kt b/app/src/main/java/com/novel/read/utils/DrawableUtils.kt new file mode 100644 index 0000000..daf0806 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/DrawableUtils.kt @@ -0,0 +1,48 @@ +package com.novel.read.utils + +import android.content.res.ColorStateList +import android.graphics.PorterDuff +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.TransitionDrawable +import androidx.annotation.ColorInt +import androidx.core.graphics.drawable.DrawableCompat + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +@Suppress("unused") +object DrawableUtils { + + fun createTransitionDrawable(@ColorInt startColor: Int, @ColorInt endColor: Int): TransitionDrawable { + return createTransitionDrawable(ColorDrawable(startColor), ColorDrawable(endColor)) + } + + fun createTransitionDrawable(start: Drawable, end: Drawable): TransitionDrawable { + val drawables = arrayOfNulls(2) + + drawables[0] = start + drawables[1] = end + + return TransitionDrawable(drawables) + } + + fun setTintList(drawable: Drawable?, tint: ColorStateList, tintMode: PorterDuff.Mode = PorterDuff.Mode.SRC_ATOP) { + drawable?.let { + val wrappedDrawable = DrawableCompat.wrap(it) + wrappedDrawable.mutate() + DrawableCompat.setTintMode(wrappedDrawable, tintMode) + DrawableCompat.setTintList(wrappedDrawable, tint) + } + } + + + fun setTint(drawable: Drawable?, @ColorInt tint: Int, tintMode: PorterDuff.Mode = PorterDuff.Mode.SRC_ATOP) { + drawable?.let { + val wrappedDrawable = DrawableCompat.wrap(it) + wrappedDrawable.mutate() + DrawableCompat.setTintMode(wrappedDrawable, tintMode) + DrawableCompat.setTint(wrappedDrawable, tint) + } + } +} diff --git a/app/src/main/java/com/novel/read/utils/FileUtils.kt b/app/src/main/java/com/novel/read/utils/FileUtils.kt new file mode 100644 index 0000000..57aec96 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/FileUtils.kt @@ -0,0 +1,774 @@ +package com.novel.read.utils + +import android.os.Environment +import android.webkit.MimeTypeMap +import androidx.annotation.IntDef +import com.novel.read.App +import java.io.* +import java.nio.charset.Charset +import java.text.SimpleDateFormat +import java.util.* +import java.util.regex.Pattern + +@Suppress("unused") +object FileUtils { + + fun exists(root: File, vararg subDirFiles: String): Boolean { + return getFile(root, *subDirFiles).exists() + } + + fun createFileIfNotExist(root: File, vararg subDirFiles: String): File { + val filePath = getPath(root, *subDirFiles) + return createFileIfNotExist(filePath) + } + + fun createFolderIfNotExist(root: File, vararg subDirs: String): File { + val filePath = getPath(root, *subDirs) + return createFolderIfNotExist(filePath) + } + + fun createFolderIfNotExist(filePath: String): File { + val file = File(filePath) + //如果文件夹不存在,就创建它 + if (!file.exists()) { + file.mkdirs() + } + return file + } + + @Synchronized + fun createFileIfNotExist(filePath: String): File { + val file = File(filePath) + try { + if (!file.exists()) { + //创建父类文件夹 + file.parent?.let { + createFolderIfNotExist(it) + } + //创建文件 + file.createNewFile() + } + } catch (e: IOException) { + e.printStackTrace() + } + return file + } + + fun createFileWithReplace(filePath: String) : File{ + val file = File(filePath) + if (!file.exists()) { + //创建父类文件夹 + file.parent?.let { + createFolderIfNotExist(it) + } + //创建文件 + file.createNewFile() + } + else{ + file.delete() + file.createNewFile() + } + return file + } + + fun getFile(root: File, vararg subDirFiles: String): File { + val filePath = getPath(root, *subDirFiles) + return File(filePath) + } + + fun getPath(root: File, vararg subDirFiles: String): String { + val path = StringBuilder(root.absolutePath) + subDirFiles.forEach { + if (it.isNotEmpty()) { + path.append(File.separator).append(it) + } + } + return path.toString() + } + + //递归删除文件夹下的数据 + @Synchronized + fun deleteFile(filePath: String) { + val file = File(filePath) + if (!file.exists()) return + + if (file.isDirectory) { + val files = file.listFiles() + files?.forEach { subFile -> + val path = subFile.path + deleteFile(path) + } + } + //删除文件 + file.delete() + } + + fun getCachePath(): String { + return App.INSTANCE.externalCacheDir?.absolutePath + ?: App.INSTANCE.cacheDir.absolutePath + } + + fun getSdCardPath(): String { + @Suppress("DEPRECATION") + var sdCardDirectory = Environment.getExternalStorageDirectory().absolutePath + try { + sdCardDirectory = File(sdCardDirectory).canonicalPath + } catch (ioe: IOException) { + ioe.printStackTrace() + } + return sdCardDirectory + } + + const val BY_NAME_ASC = 0 + const val BY_NAME_DESC = 1 + const val BY_TIME_ASC = 2 + const val BY_TIME_DESC = 3 + const val BY_SIZE_ASC = 4 + const val BY_SIZE_DESC = 5 + const val BY_EXTENSION_ASC = 6 + const val BY_EXTENSION_DESC = 7 + + @IntDef(value = [BY_NAME_ASC, BY_NAME_DESC, BY_TIME_ASC, BY_TIME_DESC, BY_SIZE_ASC, BY_SIZE_DESC, BY_EXTENSION_ASC, BY_EXTENSION_DESC]) + @kotlin.annotation.Retention(AnnotationRetention.SOURCE) + annotation class SortType + + /** + * 将目录分隔符统一为平台默认的分隔符,并为目录结尾添加分隔符 + */ + fun separator(path: String): String { + var path1 = path + val separator = File.separator + path1 = path1.replace("\\", separator) + if (!path1.endsWith(separator)) { + path1 += separator + } + return path1 + } + + fun closeSilently(c: Closeable?) { + if (c == null) { + return + } + try { + c.close() + } catch (ignored: IOException) { + } + + } + + /** + * 列出指定目录下的所有子目录 + */ + @JvmOverloads + fun listDirs( + startDirPath: String, + excludeDirs: Array? = null, @SortType sortType: Int = BY_NAME_ASC + ): Array { + var excludeDirs1 = excludeDirs + val dirList = ArrayList() + val startDir = File(startDirPath) + if (!startDir.isDirectory) { + return arrayOfNulls(0) + } + val dirs = startDir.listFiles(FileFilter { f -> + if (f == null) { + return@FileFilter false + } + f.isDirectory + }) + ?: return arrayOfNulls(0) + if (excludeDirs1 == null) { + excludeDirs1 = arrayOf() + } + for (dir in dirs) { + val file = dir.absoluteFile + if (!excludeDirs1.contentDeepToString().contains(file.name)) { + dirList.add(file) + } + } + when (sortType) { + BY_NAME_ASC -> Collections.sort(dirList, SortByName()) + BY_NAME_DESC -> { + Collections.sort(dirList, SortByName()) + dirList.reverse() + } + BY_TIME_ASC -> Collections.sort(dirList, SortByTime()) + BY_TIME_DESC -> { + Collections.sort(dirList, SortByTime()) + dirList.reverse() + } + BY_SIZE_ASC -> Collections.sort(dirList, SortBySize()) + BY_SIZE_DESC -> { + Collections.sort(dirList, SortBySize()) + dirList.reverse() + } + BY_EXTENSION_ASC -> Collections.sort(dirList, SortByExtension()) + BY_EXTENSION_DESC -> { + Collections.sort(dirList, SortByExtension()) + dirList.reverse() + } + } + return dirList.toTypedArray() + } + + /** + * 列出指定目录下的所有子目录及所有文件 + */ + @JvmOverloads + fun listDirsAndFiles( + startDirPath: String, + allowExtensions: Array? = null + ): Array? { + val dirs: Array? + val files: Array? = if (allowExtensions == null) { + listFiles(startDirPath) + } else { + listFiles(startDirPath, allowExtensions) + } + val dirsAndFiles: Array + dirs = listDirs(startDirPath) + if (files == null) { + return null + } + dirsAndFiles = arrayOfNulls(dirs.size + files.size) + System.arraycopy(dirs, 0, dirsAndFiles, 0, dirs.size) + System.arraycopy(files, 0, dirsAndFiles, dirs.size, files.size) + return dirsAndFiles + } + + /** + * 列出指定目录下的所有文件 + */ + @JvmOverloads + fun listFiles( + startDirPath: String, + filterPattern: Pattern? = null, @SortType sortType: Int = BY_NAME_ASC + ): Array { + val fileList = ArrayList() + val f = File(startDirPath) + if (!f.isDirectory) { + return arrayOfNulls(0) + } + val files = f.listFiles(FileFilter { file -> + if (file == null) { + return@FileFilter false + } + if (file.isDirectory) { + return@FileFilter false + } + + filterPattern?.matcher(file.name)?.find() ?: true + }) + ?: return arrayOfNulls(0) + for (file in files) { + fileList.add(file.absoluteFile) + } + when (sortType) { + BY_NAME_ASC -> Collections.sort(fileList, SortByName()) + BY_NAME_DESC -> { + Collections.sort(fileList, SortByName()) + fileList.reverse() + } + BY_TIME_ASC -> Collections.sort(fileList, SortByTime()) + BY_TIME_DESC -> { + Collections.sort(fileList, SortByTime()) + fileList.reverse() + } + BY_SIZE_ASC -> Collections.sort(fileList, SortBySize()) + BY_SIZE_DESC -> { + Collections.sort(fileList, SortBySize()) + fileList.reverse() + } + BY_EXTENSION_ASC -> Collections.sort(fileList, SortByExtension()) + BY_EXTENSION_DESC -> { + Collections.sort(fileList, SortByExtension()) + fileList.reverse() + } + } + return fileList.toTypedArray() + } + + /** + * 列出指定目录下的所有文件 + */ + fun listFiles(startDirPath: String, allowExtensions: Array?): Array? { + val file = File(startDirPath) + return file.listFiles { _, name -> + //返回当前目录所有以某些扩展名结尾的文件 + val extension = getExtension(name) + allowExtensions?.contentDeepToString()?.contains(extension) == true + || allowExtensions == null + } + } + + /** + * 列出指定目录下的所有文件 + */ + fun listFiles(startDirPath: String, allowExtension: String?): Array? { + return if (allowExtension == null) + listFiles(startDirPath, allowExtension = null) + else + listFiles(startDirPath, arrayOf(allowExtension)) + } + + /** + * 判断文件或目录是否存在 + */ + fun exist(path: String): Boolean { + val file = File(path) + return file.exists() + } + + /** + * 删除文件或目录 + */ + @JvmOverloads + fun delete(file: File, deleteRootDir: Boolean = false): Boolean { + var result = false + if (file.isFile) { + //是文件 + result = deleteResolveEBUSY(file) + } else { + //是目录 + val files = file.listFiles() ?: return false + if (files.isEmpty()) { + result = deleteRootDir && deleteResolveEBUSY(file) + } else { + for (f in files) { + delete(f, deleteRootDir) + result = deleteResolveEBUSY(f) + } + } + if (deleteRootDir) { + result = deleteResolveEBUSY(file) + } + } + return result + } + + /** + * bug: open failed: EBUSY (Device or resource busy) + * fix: http://stackoverflow.com/questions/11539657/open-failed-ebusy-device-or-resource-busy + */ + private fun deleteResolveEBUSY(file: File): Boolean { + // Before you delete a Directory or File: rename it! + val to = File(file.absolutePath + System.currentTimeMillis()) + + file.renameTo(to) + return to.delete() + } + + /** + * 删除文件或目录 + */ + @JvmOverloads + fun delete(path: String, deleteRootDir: Boolean = false): Boolean { + val file = File(path) + + return if (file.exists()) { + delete(file, deleteRootDir) + } else false + } + + /** + * 复制文件为另一个文件,或复制某目录下的所有文件及目录到另一个目录下 + */ + fun copy(src: String, tar: String): Boolean { + val srcFile = File(src) + return srcFile.exists() && copy(srcFile, File(tar)) + } + + /** + * 复制文件或目录 + */ + fun copy(src: File, tar: File): Boolean { + try { + if (src.isFile) { + val `is` = FileInputStream(src) + val op = FileOutputStream(tar) + val bis = BufferedInputStream(`is`) + val bos = BufferedOutputStream(op) + val bt = ByteArray(1024 * 8) + while (true) { + val len = bis.read(bt) + if (len == -1) { + break + } else { + bos.write(bt, 0, len) + } + } + bis.close() + bos.close() + } else if (src.isDirectory) { + tar.mkdirs() + src.listFiles()?.forEach { file -> + copy(file.absoluteFile, File(tar.absoluteFile, file.name)) + } + } + return true + } catch (e: Exception) { + return false + } + + } + + /** + * 移动文件或目录 + */ + fun move(src: String, tar: String): Boolean { + return move(File(src), File(tar)) + } + + /** + * 移动文件或目录 + */ + fun move(src: File, tar: File): Boolean { + return rename(src, tar) + } + + /** + * 文件重命名 + */ + fun rename(oldPath: String, newPath: String): Boolean { + return rename(File(oldPath), File(newPath)) + } + + /** + * 文件重命名 + */ + fun rename(src: File, tar: File): Boolean { + return src.renameTo(tar) + } + + /** + * 读取文本文件, 失败将返回空串 + */ + @JvmOverloads + fun readText(filepath: String, charset: String = "utf-8"): String { + try { + val data = readBytes(filepath) + if (data != null) { + return String(data, Charset.forName(charset)).trim { it <= ' ' } + } + } catch (ignored: UnsupportedEncodingException) { + } + + return "" + } + + /** + * 读取文件内容, 失败将返回空串 + */ + fun readBytes(filepath: String): ByteArray? { + var fis: FileInputStream? = null + try { + fis = FileInputStream(filepath) + val baos = ByteArrayOutputStream() + val buffer = ByteArray(1024) + while (true) { + val len = fis.read(buffer, 0, buffer.size) + if (len == -1) { + break + } else { + baos.write(buffer, 0, len) + } + } + val data = baos.toByteArray() + baos.close() + return data + } catch (e: IOException) { + return null + } finally { + closeSilently(fis) + } + } + + /** + * 保存文本内容 + */ + @JvmOverloads + fun writeText(filepath: String, content: String, charset: String = "utf-8"): Boolean { + try { + writeBytes(filepath, content.toByteArray(charset(charset))) + return true + } catch (e: UnsupportedEncodingException) { + return false + } + + } + + /** + * 保存文件内容 + */ + fun writeBytes(filepath: String, data: ByteArray): Boolean { + val file = File(filepath) + var fos: FileOutputStream? = null + return try { + if (!file.exists()) { + file.parentFile?.mkdirs() + file.createNewFile() + } + fos = FileOutputStream(filepath) + fos.write(data) + true + } catch (e: IOException) { + false + } finally { + closeSilently(fos) + } + } + + /** + * 追加文本内容 + */ + fun appendText(path: String, content: String): Boolean { + val file = File(path) + var writer: FileWriter? = null + return try { + if (!file.exists()) { + + file.createNewFile() + } + writer = FileWriter(file, true) + writer.write(content) + true + } catch (e: IOException) { + false + } finally { + closeSilently(writer) + } + } + + /** + * 获取文件大小 + */ + fun getLength(path: String): Long { + val file = File(path) + return if (!file.isFile || !file.exists()) { + 0 + } else file.length() + } + + /** + * 获取文件或网址的名称(包括后缀) + */ + fun getName(pathOrUrl: String?): String { + if (pathOrUrl == null) { + return "" + } + val pos = pathOrUrl.lastIndexOf('/') + return if (0 <= pos) { + pathOrUrl.substring(pos + 1) + } else { + System.currentTimeMillis().toString() + "." + getExtension(pathOrUrl) + } + } + + /** + * 获取文件名(不包括扩展名) + */ + fun getNameExcludeExtension(path: String): String { + try { + var fileName = File(path).name + val lastIndexOf = fileName.lastIndexOf(".") + if (lastIndexOf != -1) { + fileName = fileName.substring(0, lastIndexOf) + } + return fileName + } catch (e: Exception) { + return "" + } + + } + + /** + * 获取格式化后的文件大小 + */ + fun getSize(path: String): String { + val fileSize = getLength(path) + return ConvertUtils.toFileSizeString(fileSize) + } + + /** + * 获取文件后缀,不包括“.” + */ + fun getExtension(pathOrUrl: String): String { + val dotPos = pathOrUrl.lastIndexOf('.') + return if (0 <= dotPos) { + pathOrUrl.substring(dotPos + 1) + } else { + "ext" + } + } + + /** + * 获取文件的MIME类型 + */ + fun getMimeType(pathOrUrl: String): String { + val ext = getExtension(pathOrUrl) + val map = MimeTypeMap.getSingleton() + return map.getMimeTypeFromExtension(ext) ?: "*/*" + } + + /** + * 获取格式化后的文件/目录创建或最后修改时间 + */ + @JvmOverloads + fun getDateTime(path: String, format: String = "yyyy年MM月dd日HH:mm"): String { + val file = File(path) + return getDateTime(file, format) + } + + /** + * 获取格式化后的文件/目录创建或最后修改时间 + */ + fun getDateTime(file: File, format: String): String { + val cal = Calendar.getInstance() + cal.timeInMillis = file.lastModified() + return SimpleDateFormat(format, Locale.PRC).format(cal.time) + } + + /** + * 比较两个文件的最后修改时间 + */ + fun compareLastModified(path1: String, path2: String): Int { + val stamp1 = File(path1).lastModified() + val stamp2 = File(path2).lastModified() + return when { + stamp1 > stamp2 -> { + 1 + } + stamp1 < stamp2 -> { + -1 + } + else -> { + 0 + } + } + } + + /** + * 创建多级别的目录 + */ + fun makeDirs(path: String): Boolean { + return makeDirs(File(path)) + } + + /** + * 创建多级别的目录 + */ + fun makeDirs(file: File): Boolean { + return file.mkdirs() + } + + class SortByExtension : Comparator { + + override fun compare(f1: File?, f2: File?): Int { + return if (f1 == null || f2 == null) { + if (f1 == null) { + -1 + } else { + 1 + } + } else { + if (f1.isDirectory && f2.isFile) { + -1 + } else if (f1.isFile && f2.isDirectory) { + 1 + } else { + f1.name.compareTo(f2.name, ignoreCase = true) + } + } + } + + } + + class SortByName : Comparator { + private var caseSensitive: Boolean = false + + constructor(caseSensitive: Boolean) { + this.caseSensitive = caseSensitive + } + + constructor() { + this.caseSensitive = false + } + + override fun compare(f1: File?, f2: File?): Int { + if (f1 == null || f2 == null) { + return if (f1 == null) { + -1 + } else { + 1 + } + } else { + return if (f1.isDirectory && f2.isFile) { + -1 + } else if (f1.isFile && f2.isDirectory) { + 1 + } else { + val s1 = f1.name + val s2 = f2.name + if (caseSensitive) { + s1.compareTo(s2) + } else { + s1.compareTo(s2, ignoreCase = true) + } + } + } + } + + } + + class SortBySize : Comparator { + + override fun compare(f1: File?, f2: File?): Int { + return if (f1 == null || f2 == null) { + if (f1 == null) { + -1 + } else { + 1 + } + } else { + if (f1.isDirectory && f2.isFile) { + -1 + } else if (f1.isFile && f2.isDirectory) { + 1 + } else { + if (f1.length() < f2.length()) { + -1 + } else { + 1 + } + } + } + } + + } + + class SortByTime : Comparator { + + override fun compare(f1: File?, f2: File?): Int { + return if (f1 == null || f2 == null) { + if (f1 == null) { + -1 + } else { + 1 + } + } else { + if (f1.isDirectory && f2.isFile) { + -1 + } else if (f1.isFile && f2.isDirectory) { + 1 + } else { + if (f1.lastModified() > f2.lastModified()) { + -1 + } else { + 1 + } + } + } + } + + } +} diff --git a/app/src/main/java/com/novel/read/utils/LanguageUtils.kt b/app/src/main/java/com/novel/read/utils/LanguageUtils.kt new file mode 100644 index 0000000..dc27355 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/LanguageUtils.kt @@ -0,0 +1,105 @@ +package com.novel.read.utils + +import android.content.Context +import android.content.res.Configuration +import android.content.res.Resources +import android.os.Build +import android.os.LocaleList +import com.novel.read.constant.PreferKey +import com.novel.read.utils.ext.getPrefString +import java.util.* + + +object LanguageUtils { + + /** + * 设置语言 + */ + fun setConfiguration(context: Context): Context { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val resources: Resources = context.resources + val metrics = resources.displayMetrics + val configuration: Configuration = resources.configuration + //Log.d("h11128", "set language to ${context.getPrefString(PreferKey.language)}") + val targetLocale = getSetLocale(context) + configuration.setLocale(targetLocale) + configuration.setLocales(LocaleList(targetLocale)) + @Suppress("DEPRECATION") + resources.updateConfiguration(configuration, metrics) + context.createConfigurationContext(configuration) + } else { + setConfigurationOld(context) + context + } + } + + /** + * 设置语言 + */ + private fun setConfigurationOld(context: Context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + val resources: Resources = context.resources + val targetLocale = getSetLocale(context) + val configuration: Configuration = resources.configuration + @Suppress("DEPRECATION") + configuration.locale = targetLocale + @Suppress("DEPRECATION") + resources.updateConfiguration(configuration, resources.displayMetrics) + } + } + + /** + * 当前系统语言 + */ + private fun getSystemLocale(): Locale { + val locale: Locale + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多语言设置获取顶部的语言 + locale = Resources.getSystem().configuration.locales.get(0) + } else { + @Suppress("DEPRECATION") + locale = Resources.getSystem().configuration.locale + } + return locale + } + + /** + * 当前App语言 + */ + private fun getAppLocale(context: Context): Locale { + val locale: Locale + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + locale = context.resources.configuration.locales[0] + } else { + @Suppress("DEPRECATION") + locale = context.resources.configuration.locale + } + return locale + + } + + /** + * 当前设置语言 + */ + private fun getSetLocale(context: Context): Locale { + return when (context.getPrefString(PreferKey.language)) { + "zh" -> Locale.SIMPLIFIED_CHINESE + "tw" -> Locale.TRADITIONAL_CHINESE + "en" -> Locale.ENGLISH + else -> getSystemLocale() + } + } + + /** + * 判断App语言和设置语言是否相同 + */ + fun isSameWithSetting(context: Context): Boolean { + val locale = getAppLocale(context) + val language = locale.language + val country = locale.country + val pfLocale = getSetLocale(context) + val pfLanguage = pfLocale.language + val pfCountry = pfLocale.country + return language == pfLanguage && country == pfCountry + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/MD5Utils.kt b/app/src/main/java/com/novel/read/utils/MD5Utils.kt new file mode 100644 index 0000000..47158b9 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/MD5Utils.kt @@ -0,0 +1,39 @@ +package com.novel.read.utils + +import java.security.MessageDigest +import java.security.NoSuchAlgorithmException + +/** + * 将字符串转化为MD5 + */ +@Suppress("unused") +object MD5Utils { + + fun md5Encode(str: String?): String { + if (str == null) return "" + var reStr = "" + try { + val md5: MessageDigest = MessageDigest.getInstance("MD5") + val bytes: ByteArray = md5.digest(str.toByteArray()) + val stringBuffer: StringBuilder = StringBuilder() + for (b in bytes) { + val bt: Int = b.toInt() and 0xff + if (bt < 16) { + stringBuffer.append(0) + } + stringBuffer.append(Integer.toHexString(bt)) + } + reStr = stringBuffer.toString() + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } + + return reStr + } + + fun md5Encode16(str: String): String { + var reStr = md5Encode(str) + reStr = reStr.substring(8, 24) + return reStr + } +} diff --git a/app/src/main/java/com/novel/read/utils/NetworkUtils.kt b/app/src/main/java/com/novel/read/utils/NetworkUtils.kt new file mode 100644 index 0000000..d0b7ba7 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/NetworkUtils.kt @@ -0,0 +1,155 @@ +package com.novel.read.utils + +import retrofit2.Response +import java.net.InetAddress +import java.net.NetworkInterface +import java.net.SocketException +import java.net.URL +import java.util.* +import java.util.regex.Pattern + +@Suppress("unused") +object NetworkUtils { + fun getUrl(response: Response<*>): String { + val networkResponse = response.raw().networkResponse() + return networkResponse?.request()?.url()?.toString() + ?: response.raw().request().url().toString() + } + + private val notNeedEncoding: BitSet by lazy { + val bitSet = BitSet(256) + for (i in 'a'.toInt()..'z'.toInt()) { + bitSet.set(i) + } + for (i in 'A'.toInt()..'Z'.toInt()) { + bitSet.set(i) + } + for (i in '0'.toInt()..'9'.toInt()) { + bitSet.set(i) + } + for (char in "+-_.$:()!*@&#,[]") { + bitSet.set(char.toInt()) + } + return@lazy bitSet + } + + /** + * 支持JAVA的URLEncoder.encode出来的string做判断。 即: 将' '转成'+' + * 0-9a-zA-Z保留

+ * ! * ' ( ) ; : @ & = + $ , / ? # [ ] 保留 + * 其他字符转成%XX的格式,X是16进制的大写字符,范围是[0-9A-F] + */ + fun hasUrlEncoded(str: String): Boolean { + var needEncode = false + var i = 0 + while (i < str.length) { + val c = str[i] + if (notNeedEncoding.get(c.toInt())) { + i++ + continue + } + if (c == '%' && i + 2 < str.length) { + // 判断是否符合urlEncode规范 + val c1 = str[++i] + val c2 = str[++i] + if (isDigit16Char(c1) && isDigit16Char(c2)) { + i++ + continue + } + } + // 其他字符,肯定需要urlEncode + needEncode = true + break + } + + return !needEncode + } + + /** + * 判断c是否是16进制的字符 + */ + private fun isDigit16Char(c: Char): Boolean { + return c in '0'..'9' || c in 'A'..'F' || c in 'a'..'f' + } + + /** + * 获取绝对地址 + */ + fun getAbsoluteURL(baseURL: String?, relativePath: String?): String? { + if (baseURL.isNullOrEmpty()) return relativePath + if (relativePath.isNullOrEmpty()) return baseURL + var relativeUrl = relativePath + try { + val absoluteUrl = URL(baseURL.substringBefore(",")) + val parseUrl = URL(absoluteUrl, relativePath) + relativeUrl = parseUrl.toString() + return relativeUrl + } catch (e: Exception) { + e.printStackTrace() + } + return relativeUrl + } + + fun getBaseUrl(url: String?): String? { + if (url == null || !url.startsWith("http")) return null + val index = url.indexOf("/", 9) + return if (index == -1) { + url + } else url.substring(0, index) + } + + fun getSubDomain(url: String?): String { + var baseUrl = getBaseUrl(url) + if (baseUrl == null) return "" + return if (baseUrl.indexOf(".") == baseUrl.lastIndexOf(".")) { + baseUrl.substring(baseUrl.lastIndexOf("/")+1) + } else baseUrl.substring(baseUrl.indexOf(".")+1) + } + + /** + * Get local Ip address. + */ + fun getLocalIPAddress(): InetAddress? { + var enumeration: Enumeration? = null + try { + enumeration = NetworkInterface.getNetworkInterfaces() + } catch (e: SocketException) { + e.printStackTrace() + } + + if (enumeration != null) { + while (enumeration.hasMoreElements()) { + val nif = enumeration.nextElement() + val addresses = nif.inetAddresses + if (addresses != null) { + while (addresses.hasMoreElements()) { + val address = addresses.nextElement() + if (!address.isLoopbackAddress && isIPv4Address(address.hostAddress)) { + return address + } + } + } + } + } + return null + } + + /** + * Check if valid IPV4 address. + * + * @param input the address string to check for validity. + * @return True if the input parameter is a valid IPv4 address. + */ + fun isIPv4Address(input: String): Boolean { + return IPV4_PATTERN.matcher(input).matches() + } + + /** + * Ipv4 address check. + */ + private val IPV4_PATTERN = Pattern.compile( + "^(" + "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" + + "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" + ) + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/RealPathUtil.kt b/app/src/main/java/com/novel/read/utils/RealPathUtil.kt new file mode 100644 index 0000000..58ec9b9 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/RealPathUtil.kt @@ -0,0 +1,175 @@ +package com.novel.read.utils + +import android.annotation.SuppressLint +import android.content.ContentUris +import android.content.Context +import android.database.Cursor +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException + +@Suppress("unused") +object RealPathUtil { + /** + * Method for return file path of Gallery image + * @return path of the selected image file from gallery + */ + private var filePathUri: Uri? = null + + @Suppress("DEPRECATION") + fun getPath(context: Context, uri: Uri): String? { + //check here to KITKAT or new version + @SuppressLint("ObsoleteSdkInt") + val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + filePathUri = uri + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + if ("primary".equals(type, ignoreCase = true)) { + return Environment.getExternalStorageDirectory().toString() + "/" + split[1] + } + } else if (isDownloadsDocument(uri)) { + val id = DocumentsContract.getDocumentId(uri) + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(id) + ) + //return getDataColumn(context, uri, null, null); + return getDataColumn(context, contentUri, null, null) + } else if (isMediaDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + var contentUri: Uri? = null + when (type) { + "image" -> { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } + "video" -> { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } + "audio" -> { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + } + } + val selection = "_id=?" + val selectionArgs = arrayOf( + split[1] + ) + return getDataColumn(context, contentUri, selection, selectionArgs) + } + } else if ("content".equals( + uri.scheme, + ignoreCase = true + ) + ) { // Return the remote address + return if (isGooglePhotosUri(uri)) uri.lastPathSegment else getDataColumn( + context, + uri, + null, + null + ) + } else if ("file".equals(uri.scheme, ignoreCase = true)) { + return uri.path + } + return null + } + + /** + * Get the value of the data column for this Uri. This is useful for + * MediaStore Uris, and other file-based ContentProviders. + * + * @param context The context. + * @param uri The Uri to query. + * @param selection (Optional) Filter used in the query. + * @param selectionArgs (Optional) Selection arguments used in the query. + * @return The value of the _data column, which is typically a file path. + */ + private fun getDataColumn( + context: Context, uri: Uri?, selection: String?, + selectionArgs: Array? + ): String? { + var cursor: Cursor? = null + val column = "_data" + val projection = arrayOf( + column + ) + try { + cursor = + context.contentResolver.query(uri!!, projection, selection, selectionArgs, null) + if (cursor != null && cursor.moveToFirst()) { + val index = cursor.getColumnIndexOrThrow(column) + return cursor.getString(index) + } + } catch (e: IllegalArgumentException) { + e.printStackTrace() + val file = File(context.cacheDir, "tmp") + val filePath = file.absolutePath + var input: FileInputStream? = null + var output: FileOutputStream? = null + try { + val pfd = + context.contentResolver.openFileDescriptor(filePathUri!!, "r") + ?: return null + val fd = pfd.fileDescriptor + input = FileInputStream(fd) + output = FileOutputStream(filePath) + var read: Int + val bytes = ByteArray(4096) + while (input.read(bytes).also { read = it } != -1) { + output.write(bytes, 0, read) + } + return File(filePath).absolutePath + } catch (ignored: IOException) { + ignored.printStackTrace() + } finally { + input?.close() + output?.close() + } + } finally { + cursor?.close() + } + return null + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is ExternalStorageProvider. + */ + private fun isExternalStorageDocument(uri: Uri): Boolean { + return "com.android.externalstorage.documents" == uri.authority + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is DownloadsProvider. + */ + private fun isDownloadsDocument(uri: Uri): Boolean { + return "com.android.providers.downloads.documents" == uri.authority + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is MediaProvider. + */ + private fun isMediaDocument(uri: Uri): Boolean { + return "com.android.providers.media.documents" == uri.authority + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is Google Photos. + */ + private fun isGooglePhotosUri(uri: Uri): Boolean { + return "com.google.android.apps.photos.content" == uri.authority + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/StringUtils.kt b/app/src/main/java/com/novel/read/utils/StringUtils.kt new file mode 100644 index 0000000..6ef2916 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/StringUtils.kt @@ -0,0 +1,353 @@ +package com.novel.read.utils + +import android.annotation.SuppressLint +import android.text.TextUtils.isEmpty +import com.hankcs.hanlp.HanLP +import com.novel.read.App +import com.novel.read.constant.PreferKey +import com.novel.read.help.AppConfig +import com.novel.read.utils.ext.getPrefInt +import com.novel.read.utils.ext.getPrefLong +import java.text.DecimalFormat +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.* +import java.util.regex.Matcher +import java.util.regex.Pattern +import kotlin.math.abs +import kotlin.math.log10 +import kotlin.math.pow + +@Suppress("unused", "MemberVisibilityCanBePrivate") +object StringUtils { + private const val HOUR_OF_DAY = 24 + private const val DAY_OF_YESTERDAY = 2 + private const val TIME_UNIT = 60 + private val ChnMap = chnMap + + private val chnMap: HashMap + get() { + val map = HashMap() + var cnStr = "零一二三四五六七八九十" + var c = cnStr.toCharArray() + for (i in 0..10) { + map[c[i]] = i + } + cnStr = "〇壹贰叁肆伍陆柒捌玖拾" + c = cnStr.toCharArray() + for (i in 0..10) { + map[c[i]] = i + } + map['两'] = 2 + map['百'] = 100 + map['佰'] = 100 + map['千'] = 1000 + map['仟'] = 1000 + map['万'] = 10000 + map['亿'] = 100000000 + return map + } + + //将时间转换成日期 + fun dateConvert(time: Long, pattern: String): String { + val date = Date(time) + + @SuppressLint("SimpleDateFormat") + val format = SimpleDateFormat(pattern) + return format.format(date) + } + + //将日期转换成昨天、今天、明天 + fun dateConvert(source: String, pattern: String): String { + @SuppressLint("SimpleDateFormat") + val format = SimpleDateFormat(pattern) + val calendar = Calendar.getInstance() + try { + val date = format.parse(source) ?: return "" + val curTime = calendar.timeInMillis + calendar.time = date + //将MISC 转换成 sec + val difSec = abs((curTime - date.time) / 1000) + val difMin = difSec / 60 + val difHour = difMin / 60 + val difDate = difHour / 60 + val oldHour = calendar.get(Calendar.HOUR) + //如果没有时间 + if (oldHour == 0) { + //比日期:昨天今天和明天 + return when { + difDate == 0L -> { + "今天" + } + difDate < DAY_OF_YESTERDAY -> { + "昨天" + } + else -> { + @SuppressLint("SimpleDateFormat") + val convertFormat = SimpleDateFormat("yyyy-MM-dd") + convertFormat.format(date) + } + } + } + + return when { + difSec < TIME_UNIT -> difSec.toString() + "秒前" + difMin < TIME_UNIT -> difMin.toString() + "分钟前" + difHour < HOUR_OF_DAY -> difHour.toString() + "小时前" + difDate < DAY_OF_YESTERDAY -> "昨天" + else -> { + @SuppressLint("SimpleDateFormat") + val convertFormat = SimpleDateFormat("yyyy-MM-dd") + convertFormat.format(date) + } + } + } catch (e: ParseException) { + e.printStackTrace() + } + + return "" + } + + fun checkInstallTime(): Boolean { + val installTime = App.INSTANCE.getPrefLong(PreferKey.installTime) + val currentTime = System.currentTimeMillis() + //如果当前时间比安装时间早7天 并且 安装包开启次数大于7 + return currentTime - installTime > 7 * 24 * 3600 * 1000 && App.INSTANCE.getPrefInt( + PreferKey.installCount, + 0 + ) > 7 + + } + + fun toSize(length: Long): String { + if (length <= 0) return "0" + val units = arrayOf("b", "kb", "M", "G", "T") + //计算单位的,原理是利用lg,公式是 lg(1024^n) = nlg(1024),最后 nlg(1024)/lg(1024) = n。 + //计算单位的,原理是利用lg,公式是 lg(1024^n) = nlg(1024),最后 nlg(1024)/lg(1024) = n。 + val digitGroups = + (log10(length.toDouble()) / log10(1024.0)).toInt() + //计算原理是,size/单位值。单位值指的是:比如说b = 1024,KB = 1024^2 + //计算原理是,size/单位值。单位值指的是:比如说b = 1024,KB = 1024^2 + return DecimalFormat("#,##0.##") + .format(length / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups] + } + + @SuppressLint("DefaultLocale") + fun toFirstCapital(str: String): String { + return str.substring(0, 1).toUpperCase() + str.substring(1) + } + + /** + * 将文本中的半角字符,转换成全角字符 + */ + fun halfToFull(input: String): String { + val c = input.toCharArray() + for (i in c.indices) { + if (c[i].toInt() == 32) + //半角空格 + { + c[i] = 12288.toChar() + continue + } + //根据实际情况,过滤不需要转换的符号 + //if (c[i] == 46) //半角点号,不转换 + // continue; + + if (c[i].toInt() in 33..126) + //其他符号都转换为全角 + c[i] = (c[i].toInt() + 65248).toChar() + } + return String(c) + } + + //功能:字符串全角转换为半角 + fun fullToHalf(input: String): String { + val c = input.toCharArray() + for (i in c.indices) { + if (c[i].toInt() == 12288) + //全角空格 + { + c[i] = 32.toChar() + continue + } + + if (c[i].toInt() in 65281..65374) + c[i] = (c[i].toInt() - 65248).toChar() + } + return String(c) + } + + fun chineseNumToInt(chNum: String): Int { + var result = 0 + var tmp = 0 + var billion = 0 + val cn = chNum.toCharArray() + + // "一零二五" 形式 + if (cn.size > 1 && chNum.matches("^[〇零一二三四五六七八九壹贰叁肆伍陆柒捌玖]$".toRegex())) { + for (i in cn.indices) { + cn[i] = (48 + ChnMap[cn[i]]!!).toChar() + } + return Integer.parseInt(String(cn)) + } + + // "一千零二十五", "一千二" 形式 + try { + for (i in cn.indices) { + val tmpNum = ChnMap[cn[i]]!! + when { + tmpNum == 100000000 -> { + result += tmp + result *= tmpNum + billion = billion * 100000000 + result + result = 0 + tmp = 0 + } + tmpNum == 10000 -> { + result += tmp + result *= tmpNum + tmp = 0 + } + tmpNum >= 10 -> { + if (tmp == 0) + tmp = 1 + result += tmpNum * tmp + tmp = 0 + } + else -> { + tmp = if (i >= 2 && i == cn.size - 1 && ChnMap[cn[i - 1]]!! > 10) + tmpNum * ChnMap[cn[i - 1]]!! / 10 + else + tmp * 10 + tmpNum + } + } + } + result += tmp + billion + return result + } catch (e: Exception) { + return -1 + } + + } + + fun stringToInt(str: String?): Int { + if (str != null) { + val num = fullToHalf(str).replace("\\s+".toRegex(), "") + return try { + Integer.parseInt(num) + } catch (e: Exception) { + chineseNumToInt(num) + } + + } + return -1 + } + + fun isContainNumber(company: String): Boolean { + val p = Pattern.compile("[0-9]+") + val m = p.matcher(company) + return m.find() + } + + fun isNumeric(str: String): Boolean { + val pattern = Pattern.compile("[0-9]+") + val isNum = pattern.matcher(str) + return isNum.matches() + } + + fun wordCountFormat(wc: String?): String { + if (wc == null) return "" + var wordsS = "" + if (isNumeric(wc)) { + val words: Int = wc.toInt() + if (words > 0) { + wordsS = words.toString() + "字" + if (words > 10000) { + val df = DecimalFormat("#.#") + wordsS = df.format(words * 1.0f / 10000f.toDouble()) + "万字" + } + } + } else { + wordsS = wc + } + return wordsS + } + + // 移除字符串首尾空字符的高效方法(利用ASCII值判断,包括全角空格) + fun trim(s: String): String { + if (isEmpty(s)) return "" + var start = 0 + val len = s.length + var end = len - 1 + while (start < end && (s[start].toInt() <= 0x20 || s[start] == ' ')) { + ++start + } + while (start < end && (s[end].toInt() <= 0x20 || s[end] == ' ')) { + --end + } + if (end < len) ++end + return if (start > 0 || end < len) s.substring(start, end) else s + } + + fun repeat(str: String, n: Int): String { + val stringBuilder = StringBuilder() + for (i in 0 until n) { + stringBuilder.append(str) + } + return stringBuilder.toString() + } + + fun removeUTFCharacters(data: String?): String? { + if (data == null) return null + val p = Pattern.compile("\\\\u(\\p{XDigit}{4})") + val m = p.matcher(data) + val buf = StringBuffer(data.length) + while (m.find()) { + val ch = Integer.parseInt(m.group(1)!!, 16).toChar().toString() + m.appendReplacement(buf, Matcher.quoteReplacement(ch)) + } + m.appendTail(buf) + return buf.toString() + } + + fun byteToHexString(bytes: ByteArray?): String { + if (bytes == null) return "" + val sb = StringBuilder(bytes.size * 2) + for (b in bytes) { + val hex = 0xff and b.toInt() + if (hex < 16) { + sb.append('0') + } + sb.append(Integer.toHexString(hex)) + } + return sb.toString() + } + + fun hexStringToByte(hexString: String): ByteArray? { + val hexStr = hexString.replace(" ", "") + val len = hexStr.length + val bytes = ByteArray(len / 2) + var i = 0 + while (i < len) { + // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节 + bytes[i / 2] = ((Character.digit(hexString[i], 16) shl 4) + + Character.digit(hexString[i + 1], 16)).toByte() + i += 2 + } + return bytes + } + + fun convertCC(input: String?): String { + return when (AppConfig.chineseConverterType) { + 1 -> { + HanLP.convertToSimplifiedChinese(input) + } + 2 -> { + HanLP.convertToTraditionalChinese(input) + } + else -> { + input!! + } + } + } +} diff --git a/app/src/main/java/com/novel/read/utils/SystemUtils.kt b/app/src/main/java/com/novel/read/utils/SystemUtils.kt new file mode 100644 index 0000000..58114a8 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/SystemUtils.kt @@ -0,0 +1,73 @@ +package com.novel.read.utils + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Context.POWER_SERVICE +import android.content.Intent +import android.net.Uri +import android.os.PowerManager +import android.provider.Settings +import android.view.View +import android.view.ViewGroup + + +@Suppress("unused") +object SystemUtils { + + private const val NAVIGATION = "navigationBarBackground" + + fun getScreenOffTime(context: Context): Int { + var screenOffTime = 0 + try { + screenOffTime = Settings.System.getInt( + context.contentResolver, + Settings.System.SCREEN_OFF_TIMEOUT + ) + } catch (e: Exception) { + e.printStackTrace() + } + + return screenOffTime + } + + fun ignoreBatteryOptimization(activity: Activity) { + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) return + + val powerManager = activity.getSystemService(POWER_SERVICE) as PowerManager + val hasIgnored = powerManager.isIgnoringBatteryOptimizations(activity.packageName) + // 判断当前APP是否有加入电池优化的白名单,如果没有,弹出加入电池优化的白名单的设置对话框。 + if (!hasIgnored) { + try { + @SuppressLint("BatteryLife") + val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) + intent.data = Uri.parse("package:" + activity.packageName) + activity.startActivity(intent) + } catch (ignored: Throwable) { + } + + } + } + + /** + * 返回NavigationBar是否存在 + * 该方法需要在View完全被绘制出来之后调用,否则判断不了 + * 在比如 onWindowFocusChanged()方法中可以得到正确的结果 + */ + fun isNavigationBarExist(activity: Activity?): Boolean { + activity?.let { + val vp = it.window.decorView as? ViewGroup + if (vp != null) { + for (i in 0 until vp.childCount) { + vp.getChildAt(i).context.packageName + if (vp.getChildAt(i).id != View.NO_ID + && NAVIGATION == activity.resources.getResourceEntryName(vp.getChildAt(i).id) + ) { + return true + } + } + } + } + return false + } +} diff --git a/app/src/main/java/com/novel/read/utils/UIUtils.kt b/app/src/main/java/com/novel/read/utils/UIUtils.kt new file mode 100644 index 0000000..dc44340 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/UIUtils.kt @@ -0,0 +1,45 @@ +package com.novel.read.utils + +import android.content.Context +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.os.Build +import androidx.appcompat.widget.Toolbar +import androidx.core.content.ContextCompat +import com.novel.read.R +import com.novel.read.constant.Theme +import com.novel.read.utils.ext.* + +@Suppress("unused") +object UIUtils { + + /** 设置更多工具条图标和颜色 */ + fun setToolbarMoreIconCustomColor(toolbar: Toolbar?, color: Int? = null) { + toolbar ?: return + val moreIcon = ContextCompat.getDrawable(toolbar.context, R.drawable.ic_launcher_background) + if (moreIcon != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (color != null) { + moreIcon.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP) + } + toolbar.overflowIcon = moreIcon + } + } + + + fun getMenuColor( + context: Context, + theme: Theme = Theme.Auto, + requiresOverflow: Boolean = false + ): Int { + val defaultTextColor = context.getCompatColor(R.color.primaryText) + if (requiresOverflow) + return defaultTextColor + val primaryTextColor = context.primaryTextColor + return when (theme) { + Theme.Dark -> context.getCompatColor(R.color.md_white_1000) + Theme.Light -> context.getCompatColor(R.color.md_black_1000) + else -> primaryTextColor + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ViewUtils.kt b/app/src/main/java/com/novel/read/utils/ViewUtils.kt new file mode 100644 index 0000000..31844e2 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ViewUtils.kt @@ -0,0 +1,42 @@ +package com.novel.read.utils + +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.TransitionDrawable +import android.view.View +import android.view.ViewTreeObserver +import androidx.annotation.ColorInt + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +@Suppress("unused") +object ViewUtils { + + fun removeOnGlobalLayoutListener(v: View, listener: ViewTreeObserver.OnGlobalLayoutListener) { + v.viewTreeObserver.removeOnGlobalLayoutListener(listener) + } + + fun setBackgroundCompat(view: View, drawable: Drawable?) { + view.background = drawable + } + + fun setBackgroundTransition(view: View, newDrawable: Drawable): TransitionDrawable { + val transition = DrawableUtils.createTransitionDrawable(view.background, newDrawable) + setBackgroundCompat(view, transition) + return transition + } + + fun setBackgroundColorTransition(view: View, @ColorInt newColor: Int): TransitionDrawable { + val oldColor = view.background + + val start = oldColor ?: ColorDrawable(view.solidColor) + val end = ColorDrawable(newColor) + + val transition = DrawableUtils.createTransitionDrawable(start, end) + + setBackgroundCompat(view, transition) + + return transition + } +} diff --git a/app/src/main/java/com/novel/read/utils/ext/ActivityExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/ActivityExtensions.kt new file mode 100644 index 0000000..5ee36fa --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/ActivityExtensions.kt @@ -0,0 +1,32 @@ +package com.novel.read.utils.ext + +import android.app.Activity +import android.content.Intent +import android.os.Build +import android.util.DisplayMetrics +import android.view.WindowInsets +import android.view.WindowMetrics + + +inline fun Activity.startActivityForResult( + requestCode: Int, + configIntent: Intent.() -> Unit = {} +) { + startActivityForResult(Intent(this, A::class.java).apply(configIntent), requestCode) +} + + +fun Activity.getSize(): DisplayMetrics { + val displayMetrics = DisplayMetrics() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val windowMetrics: WindowMetrics = windowManager.currentWindowMetrics + val insets = windowMetrics.windowInsets + .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()) + displayMetrics.widthPixels = windowMetrics.bounds.width() - insets.left - insets.right + displayMetrics.heightPixels = windowMetrics.bounds.height() - insets.top - insets.bottom + } else { + @Suppress("DEPRECATION") + windowManager.defaultDisplay.getMetrics(displayMetrics) + } + return displayMetrics +} diff --git a/app/src/main/java/com/novel/read/utils/ext/AlertDialogExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/AlertDialogExtensions.kt new file mode 100644 index 0000000..74846db --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/AlertDialogExtensions.kt @@ -0,0 +1,13 @@ +package com.novel.read.utils.ext + +import android.view.WindowManager +import androidx.appcompat.app.AlertDialog +import com.novel.read.lib.ATH + +fun AlertDialog.applyTint(): AlertDialog { + return ATH.setAlertDialogTint(this) +} + +fun AlertDialog.requestInputMethod(){ + window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) +} diff --git a/app/src/main/java/com/novel/read/utils/ext/ContextExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/ContextExtensions.kt new file mode 100644 index 0000000..b57c625 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/ContextExtensions.kt @@ -0,0 +1,206 @@ +@file:Suppress("unused") + +package com.novel.read.utils.ext + +import android.content.* +import android.content.pm.PackageManager +import android.content.res.ColorStateList +import android.content.res.Configuration +import android.graphics.drawable.Drawable +import android.net.Uri +import android.os.BatteryManager +import android.provider.Settings +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.core.content.ContextCompat +import androidx.core.content.edit +import com.novel.read.R +import org.jetbrains.anko.defaultSharedPreferences +import org.jetbrains.anko.longToast +import org.jetbrains.anko.toast +import java.io.File + +fun Context.getPrefBoolean(key: String, defValue: Boolean = false) = + defaultSharedPreferences.getBoolean(key, defValue) + +fun Context.getPrefBoolean(@StringRes keyId: Int, defValue: Boolean = false) = + defaultSharedPreferences.getBoolean(getString(keyId), defValue) + +fun Context.putPrefBoolean(key: String, value: Boolean = false) = + defaultSharedPreferences.edit { putBoolean(key, value) } + +fun Context.getPrefInt(key: String, defValue: Int = 0) = + defaultSharedPreferences.getInt(key, defValue) + +fun Context.putPrefInt(key: String, value: Int) = + defaultSharedPreferences.edit { putInt(key, value) } + +fun Context.getPrefLong(key: String, defValue: Long = 0L) = + defaultSharedPreferences.getLong(key, defValue) + +fun Context.putPrefLong(key: String, value: Long) = + defaultSharedPreferences.edit { putLong(key, value) } + +fun Context.getPrefString(key: String, defValue: String? = null) = + defaultSharedPreferences.getString(key, defValue) + +fun Context.getPrefString(@StringRes keyId: Int, defValue: String? = null) = + defaultSharedPreferences.getString(getString(keyId), defValue) + +fun Context.putPrefString(key: String, value: String?) = + defaultSharedPreferences.edit { putString(key, value) } + +fun Context.getPrefStringSet( + key: String, + defValue: MutableSet? = null +): MutableSet? = defaultSharedPreferences.getStringSet(key, defValue) + +fun Context.putPrefStringSet(key: String, value: MutableSet) = + defaultSharedPreferences.edit { putStringSet(key, value) } + +fun Context.removePref(key: String) = + defaultSharedPreferences.edit { remove(key) } + + +fun Context.getCompatColor(@ColorRes id: Int): Int = ContextCompat.getColor(this, id) + +fun Context.getCompatDrawable(@DrawableRes id: Int): Drawable? = ContextCompat.getDrawable(this, id) + +fun Context.getCompatColorStateList(@ColorRes id: Int): ColorStateList? = + ContextCompat.getColorStateList(this, id) + +/** + * 系统息屏时间 + */ +val Context.sysScreenOffTime: Int + get() { + var screenOffTime = 0 + try { + screenOffTime = + Settings.System.getInt(contentResolver, Settings.System.SCREEN_OFF_TIMEOUT) + } catch (e: Exception) { + e.printStackTrace() + } + return screenOffTime + } + +val Context.statusBarHeight: Int + get() { + val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android") + return resources.getDimensionPixelSize(resourceId) + } + +val Context.navigationBarHeight: Int + get() { + val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") + return resources.getDimensionPixelSize(resourceId) + } + + +fun Context.sendToClip(text: String) { + val clipboard = + getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager + val clipData = ClipData.newPlainText(null, text) + clipboard?.let { + clipboard.setPrimaryClip(clipData) + longToast(R.string.copy_complete) + } +} + +fun Context.getClipText(): String? { + val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager? + clipboard?.primaryClip?.let { + if (it.itemCount > 0) { + return it.getItemAt(0).text.toString().trim() + } + } + return null +} + +fun Context.sendMail(mail: String) { + try { + val intent = Intent(Intent.ACTION_SENDTO) + intent.data = Uri.parse("mailto:$mail") + startActivity(intent) + } catch (e: Exception) { + toast(e.localizedMessage ?: "Error") + } +} + +/** + * 系统是否暗色主题 + */ +fun Context.sysIsDarkMode(): Boolean { + val mode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + return mode == Configuration.UI_MODE_NIGHT_YES +} + +/** + * 获取电量 + */ +val Context.sysBattery: Int + get() { + val iFilter = IntentFilter(Intent.ACTION_BATTERY_CHANGED) + val batteryStatus = registerReceiver(null, iFilter) + return batteryStatus?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1 + } + +val Context.externalFilesDir: File + get() = this.getExternalFilesDir(null) ?: this.filesDir + +val Context.eCacheDir: File + get() = this.externalCacheDir ?: this.cacheDir + +fun Context.openUrl(url: String) { + openUrl(Uri.parse(url)) +} + +fun Context.openUrl(uri: Uri) { + val intent = Intent(Intent.ACTION_VIEW) + intent.data = uri + if (intent.resolveActivity(packageManager) != null) { + try { + startActivity(intent) + } catch (e: Exception) { + toast(e.localizedMessage ?: "open url error") + } + } else { + try { + startActivity(Intent.createChooser(intent, "请选择浏览器")) + } catch (e: Exception) { + toast(e.localizedMessage ?: "open url error") + } + } +} + +val Context.channel: String + get() { + try { + val pm = packageManager + val appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA) + return appInfo.metaData.getString("channel") ?: "" + } catch (e: Exception) { + e.printStackTrace() + } + return "" + } + +fun Context.goShop(){ + val uri = Uri.parse("market://details?id=$packageName") + val goToMarket = Intent(Intent.ACTION_VIEW, uri) + val googlePlay = "com.android.vending"//这里对应的是谷歌商店,跳转别的商店改成对应的即可 + + goToMarket.setPackage(googlePlay)//这里对应的是谷歌商店,跳转别的商店改成对应的即可 + + try { + this.startActivity(goToMarket) + } catch (e: ActivityNotFoundException) { + if (goToMarket.resolveActivity(this.packageManager) != null) { //有浏览器 + this.startActivity(goToMarket) + } else { + toast(getString(R.string.no_google)) + } + e.printStackTrace() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ext/EventBusExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/EventBusExtensions.kt new file mode 100644 index 0000000..4320951 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/EventBusExtensions.kt @@ -0,0 +1,69 @@ +package com.novel.read.utils.ext + +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import com.jeremyliao.liveeventbus.LiveEventBus +import com.jeremyliao.liveeventbus.core.Observable + +inline fun eventObservable(tag: String): Observable { + return LiveEventBus.get(tag, EVENT::class.java) +} + +inline fun postEvent(tag: String, event: EVENT) { + LiveEventBus.get(tag).post(event) +} + +inline fun postEventDelay(tag: String, event: EVENT, delay: Long) { + LiveEventBus.get(tag).postDelay(event, delay) +} + +inline fun AppCompatActivity.observeEvent( + vararg tags: String, + noinline observer: (EVENT) -> Unit +) { + val o = Observer { + observer(it) + } + tags.forEach { + eventObservable(it).observe(this, o) + } +} + + +inline fun AppCompatActivity.observeEventSticky( + vararg tags: String, + noinline observer: (EVENT) -> Unit +) { + val o = Observer { + observer(it) + } + tags.forEach { + eventObservable(it).observeSticky(this, o) + } +} + +inline fun Fragment.observeEvent( + vararg tags: String, + noinline observer: (EVENT) -> Unit +) { + val o = Observer { + observer(it) + } + tags.forEach { + eventObservable(it).observe(this, o) + } +} + +inline fun Fragment.observeEventSticky( + vararg tags: String, + noinline observer: (EVENT) -> Unit +) { + val o = Observer { + observer(it) + } + tags.forEach { + eventObservable(it).observeSticky(this, o) + } +} + diff --git a/app/src/main/java/com/novel/read/utils/ext/FloatExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/FloatExtensions.kt new file mode 100644 index 0000000..a50b329 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/FloatExtensions.kt @@ -0,0 +1,16 @@ +@file:Suppress("unused") + +package com.novel.read.utils.ext + +import android.content.res.Resources + +val Float.dp: Float + get() = android.util.TypedValue.applyDimension( + android.util.TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics + ) + +val Float.sp: Float + get() = android.util.TypedValue.applyDimension( + android.util.TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics + ) + diff --git a/app/src/main/java/com/novel/read/utils/ext/FragmentExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/FragmentExtensions.kt new file mode 100644 index 0000000..14e4629 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/FragmentExtensions.kt @@ -0,0 +1,85 @@ +@file:Suppress("unused") + +package com.novel.read.utils.ext + +import android.app.Activity +import android.app.Service +import android.content.Intent +import android.content.res.ColorStateList +import android.graphics.drawable.Drawable +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.core.content.edit +import androidx.fragment.app.Fragment +import org.jetbrains.anko.connectivityManager +import org.jetbrains.anko.defaultSharedPreferences +import org.jetbrains.anko.internals.AnkoInternals + +@Suppress("DEPRECATION") +fun Fragment.isOnline() = + requireContext().connectivityManager.activeNetworkInfo?.isConnected == true + +fun Fragment.getPrefBoolean(key: String, defValue: Boolean = false) = + requireContext().defaultSharedPreferences.getBoolean(key, defValue) + +fun Fragment.putPrefBoolean(key: String, value: Boolean = false) = + requireContext().defaultSharedPreferences.edit { putBoolean(key, value) } + +fun Fragment.getPrefInt(key: String, defValue: Int = 0) = + requireContext().defaultSharedPreferences.getInt(key, defValue) + +fun Fragment.putPrefInt(key: String, value: Int) = + requireContext().defaultSharedPreferences.edit { putInt(key, value) } + +fun Fragment.getPrefLong(key: String, defValue: Long = 0L) = + requireContext().defaultSharedPreferences.getLong(key, defValue) + +fun Fragment.putPrefLong(key: String, value: Long) = + requireContext().defaultSharedPreferences.edit { putLong(key, value) } + +fun Fragment.getPrefString(key: String, defValue: String? = null) = + requireContext().defaultSharedPreferences.getString(key, defValue) + +fun Fragment.putPrefString(key: String, value: String) = + requireContext().defaultSharedPreferences.edit { putString(key, value) } + +fun Fragment.getPrefStringSet( + key: String, + defValue: MutableSet? = null +): MutableSet? = + requireContext().defaultSharedPreferences.getStringSet(key, defValue) + +fun Fragment.putPrefStringSet(key: String, value: MutableSet) = + requireContext().defaultSharedPreferences.edit { putStringSet(key, value) } + +fun Fragment.removePref(key: String) = + requireContext().defaultSharedPreferences.edit { remove(key) } + +fun Fragment.getCompatColor(@ColorRes id: Int): Int = requireContext().getCompatColor(id) + +fun Fragment.getCompatDrawable(@DrawableRes id: Int): Drawable? = + requireContext().getCompatDrawable(id) + +fun Fragment.getCompatColorStateList(@ColorRes id: Int): ColorStateList? = + requireContext().getCompatColorStateList(id) + +inline fun Fragment.startActivity(vararg params: Pair) = + AnkoInternals.internalStartActivity(requireActivity(), T::class.java, params) + +inline fun Fragment.startActivityForResult( + requestCode: Int, + vararg params: Pair +) = + startActivityForResult( + AnkoInternals.createIntent(requireActivity(), T::class.java, params), + requestCode + ) + +inline fun Fragment.startService(vararg params: Pair) = + AnkoInternals.internalStartService(requireActivity(), T::class.java, params) + +inline fun Fragment.stopService(vararg params: Pair) = + AnkoInternals.internalStopService(requireActivity(), T::class.java, params) + +inline fun Fragment.intentFor(vararg params: Pair): Intent = + AnkoInternals.createIntent(requireActivity(), T::class.java, params) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ext/GsonExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/GsonExtensions.kt new file mode 100644 index 0000000..eeae03b --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/GsonExtensions.kt @@ -0,0 +1,138 @@ +package com.novel.read.utils.ext + +import com.google.gson.* +import com.google.gson.internal.LinkedTreeMap +import com.google.gson.reflect.TypeToken +import org.jetbrains.anko.attempt +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type +import kotlin.jvm.Throws +import kotlin.math.ceil + + +val GSON: Gson by lazy { + GsonBuilder() + .registerTypeAdapter( + object : TypeToken?>() {}.type, + MapDeserializerDoubleAsIntFix() + ) + .registerTypeAdapter(Int::class.java, IntJsonDeserializer()) + .disableHtmlEscaping() + .setPrettyPrinting() + .create() +} + +inline fun genericType(): Type = object : TypeToken() {}.type + +inline fun Gson.fromJsonObject(json: String?): T? {//可转成任意类型 + return attempt { + val result: T? = fromJson(json, genericType()) + result + }.value +} + +inline fun Gson.fromJsonArray(json: String?): List? { + return attempt { + val result: List? = fromJson(json, ParameterizedTypeImpl(T::class.java)) + result + }.value +} + +class ParameterizedTypeImpl(private val clazz: Class<*>) : ParameterizedType { + override fun getRawType(): Type = List::class.java + + override fun getOwnerType(): Type? = null + + override fun getActualTypeArguments(): Array = arrayOf(clazz) +} + +/** + * int类型转化失败时跳过 + */ +class IntJsonDeserializer : JsonDeserializer { + + override fun deserialize( + json: JsonElement, + typeOfT: Type?, + context: JsonDeserializationContext? + ): Int? { + return when { + json.isJsonPrimitive -> { + val prim = json.asJsonPrimitive + if (prim.isNumber) { + prim.asNumber.toInt() + } else { + null + } + } + else -> null + } + } + +} + + +/** + * 修复Int变为Double的问题 + */ +class MapDeserializerDoubleAsIntFix : + JsonDeserializer?> { + + @Throws(JsonParseException::class) + override fun deserialize( + jsonElement: JsonElement, + type: Type, + jsonDeserializationContext: JsonDeserializationContext + ): Map? { + @Suppress("unchecked_cast") + return read(jsonElement) as? Map + } + + fun read(json: JsonElement): Any? { + when { + json.isJsonArray -> { + val list: MutableList = ArrayList() + val arr = json.asJsonArray + for (anArr in arr) { + list.add(read(anArr)) + } + return list + } + json.isJsonObject -> { + val map: MutableMap = + LinkedTreeMap() + val obj = json.asJsonObject + val entitySet = + obj.entrySet() + for ((key, value) in entitySet) { + map[key] = read(value) + } + return map + } + json.isJsonPrimitive -> { + val prim = json.asJsonPrimitive + when { + prim.isBoolean -> { + return prim.asBoolean + } + prim.isString -> { + return prim.asString + } + prim.isNumber -> { + val num: Number = prim.asNumber + // here you can handle double int/long values + // and return any type you want + // this solution will transform 3.0 float to long values + return if (ceil(num.toDouble()) == num.toLong().toDouble()) { + num.toLong() + } else { + num.toDouble() + } + } + } + } + } + return null + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ext/IntExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/IntExtensions.kt new file mode 100644 index 0000000..87de5a6 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/IntExtensions.kt @@ -0,0 +1,16 @@ +package com.novel.read.utils.ext + +import android.content.res.Resources + +val Int.dp: Int + get() = android.util.TypedValue.applyDimension( + android.util.TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics + ).toInt() + +val Int.sp: Int + get() = android.util.TypedValue.applyDimension( + android.util.TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics + ).toInt() + +val Int.hexString: String + get() = Integer.toHexString(this) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ext/MaterialValueHelper.kt b/app/src/main/java/com/novel/read/utils/ext/MaterialValueHelper.kt new file mode 100644 index 0000000..9115692 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/MaterialValueHelper.kt @@ -0,0 +1,127 @@ +@file:Suppress("unused") + +package com.novel.read.utils.ext + +import android.annotation.SuppressLint +import android.content.Context +import androidx.annotation.ColorInt +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import com.novel.read.R +import com.novel.read.lib.ThemeStore +import com.novel.read.utils.ColorUtils + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +@SuppressLint("PrivateResource") +@ColorInt +fun Context.getPrimaryTextColor(dark: Boolean): Int { + return if (dark) { + ContextCompat.getColor(this, R.color.primary_text_default_material_light) + } else ContextCompat.getColor(this, R.color.primary_text_default_material_dark) +} + +@SuppressLint("PrivateResource") +@ColorInt +fun Context.getSecondaryTextColor(dark: Boolean): Int { + return if (dark) { + ContextCompat.getColor(this, R.color.secondary_text_default_material_light) + } else ContextCompat.getColor(this, R.color.secondary_text_default_material_dark) +} + +@SuppressLint("PrivateResource") +@ColorInt +fun Context.getPrimaryDisabledTextColor(dark: Boolean): Int { + return if (dark) { + ContextCompat.getColor(this, R.color.primary_text_disabled_material_light) + } else ContextCompat.getColor(this, R.color.primary_text_disabled_material_dark) +} + +@SuppressLint("PrivateResource") +@ColorInt +fun Context.getSecondaryDisabledTextColor(dark: Boolean): Int { + return if (dark) { + ContextCompat.getColor(this, R.color.secondary_text_disabled_material_light) + } else ContextCompat.getColor(this, R.color.secondary_text_disabled_material_dark) +} + +val Context.primaryColor: Int + get() = ThemeStore.primaryColor(this) + +val Context.primaryColorDark: Int + get() = ThemeStore.primaryColorDark(this) + +val Context.accentColor: Int + get() = ThemeStore.accentColor(this) + +val Context.backgroundColor: Int + get() = ThemeStore.backgroundColor(this) + +val Context.bottomBackground: Int + get() = ThemeStore.bottomBackground(this) + +val Context.primaryTextColor: Int + get() = getPrimaryTextColor(isDarkTheme) + +val Context.secondaryTextColor: Int + get() = getSecondaryTextColor(isDarkTheme) + +val Context.primaryDisabledTextColor: Int + get() = getPrimaryDisabledTextColor(isDarkTheme) + +val Context.secondaryDisabledTextColor: Int + get() = getSecondaryDisabledTextColor(isDarkTheme) + +val Fragment.primaryColor: Int + get() = ThemeStore.primaryColor(requireContext()) + +val Fragment.primaryColorDark: Int + get() = ThemeStore.primaryColorDark( + requireContext() + ) + +val Fragment.accentColor: Int + get() = ThemeStore.accentColor(requireContext()) + +val Fragment.backgroundColor: Int + get() = ThemeStore.backgroundColor( + requireContext() + ) + +val Fragment.bottomBackground: Int + get() = ThemeStore.bottomBackground( + requireContext() + ) + +val Fragment.primaryTextColor: Int + get() = requireContext().getPrimaryTextColor(isDarkTheme) + +val Fragment.secondaryTextColor: Int + get() = requireContext().getSecondaryTextColor(isDarkTheme) + +val Fragment.primaryDisabledTextColor: Int + get() = requireContext().getPrimaryDisabledTextColor(isDarkTheme) + +val Fragment.secondaryDisabledTextColor: Int + get() = requireContext().getSecondaryDisabledTextColor(isDarkTheme) + +val Context.buttonDisabledColor: Int + get() = if (isDarkTheme) { + ContextCompat.getColor(this, R.color.ate_button_disabled_dark) + } else { + ContextCompat.getColor(this, R.color.ate_button_disabled_light) + } + +val Context.isDarkTheme: Boolean + get() = ColorUtils.isColorLight( + ThemeStore.primaryColor( + this + ) + ) + +val Fragment.isDarkTheme: Boolean + get() = requireContext().isDarkTheme + +val Context.elevation: Float + get() = ThemeStore.elevation(this) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ext/MenuExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/MenuExtensions.kt new file mode 100644 index 0000000..757a84e --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/MenuExtensions.kt @@ -0,0 +1,61 @@ +package com.novel.read.utils.ext + +import android.annotation.SuppressLint +import android.content.Context +import android.view.Menu +import android.view.MenuItem +import androidx.appcompat.view.menu.MenuBuilder +import androidx.appcompat.view.menu.MenuItemImpl +import androidx.core.view.forEach +import com.novel.read.R +import com.novel.read.constant.Theme +import com.novel.read.utils.DrawableUtils +import com.novel.read.utils.UIUtils +import java.lang.reflect.Method +import java.util.* + +@SuppressLint("RestrictedApi") +fun Menu.applyTint(context: Context, theme: Theme = Theme.Auto): Menu = this.let { menu -> + if (menu is MenuBuilder) { + menu.setOptionalIconsVisible(true) + } + val defaultTextColor = context.getCompatColor(R.color.primaryText) + val tintColor = UIUtils.getMenuColor(context, theme) + menu.forEach { item -> + (item as MenuItemImpl).let { impl -> + //overflow:展开的item + DrawableUtils.setTint( + impl.icon, + if (impl.requiresOverflow()) defaultTextColor + else tintColor + ) + } + } + return menu +} + +fun Menu.applyOpenTint(context: Context) { + //展开菜单显示图标 + if (this.javaClass.simpleName.equals("MenuBuilder", ignoreCase = true)) { + val defaultTextColor = context.getCompatColor(R.color.primaryText) + try { + var method: Method = + this.javaClass.getDeclaredMethod("setOptionalIconsVisible", java.lang.Boolean.TYPE) + method.isAccessible = true + method.invoke(this, true) + method = this.javaClass.getDeclaredMethod("getNonActionItems") + val menuItems = method.invoke(this) + if (menuItems is ArrayList<*>) { + for (menuItem in menuItems) { + if (menuItem is MenuItem) { + DrawableUtils.setTint( + menuItem.icon, + defaultTextColor + ) + } + } + } + } catch (ignored: Exception) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ext/StringExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/StringExtensions.kt new file mode 100644 index 0000000..96da40d --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/StringExtensions.kt @@ -0,0 +1,86 @@ +@file:Suppress("unused") + +package com.novel.read.utils.ext + +import android.net.Uri +import java.io.File + +val removeHtmlRegex = "]*>".toRegex() +val imgRegex = "]*>".toRegex() +val notImgHtmlRegex = "]*>".toRegex() + +fun String?.safeTrim() = if (this.isNullOrBlank()) null else this.trim() + +fun String?.isContentPath(): Boolean = this?.startsWith("content://") == true + +fun String.parseToUri(): Uri { + return if (isContentPath()) { + Uri.parse(this) + } else { + Uri.fromFile(File(this)) + } +} + +fun String?.isAbsUrl() = + this?.let { + it.startsWith("http://", true) + || it.startsWith("https://", true) + } ?: false + +fun String?.isJson(): Boolean = + this?.run { + val str = this.trim() + when { + str.startsWith("{") && str.endsWith("}") -> true + str.startsWith("[") && str.endsWith("]") -> true + else -> false + } + } ?: false + +fun String?.isJsonObject(): Boolean = + this?.run { + val str = this.trim() + str.startsWith("{") && str.endsWith("}") + } ?: false + +fun String?.isJsonArray(): Boolean = + this?.run { + val str = this.trim() + str.startsWith("[") && str.endsWith("]") + } ?: false + +fun String?.htmlFormat(): String { + this ?: return "" + return this + .replace(imgRegex, "\n$0\n") + .replace(removeHtmlRegex, "\n") + .replace(notImgHtmlRegex, "") + .replace("\\s*\\n+\\s*".toRegex(), "\n  ") + .replace("^[\\n\\s]+".toRegex(), "  ") + .replace("[\\n\\s]+$".toRegex(), "") +} + +fun String.splitNotBlank(vararg delimiter: String): Array = run { + this.split(*delimiter).map { it.trim() }.filterNot { it.isBlank() }.toTypedArray() +} + +fun String.splitNotBlank(regex: Regex, limit: Int = 0): Array = run { + this.split(regex, limit).map { it.trim() }.filterNot { it.isBlank() }.toTypedArray() +} + +/** + * 将字符串拆分为单个字符,包含emoji + */ +fun String.toStringArray(): Array { + var codePointIndex = 0 + return try { + Array(codePointCount(0, length)) { + val start = codePointIndex + codePointIndex = offsetByCodePoints(start, 1) + substring(start, codePointIndex) + } + } catch (e: Exception) { + split("").toTypedArray() + } +} + diff --git a/app/src/main/java/com/novel/read/utils/ext/Toasts.kt b/app/src/main/java/com/novel/read/utils/ext/Toasts.kt new file mode 100644 index 0000000..aed7fa2 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/Toasts.kt @@ -0,0 +1,37 @@ +@file:Suppress("unused") + +package com.novel.read.utils.ext + +import android.widget.Toast +import androidx.fragment.app.Fragment +import org.jetbrains.anko.longToast +import org.jetbrains.anko.toast + + +/** + * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration. + * + * @param message the message text resource. + */ +fun Fragment.toast(message: Int) = requireActivity().toast(message) + +/** + * Display the simple Toast message with the [Toast.LENGTH_SHORT] duration. + * + * @param message the message text. + */ +fun Fragment.toast(message: CharSequence) = requireActivity().toast(message) + +/** + * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. + * + * @param message the message text resource. + */ +fun Fragment.longToast(message: Int) = requireActivity().longToast(message) + +/** + * Display the simple Toast message with the [Toast.LENGTH_LONG] duration. + * + * @param message the message text. + */ +fun Fragment.longToast(message: CharSequence) = requireActivity().longToast(message) diff --git a/app/src/main/java/com/novel/read/utils/ext/ViewExtensions.kt b/app/src/main/java/com/novel/read/utils/ext/ViewExtensions.kt new file mode 100644 index 0000000..2f9b184 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/ViewExtensions.kt @@ -0,0 +1,119 @@ +package com.novel.read.utils.ext + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.os.Build +import android.view.View +import android.view.View.* +import android.view.inputmethod.InputMethodManager +import android.widget.RadioGroup +import android.widget.SeekBar +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.view.menu.MenuPopupHelper +import androidx.appcompat.widget.PopupMenu +import androidx.core.view.get +import com.novel.read.App +import java.lang.reflect.Field + + +private tailrec fun getCompatActivity(context: Context?): AppCompatActivity? { + return when (context) { + is AppCompatActivity -> context + is androidx.appcompat.view.ContextThemeWrapper -> getCompatActivity(context.baseContext) + is android.view.ContextThemeWrapper -> getCompatActivity(context.baseContext) + else -> null + } +} + +val View.activity: AppCompatActivity? + get() = getCompatActivity(context) + +fun View.hideSoftInput() = run { + val imm = App.INSTANCE.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager + imm?.let { + imm.hideSoftInputFromWindow(this.windowToken, 0) + } +} + +fun View.disableAutoFill() = run { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + this.importantForAutofill = IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS + } +} + +fun View.gone() { + if (visibility != GONE) { + visibility = GONE + } +} + +fun View.invisible() { + if (visibility != INVISIBLE) { + visibility = INVISIBLE + } +} + +fun View.visible() { + if (visibility != VISIBLE) { + visibility = VISIBLE + } +} + +fun View.visible(visible: Boolean) { + if (visible && visibility != VISIBLE) { + visibility = VISIBLE + } else if (!visible && visibility == VISIBLE) { + visibility = INVISIBLE + } +} + +fun View.screenshot(): Bitmap? { + return runCatching { + val screenshot = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + val c = Canvas(screenshot) + c.translate(-scrollX.toFloat(), -scrollY.toFloat()) + draw(c) + screenshot + }.getOrNull() +} + +fun SeekBar.progressAdd(int: Int) { + progress += int +} + +fun RadioGroup.getIndexById(id: Int): Int { + for (i in 0 until this.childCount) { + if (id == get(i).id) { + return i + } + } + return 0 +} + +fun RadioGroup.getCheckedIndex(): Int { + for (i in 0 until this.childCount) { + if (checkedRadioButtonId == get(i).id) { + return i + } + } + return 0 +} + +fun RadioGroup.checkByIndex(index: Int) { + check(get(index).id) +} + +@SuppressLint("RestrictedApi") +fun PopupMenu.show(x: Int, y: Int) { + try { + val field: Field = this.javaClass.getDeclaredField("mPopup") + field.isAccessible = true + (field.get(this) as MenuPopupHelper).show(x, y) + } catch (e: NoSuchFieldException) { + e.printStackTrace() + } catch (e: IllegalAccessException) { + e.printStackTrace() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utils/ext/ViewModelKt.kt b/app/src/main/java/com/novel/read/utils/ext/ViewModelKt.kt new file mode 100644 index 0000000..918d094 --- /dev/null +++ b/app/src/main/java/com/novel/read/utils/ext/ViewModelKt.kt @@ -0,0 +1,18 @@ +package com.novel.read.utils.ext + +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +fun AppCompatActivity.getViewModel(clazz: Class) = + ViewModelProvider(this).get(clazz) + +fun Fragment.getViewModel(clazz: Class) = + ViewModelProvider(this).get(clazz) + +/** + * 与activity数据同步 + */ +fun Fragment.getViewModelOfActivity(clazz: Class) = + ViewModelProvider(requireActivity()).get(clazz) \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utlis/BrightnessUtils.kt b/app/src/main/java/com/novel/read/utlis/BrightnessUtils.kt deleted file mode 100644 index 10b43e1..0000000 --- a/app/src/main/java/com/novel/read/utlis/BrightnessUtils.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.novel.read.utlis - -import android.app.Activity -import android.content.ContentResolver -import android.provider.Settings -import android.util.Log -import android.view.WindowManager - -/** - * Created by zlj - * 调节亮度的工具类 - */ - -object BrightnessUtils { - private val TAG = "BrightnessUtils" - - /** - * 判断是否开启了自动亮度调节 - */ - fun isAutoBrightness(activity: Activity): Boolean { - var isAuto = false - try { - isAuto = Settings.System.getInt( - activity.contentResolver, - Settings.System.SCREEN_BRIGHTNESS_MODE - ) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC - } catch (e: Settings.SettingNotFoundException) { - e.printStackTrace() - } - - return isAuto - } - - /** - * 获取屏幕的亮度 - * 系统亮度模式中,自动模式与手动模式获取到的系统亮度的值不同 - */ - fun getScreenBrightness(activity: Activity): Int { - return if (isAutoBrightness(activity)) { - getAutoScreenBrightness(activity) - } else { - getManualScreenBrightness(activity) - } - } - - /** - * 获取手动模式下的屏幕亮度 - * @return value:0~255 - */ - fun getManualScreenBrightness(activity: Activity): Int { - var nowBrightnessValue = 0 - val resolver = activity.contentResolver - try { - nowBrightnessValue = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS) - } catch (e: Exception) { - e.printStackTrace() - } - - return nowBrightnessValue - } - - /** - * 获取自动模式下的屏幕亮度 - * @return value:0~255 - */ - fun getAutoScreenBrightness(activity: Activity): Int { - var nowBrightnessValue = 0f - - //获取自动调节下的亮度范围在 0~1 之间 - val resolver = activity.contentResolver - try { - nowBrightnessValue = - Settings.System.getFloat(resolver, Settings.System.SCREEN_BRIGHTNESS) - Log.d(TAG, "getAutoScreenBrightness: $nowBrightnessValue") - } catch (e: Exception) { - e.printStackTrace() - } - - //转换范围为 (0~255) - val fValue = nowBrightnessValue * 225.0f - Log.d(TAG, "brightness: $fValue") - return fValue.toInt() - } - - /** - * 设置亮度:通过设置 Windows 的 screenBrightness 来修改当前 Windows 的亮度 - * lp.screenBrightness:参数范围为 0~1 - */ - fun setBrightness(activity: Activity, brightness: Int) { - try { - val lp = activity.window.attributes - //将 0~255 范围内的数据,转换为 0~1 - lp.screenBrightness = java.lang.Float.valueOf(brightness.toFloat()) * (1f / 255f) - Log.d(TAG, "lp.screenBrightness == " + lp.screenBrightness) - activity.window.attributes = lp - } catch (ex: Exception) { - ex.printStackTrace() - } - - } - - /** - * 获取当前系统的亮度 - * @param activity - */ - fun setDefaultBrightness(activity: Activity) { - try { - val lp = activity.window.attributes - lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE - activity.window.attributes = lp - } catch (ex: Exception) { - ex.printStackTrace() - } - - } -} diff --git a/app/src/main/java/com/novel/read/utlis/Charset.kt b/app/src/main/java/com/novel/read/utlis/Charset.kt deleted file mode 100644 index ba67d99..0000000 --- a/app/src/main/java/com/novel/read/utlis/Charset.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.novel.read.utlis - -/** - * 编码类型 - */ -enum class Charset private constructor(var code: String) { - UTF8("UTF-8"), - UTF16LE("UTF-16LE"), - UTF16BE("UTF-16BE"), - GBK("GBK"); - - - companion object { - val BLANK: Byte = 0x0a - } -} diff --git a/app/src/main/java/com/novel/read/utlis/CleanCacheUtils.kt b/app/src/main/java/com/novel/read/utlis/CleanCacheUtils.kt deleted file mode 100644 index 0e15a1b..0000000 --- a/app/src/main/java/com/novel/read/utlis/CleanCacheUtils.kt +++ /dev/null @@ -1,170 +0,0 @@ -package com.novel.read.utlis - -import android.content.Context -import android.os.Environment - -import com.novel.read.model.db.BookChapterBean -import com.novel.read.model.db.CollBookBean -import com.novel.read.model.db.SearchListTable - -import org.litepal.LitePal - -import java.io.File -import java.math.BigDecimal - -/** - * @author: LiJun 390057892@qq.com - * @date: 2018/4/11 16:00 - */ - -class CleanCacheUtils { - - /** - * @param context - * @return - * @throws Exception - * 获取当前缓存 - */ - @Throws(Exception::class) - fun getTotalCacheSize(context: Context): String { - var cacheSize = getFolderSize(context.cacheDir) - if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) { - cacheSize += getFolderSize(context.externalCacheDir) - } - return getFormatSize(cacheSize.toDouble()) - } - - - /** - * 清除缓存 - * - * @param clearReadPos 是否删除阅读记录 - */ - @Synchronized - fun clearCache(clearReadPos: Boolean, clearCollect: Boolean, context: Context) { - try { - clearAllCache(context) - // 删除搜索记录(SharePreference) - if (clearReadPos) { - LitePal.deleteAll(SearchListTable::class.java) - } - // 清空书架 - if (clearCollect) { - LitePal.deleteAll(CollBookBean::class.java) - LitePal.deleteAll(BookChapterBean::class.java) - } - } catch (e: Exception) { - } - - } - - companion object { - - private var instance: CleanCacheUtils? = null - - @Synchronized - fun getInstance(): CleanCacheUtils { - if (instance == null) { - instance = CleanCacheUtils() - } - return instance as CleanCacheUtils - } - - /** - * @param context - * 删除缓存 - */ - fun clearAllCache(context: Context) { - deleteDir(context.cacheDir) - if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) { - deleteDir(context.externalCacheDir) - } - } - - private fun deleteDir(dir: File?): Boolean { - if (dir != null && dir.isDirectory) { - val children = dir.list() - var size = 0 - if (children != null) { - size = children.size - for (i in 0 until size) { - val success = deleteDir(File(dir, children[i])) - if (!success) { - return false - } - } - } - - } - return dir?.delete() ?: true - } - - // 获取文件 - // Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ - // 目录,一般放一些长时间保存的数据 - // Context.getExternalCacheDir() --> - // SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据 - @Throws(Exception::class) - fun getFolderSize(file: File?): Long { - var size: Long = 0 - try { - val fileList = file!!.listFiles() - var size2 = 0 - if (fileList != null) { - size2 = fileList.size - for (i in 0 until size2) { - // 如果下面还有文件 - if (fileList[i].isDirectory) { - size = size + getFolderSize(fileList[i]) - } else { - size = size + fileList[i].length() - } - } - } - - } catch (e: Exception) { - e.printStackTrace() - } - - return size - } - - /** - * 格式化单位 - * 计算缓存的大小 - * @param size - * @return - */ - fun getFormatSize(size: Double): String { - val kiloByte = size / 1024 - if (kiloByte < 1) { - // return size + "Byte"; - return "0K" - } - - val megaByte = kiloByte / 1024 - if (megaByte < 1) { - val result1 = BigDecimal(java.lang.Double.toString(kiloByte)) - return result1.setScale(2, BigDecimal.ROUND_HALF_UP) - .toPlainString() + "KB" - } - - val gigaByte = megaByte / 1024 - if (gigaByte < 1) { - val result2 = BigDecimal(java.lang.Double.toString(megaByte)) - return result2.setScale(2, BigDecimal.ROUND_HALF_UP) - .toPlainString() + "MB" - } - - val teraBytes = gigaByte / 1024 - if (teraBytes < 1) { - val result3 = BigDecimal(java.lang.Double.toString(gigaByte)) - return result3.setScale(2, BigDecimal.ROUND_HALF_UP) - .toPlainString() + "GB" - } - val result4 = BigDecimal(teraBytes) - return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB" - } - } - -} diff --git a/app/src/main/java/com/novel/read/utlis/DateUtli.kt b/app/src/main/java/com/novel/read/utlis/DateUtli.kt deleted file mode 100644 index 561130d..0000000 --- a/app/src/main/java/com/novel/read/utlis/DateUtli.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.novel.read.utlis - -import android.annotation.SuppressLint - - -import com.novel.read.constants.Constant - -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Date - -@SuppressLint("SimpleDateFormat") -object DateUtli { - - private val HOUR_OF_DAY = 24 - private val DAY_OF_YESTERDAY = 2 - private val TIME_UNIT = 60 - - /** - * 时间戳格式转换 - */ - private val dayNames = arrayOf("周日", "周一", "周二", "周三", "周四", "周五", "周六") - - //将时间转换成日期 - fun dateConvert(time: Long, pattern: String): String { - val date = Date(time) - @SuppressLint("SimpleDateFormat") val format = SimpleDateFormat(pattern) - return format.format(date) - } - - - fun dateConvert(timesamp: Long, flag: Int): String { - var time = timesamp - time *= 1000 - val result: String - val todayCalendar = Calendar.getInstance() - val otherCalendar = Calendar.getInstance() - otherCalendar.timeInMillis = time - - val timeFormat = "M月d日" - val yearTimeFormat = "yyyy年M月d日" - - val yearTemp = todayCalendar.get(Calendar.YEAR) == otherCalendar.get(Calendar.YEAR) - if (yearTemp) { - val todayMonth = todayCalendar.get(Calendar.MONTH) - val otherMonth = otherCalendar.get(Calendar.MONTH) - if (todayMonth == otherMonth) {//表示是同一个月 - when (todayCalendar.get(Calendar.DATE) - otherCalendar.get(Calendar.DATE)) { - 0 -> result = getHourAndMin(time) - 1 -> if (flag == 1) { - result = "昨天 " - } else { - result = "昨天 " + getHourAndMin(time) - } - 2, 3, 4, 5, 6 -> { - val dayOfMonth = otherCalendar.get(Calendar.WEEK_OF_MONTH) - val todayOfMonth = todayCalendar.get(Calendar.WEEK_OF_MONTH) - if (dayOfMonth == todayOfMonth) {//表示是同一周 - val dayOfWeek = otherCalendar.get(Calendar.DAY_OF_WEEK) - if (dayOfWeek != 1) {//判断当前是不是星期日 如想显示为:周日 12:09 可去掉此判断 - result = dayNames[otherCalendar.get(Calendar.DAY_OF_WEEK) - 1] - } else { - result = getTime(time, timeFormat) - } - } else { - result = getTime(time, timeFormat) - } - } - else -> result = getTime(time, timeFormat) - } - } else { - result = getTime(time, timeFormat) - } - } else { - result = getYearTime(time, yearTimeFormat) - } - return result - } - - /** - * 当天的显示时间格式 - */ - private fun getHourAndMin(time: Long): String { - val format = SimpleDateFormat("HH:mm") - return format.format(Date(time)) - } - - /** - * 不同一周的显示时间格式 - */ - private fun getTime(time: Long, timeFormat: String): String { - val format = SimpleDateFormat(timeFormat) - return format.format(Date(time)) - } - - /** - * 不同年的显示时间格式 - */ - private fun getYearTime(time: Long, yearTimeFormat: String): String { - val format = SimpleDateFormat(yearTimeFormat) - return format.format(Date(time)) - } - -} diff --git a/app/src/main/java/com/novel/read/utlis/DialogUtils.kt b/app/src/main/java/com/novel/read/utlis/DialogUtils.kt deleted file mode 100644 index 09e3b1a..0000000 --- a/app/src/main/java/com/novel/read/utlis/DialogUtils.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.novel.read.utlis - -import android.app.AlertDialog -import android.content.Context -import android.content.DialogInterface - -/** - * create by zlj on 2019/6/19 - * describe: - */ -class DialogUtils private constructor() { - - fun showAlertDialog( - context: Context, - msg: String, - dialogListener: DialogInterface.OnClickListener - ) { - // context = context.getApplicationContext(); - val builder = AlertDialog.Builder(context) - builder.setTitle("操作提示").setMessage(msg).setCancelable(false) - .setPositiveButton("确定", dialogListener) - .setNegativeButton("取消") { dialog, id -> dialog.cancel() } - val alert = builder.create() - alert.show() - } - - companion object { - - private var instance: DialogUtils? = null - - @Synchronized - fun getInstance(): DialogUtils { - if (instance == null) { - instance = DialogUtils() - } - return instance as DialogUtils - } - } -} diff --git a/app/src/main/java/com/novel/read/utlis/EvenItemDecoration.kt b/app/src/main/java/com/novel/read/utlis/EvenItemDecoration.kt deleted file mode 100644 index 0b20517..0000000 --- a/app/src/main/java/com/novel/read/utlis/EvenItemDecoration.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.novel.read.utlis - -import android.graphics.Rect -import android.view.View -import androidx.recyclerview.widget.RecyclerView - -/** - * 设置adapter padding - */ -class EvenItemDecoration(private val space: Int, private val column: Int) : RecyclerView.ItemDecoration() { - override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { - val position = parent.getChildAdapterPosition(view) - // 每个span分配的间隔大小 - val spanSpace = space * (column +1) / column - // 列索引 - val colIndex = position % column - // 列左、右间隙 - outRect.left = space * (colIndex + 1) - spanSpace * colIndex - outRect.right = spanSpace * (colIndex + 1) - space * (colIndex + 1) - // 行间距 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/utlis/FileUtils.java b/app/src/main/java/com/novel/read/utlis/FileUtils.java deleted file mode 100644 index e2d511c..0000000 --- a/app/src/main/java/com/novel/read/utlis/FileUtils.java +++ /dev/null @@ -1,267 +0,0 @@ -package com.novel.read.utlis; - -import android.os.Environment; - -import com.novel.read.base.MyApp; - -import java.io.BufferedInputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -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 zlj - */ - -public class FileUtils { - //采用自己的格式去设置文件,防止文件被系统文件查询到 - public static final String SUFFIX_NB = ".zlj"; - 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 MyApp.Companion.getContext() - .getExternalCacheDir() - .getAbsolutePath(); - } - else{ - return MyApp.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.INSTANCE.close(reader); - } - return sb.toString(); - } - - //判断是否挂载了SD卡 - private 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){ - final List txtFiles = new ArrayList(); - File file = new File(filePath); - - //如果层级为 3,则直接返回 - if (layer == 3){ - return txtFiles; - } - - //获取文件夹 - File[] dirs = file.listFiles( - new FileFilter() { - @Override - public boolean accept(File 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(){ - //外部存储卡路径 - final 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; - } - - 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 = 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.INSTANCE.close(bis); - } - return charset; - } - - public static boolean isSdCardAvailable() { - return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - } -} diff --git a/app/src/main/java/com/novel/read/utlis/GlideImageLoader.kt b/app/src/main/java/com/novel/read/utlis/GlideImageLoader.kt deleted file mode 100644 index 7feca84..0000000 --- a/app/src/main/java/com/novel/read/utlis/GlideImageLoader.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.novel.read.utlis - -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.drawable.Drawable -import android.widget.ImageView - -import androidx.annotation.DrawableRes - -import com.bumptech.glide.Glide -import com.bumptech.glide.RequestBuilder -import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.load.resource.bitmap.RoundedCorners -import com.bumptech.glide.request.RequestOptions -import com.novel.read.R - - -/** - * create by zlj on 2018/11/21 - * describe: - */ -object GlideImageLoader { - - private//设置错误图片 - //设置占位图片 - val requestHeadOptions: RequestOptions - get() = RequestOptions() - .error(R.mipmap.ic_launcher) - .placeholder(R.mipmap.ic_launcher) - .diskCacheStrategy(DiskCacheStrategy.ALL) - - fun displayImage(context: Context, path: String, imageView: ImageView) { - Glide.with(context) - .load(path) - .into(imageView) - } - - //加载矩形圆角图片 - fun displayCornerImage(context: Context, path: String, imageView: ImageView) { - //设置图片圆角角度 - val roundedCorners = RoundedCorners(10) - val options = RequestOptions.bitmapTransform(roundedCorners) - .placeholder(R.drawable.cover_default) - .error(R.drawable.cover_default) - - - Glide.with(context) - .load(path) - .apply(options) - .into(imageView) - - } - - - - //加载矩形圆角图片 自动设置占位图 - fun displayCornerImage(context: Context, path: String, imageView: ImageView, defaultId: Int) { - //设置图片圆角角度 - val roundedCorners = RoundedCorners(15) - val options = RequestOptions.bitmapTransform(roundedCorners) - .placeholder(defaultId) - .error(defaultId) - Glide.with(context) - .load(path) - .apply(options) - .into(imageView) - - } - - //加载圆形图片 - @SuppressLint("CheckResult") - fun loadCirCleImage( - context: Context, - path: String, - imageView: ImageView, - width: Int, - height: Int - ) { - val myOptions = requestHeadOptions.circleCrop() - myOptions.error(R.mipmap.ic_launcher) - myOptions.placeholder(R.mipmap.ic_launcher) - Glide.with(context.applicationContext) - .load(path) - .apply(myOptions) - .into(imageView) - } - -} diff --git a/app/src/main/java/com/novel/read/utlis/IOUtils.kt b/app/src/main/java/com/novel/read/utlis/IOUtils.kt deleted file mode 100644 index 12283c3..0000000 --- a/app/src/main/java/com/novel/read/utlis/IOUtils.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.novel.read.utlis - -import java.io.Closeable -import java.io.IOException - -/** - * Created by zlj - */ - -object IOUtils { - - fun close(closeable: Closeable?) { - if (closeable == null) return - try { - closeable.close() - } catch (e: IOException) { - e.printStackTrace() - //close error - } - - } -} diff --git a/app/src/main/java/com/novel/read/utlis/LocalManageUtil.java b/app/src/main/java/com/novel/read/utlis/LocalManageUtil.java deleted file mode 100644 index 354e97b..0000000 --- a/app/src/main/java/com/novel/read/utlis/LocalManageUtil.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.novel.read.utlis; - -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.os.Build; -import android.os.LocaleList; -import android.util.DisplayMetrics; -import android.util.Log; - -import com.novel.read.R; -import com.novel.read.widget.page.ReadSettingManager; - -import java.util.Locale; - -public class LocalManageUtil { - - private static final String TAG = "LocalManageUtil"; - - /** - * 获取系统的locale - * - * @return Locale对象 - */ - public static Locale getSystemLocale(Context context) { - return SpUtil.getInstance().getSystemCurrentLocal(); - } - - public static String getSelectLanguage(Context context) { - switch (SpUtil.getInstance().getSelectLanguage()) { - case 0: - return context.getString(R.string.a_simple); - case 1: - return context.getString(R.string.a_traditional); - default: - return context.getString(R.string.a_simple); - } - } - - /** - * 获取选择的语言设置 - * @param context context - */ - private static Locale getSetLanguageLocale(Context context) { - - switch (SpUtil.getInstance().getSelectLanguage()) { - - case 0: - return Locale.CHINA; - case 1: - return Locale.TAIWAN; - case 2: - default: - return Locale.ENGLISH; - } - } - - public static void saveSelectLanguage(Context context, int select) { - SpUtil.getInstance().saveLanguage(select); //本地国际化 - ReadSettingManager.Companion.getInstance().setConvertType(select); //网络数据国际化 - setApplicationLanguage(context); - } - - public static Context setLocal(Context context) { - return updateResources(context, getSetLanguageLocale(context)); - } - - private static Context updateResources(Context context, Locale locale) { - Locale.setDefault(locale); - - Resources res = context.getResources(); - Configuration config = new Configuration(res.getConfiguration()); - if (Build.VERSION.SDK_INT >= 17) { - config.setLocale(locale); - context = context.createConfigurationContext(config); - } else { - config.locale = locale; - res.updateConfiguration(config, res.getDisplayMetrics()); - } - return context; - } - - /** - * 设置语言类型 - */ - public static void setApplicationLanguage(Context context) { - Resources resources = context.getApplicationContext().getResources(); - DisplayMetrics dm = resources.getDisplayMetrics(); - Configuration config = resources.getConfiguration(); - Locale locale = getSetLanguageLocale(context); - config.locale = locale; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - LocaleList localeList = new LocaleList(locale); - LocaleList.setDefault(localeList); - config.setLocales(localeList); - context.getApplicationContext().createConfigurationContext(config); - Locale.setDefault(locale); - } - resources.updateConfiguration(config, dm); - } - - public static void saveSystemCurrentLanguage(Context context) { - Locale locale; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - locale = LocaleList.getDefault().get(0); - } else { - locale = Locale.getDefault(); - } - Log.d(TAG, locale.getLanguage()); - SpUtil.getInstance().setSystemCurrentLocal(locale); - } - - public static void onConfigurationChanged(Context context){ - saveSystemCurrentLanguage(context); - setLocal(context); - setApplicationLanguage(context); - } -} diff --git a/app/src/main/java/com/novel/read/utlis/MD5Utils.kt b/app/src/main/java/com/novel/read/utlis/MD5Utils.kt deleted file mode 100644 index 999e94f..0000000 --- a/app/src/main/java/com/novel/read/utlis/MD5Utils.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.novel.read.utlis - -import java.security.MessageDigest -import java.security.NoSuchAlgorithmException -import kotlin.experimental.and - -/** - * 将字符串转化为MD5 - */ - -object MD5Utils { - - private fun strToMd5By32(str: String): String? { - var reStr: String? = null - try { - val md5 = MessageDigest.getInstance("MD5") - val bytes = md5.digest(str.toByteArray()) - val stringBuffer = StringBuilder() - for (b in bytes) { - val bt = b and 0xff.toByte() - if (bt < 16) { - stringBuffer.append(0) - } - stringBuffer.append(Integer.toHexString(bt.toInt())) - } - reStr = stringBuffer.toString() - } catch (e: NoSuchAlgorithmException) { - e.printStackTrace() - } - - return reStr - } - - fun strToMd5By16(str: String): String? { - var reStr = strToMd5By32(str) - if (reStr != null) { - reStr = reStr.substring(8, 24) - } - return reStr - } -} diff --git a/app/src/main/java/com/novel/read/utlis/MyTimeTask.kt b/app/src/main/java/com/novel/read/utlis/MyTimeTask.kt deleted file mode 100644 index 88012c6..0000000 --- a/app/src/main/java/com/novel/read/utlis/MyTimeTask.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.novel.read.utlis - -import java.util.* - -/** - * create by zlj on 2019/7/15 - * describe: - */ -class MyTimeTask(private val time: Long, private val task: TimerTask?) { - - private var timer: Timer? = null - - init { - if (timer == null) { - timer = Timer() - } - } - - fun start() { - timer!!.schedule(task, 0, time)//每隔time时间段就执行一次 - } - - fun stop() { - if (timer != null) { - timer!!.cancel() - task?.cancel() - } - } -} diff --git a/app/src/main/java/com/novel/read/utlis/NetworkUtils.kt b/app/src/main/java/com/novel/read/utlis/NetworkUtils.kt deleted file mode 100644 index fe78bf9..0000000 --- a/app/src/main/java/com/novel/read/utlis/NetworkUtils.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.novel.read.utlis - -import android.content.Context -import android.net.ConnectivityManager -import android.net.NetworkInfo - -import com.novel.read.base.MyApp - -object NetworkUtils { - - /** - * 获取活动网络信息 - * @return NetworkInfo - */ - private val networkInfo: NetworkInfo? - get() { - val cm = MyApp.context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - return cm.activeNetworkInfo - } - - /** - * 网络是否可用 - * @return - */ - val isAvailable: Boolean - get() { - val info = networkInfo - return info != null && info.isAvailable - } - - /** - * 网络是否连接 - * @return - */ - val isConnected: Boolean - get() { - val info = networkInfo - return info != null && info.isConnected - } - - /** - * 判断wifi是否连接状态 - * - * 需添加权限 `` - * - * @param context 上下文 - * @return `true`: 连接

`false`: 未连接 - */ - fun isWifiConnected(context: Context): Boolean { - val cm = context - .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - return (cm.activeNetworkInfo != null - && cm.activeNetworkInfo.type == ConnectivityManager.TYPE_WIFI) - } - - -} diff --git a/app/src/main/java/com/novel/read/utlis/PermissionUtil.java b/app/src/main/java/com/novel/read/utlis/PermissionUtil.java deleted file mode 100644 index bceed44..0000000 --- a/app/src/main/java/com/novel/read/utlis/PermissionUtil.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.novel.read.utlis; - -import android.Manifest; -import android.annotation.TargetApi; -import android.app.Activity; -import android.content.pm.PackageManager; -import android.os.Build; - -import com.novel.read.R; - -import java.util.ArrayList; -import java.util.List; - -public class PermissionUtil { - private static PermissionUtil permissionUtil = null; - private static List mListPermissions; - - - private static String[] PERMISSIONS_LIST = { - Manifest.permission.INTERNET, - Manifest.permission.ACCESS_NETWORK_STATE, - Manifest.permission.ACCESS_WIFI_STATE, - Manifest.permission.ACCESS_NETWORK_STATE, - }; - - private static final String PERMISSIONS_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE; - private static final String PERMISSIONS_PHONE = Manifest.permission.READ_PHONE_STATE; - private static final String PERMISSIONS_SETTINGS = Manifest.permission.WRITE_SETTINGS; - - - private void addAllPermissions(List mListPermissions) { - mListPermissions.add(PERMISSIONS_STORAGE); - } - - - public static PermissionUtil getInstance() { - if (permissionUtil == null) { - permissionUtil = new PermissionUtil(); - } - return permissionUtil; - } - - public boolean isOverMarshmallow() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; - } - - @TargetApi(value = Build.VERSION_CODES.M) - public List findDeniedPermissions(Activity activity, List permissions) { - List denyPermissions = new ArrayList<>(); - for (String value : permissions) { - if (activity.checkSelfPermission(value) != PackageManager.PERMISSION_GRANTED) { - denyPermissions.add(value); - } - } - return denyPermissions; - } - - @TargetApi(value = Build.VERSION_CODES.M) - public void requestPermissions(Activity activity, int requestCode, PermissionCallBack permissionCallBack) { - if (mListPermissions == null) { - mListPermissions = new ArrayList<>(); - addAllPermissions(mListPermissions); - } - if (!isOverMarshmallow()) { - permissionCallBack.onPermissionSuccess(); - return; - } - mListPermissions = findDeniedPermissions(activity, mListPermissions); - if (mListPermissions != null && mListPermissions.size() > 0) { - activity.requestPermissions(mListPermissions.toArray(new String[mListPermissions.size()]), - requestCode); - } else { - permissionCallBack.onPermissionSuccess(); - } - } - - public void requestResult(Activity activity, String[] permissions, int[] grantResults, PermissionCallBack permissionCallBack) { - mListPermissions = new ArrayList<>(); - ArrayList noPermissions = new ArrayList<>(); - ArrayList rejectPermissons = new ArrayList<>(); - for (int i = 0; i < grantResults.length; i++) { - if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { - if (isOverMarshmallow()) { - boolean isShould = activity.shouldShowRequestPermissionRationale(permissions[i]); - mListPermissions.add(permissions[i]); - if (isShould) { - noPermissions.add(permissions[i]); - } else { - rejectPermissons.add(permissions[i]); - } - } - } - } - - if (noPermissions.size() > 0) { - permissionCallBack.onPermissionFail(); - } else if (rejectPermissons.size() > 0) { - ArrayList permissonsList = new ArrayList<>(); - for (int i = 0; i < rejectPermissons.size(); i++) { - String strPermissons = rejectPermissons.get(i); - if (PERMISSIONS_STORAGE.equals(strPermissons)) { - permissonsList.add("storage"); - } else if (PERMISSIONS_PHONE.equals(strPermissons)) { - permissonsList.add("phone"); - } - } - String strPermissons = permissonsList.toString(); - strPermissons = strPermissons.replace("[", ""); - strPermissons = strPermissons.replace("]", ""); - strPermissons = strPermissons.replace(",", "、"); - String strAppName = activity.getString(R.string.app_name); - String strMessage = "permission"; - strMessage = String.format(strMessage, strAppName, strPermissons, "\""); - permissionCallBack.onPermissionReject(strMessage); - - } else { - permissionCallBack.onPermissionSuccess(); - } - } - - public interface PermissionCallBack { - void onPermissionSuccess(); - - void onPermissionReject(String strMessage); - - void onPermissionFail(); - } -} diff --git a/app/src/main/java/com/novel/read/utlis/PhoneUtils.kt b/app/src/main/java/com/novel/read/utlis/PhoneUtils.kt deleted file mode 100644 index d4f635e..0000000 --- a/app/src/main/java/com/novel/read/utlis/PhoneUtils.kt +++ /dev/null @@ -1,122 +0,0 @@ -package com.novel.read.utlis - -import android.annotation.SuppressLint -import android.content.Context -import android.os.Build -import android.telephony.TelephonyManager -import java.util.* - -/** - * 获取手机国际识别码IMEI - */ -class PhoneUtils(private val ctx: Context) { - - private val telephonemanager: TelephonyManager = ctx.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager - private var IMSI: String? = null - - /** - * 获取手机号码 - */ - val nativePhoneNumber: String? - @SuppressLint("MissingPermission") - get() { - - var nativephonenumber: String? = null - nativephonenumber = telephonemanager.line1Number - - return nativephonenumber - } - - /** - * 获取手机服务商信息 - */ - //IMSI前面三位460是国家号码,其次的两位是运营商代号,00、02是中国移动,01是联通,03是电信。 - val providersName: String? - @SuppressLint("MissingPermission") - get() { - var providerName: String? = null - try { - IMSI = telephonemanager.subscriberId - print("IMSI是:" + IMSI!!) - if (IMSI!!.startsWith("46000") || IMSI!!.startsWith("46002")) { - providerName = "中国移动" - } else if (IMSI!!.startsWith("46001")) { - providerName = "中国联通" - } else if (IMSI!!.startsWith("46003")) { - providerName = "中国电信" - } - - } catch (e: Exception) { - e.printStackTrace() - } - - return providerName - - } - - /** - * 获取手机信息 - */ - // return ("\nDeviceID(IMEI)" + tm.getDeviceId()) + - // "\nDeviceSoftwareVersion:" + tm.getDeviceSoftwareVersion() + - // "\ngetLine1Number:" + tm.getLine1Number() + - // "\nNetworkCountryIso:" + tm.getNetworkCountryIso() + - // "\nNetworkOperator:" + tm.getNetworkOperator() + - // "\nNetworkOperatorName:" + tm.getNetworkOperatorName() + - // "\nNetworkType:" + tm.getNetworkType() + - // "\nPhoneType:" + tm.getPhoneType() + - // "\nSimCountryIso:" + tm.getSimCountryIso() + - // "\nSimOperator:" + tm.getSimOperator() + - // "\nSimOperatorName:" + tm.getSimOperatorName() + - // "\nSimSerialNumber:" + tm.getSimSerialNumber() + - // "\ngetSimState:" + tm.getSimState() + - // "\nSubscriberId:" + tm.getSubscriberId() + - // "\nVoiceMailNumber:" + tm.getVoiceMailNumber(); - val phoneInfo: String - @SuppressLint("MissingPermission") - get() { - - val tm = ctx.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager - return tm.deviceId - - } - - companion object { - - // 35是IMEI开头的号 - //13 位 - //API>=9 使用serial号 - //serial需要一个初始化 - // 随便一个初始化 - //使用硬件信息拼凑出来的15位号码 - val uniquePsuedoID: String - get() { - var serial: String? = null - val m_szDevIDShort = ("35" + - Build.BOARD.length % 10 + Build.BRAND.length % 10 - + Build.CPU_ABI.length % 10 - + Build.DEVICE.length % 10 - + Build.DISPLAY.length % 10 - + Build.HOST.length % 10 - + Build.ID.length % 10 - + Build.MANUFACTURER.length % 10 - + Build.MODEL.length % 10 + Build.PRODUCT.length % 10 - + Build.TAGS.length % 10 + Build.TYPE.length % 10 + - Build.USER.length % 10) - try { - serial = Build::class.java.getField("SERIAL").get(null).toString() - return UUID( - m_szDevIDShort.hashCode().toLong(), - serial.hashCode().toLong() - ).toString() - } catch (exception: Exception) { - serial = "serial" - } - - return UUID( - m_szDevIDShort.hashCode().toLong(), - serial!!.hashCode().toLong() - ).toString() - } - } -} diff --git a/app/src/main/java/com/novel/read/utlis/RxUtils.java b/app/src/main/java/com/novel/read/utlis/RxUtils.java deleted file mode 100644 index d4f08c6..0000000 --- a/app/src/main/java/com/novel/read/utlis/RxUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.novel.read.utlis; - - - -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.schedulers.Schedulers; - -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 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/novel/read/utlis/ScreenUtils.kt b/app/src/main/java/com/novel/read/utlis/ScreenUtils.kt deleted file mode 100644 index 126dbcd..0000000 --- a/app/src/main/java/com/novel/read/utlis/ScreenUtils.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.novel.read.utlis - -import android.util.DisplayMetrics -import android.util.TypedValue -import androidx.appcompat.app.AppCompatActivity -import com.novel.read.base.MyApp - -object ScreenUtils { - - /** - * 获取手机显示App区域的大小(头部导航栏+ActionBar+根布局),不包括虚拟按钮 - * @return - */ - val appSize: IntArray - get() { - val size = IntArray(2) - val metrics = displayMetrics - size[0] = metrics.widthPixels - size[1] = metrics.heightPixels - return size - } - - /** - * 获取导航栏的高度 - * @return - */ - val statusBarHeight: Int - get() { - val resources = MyApp.context.resources - val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android") - return resources.getDimensionPixelSize(resourceId) - } - - /** - * 获取虚拟按键的高度 - * @return - */ - val navigationBarHeight: Int - get() { - var navigationBarHeight = 0 - val rs = MyApp.context.resources - val id = rs.getIdentifier("navigation_bar_height", "dimen", "android") - if (id > 0 && hasNavigationBar()) { - navigationBarHeight = rs.getDimensionPixelSize(id) - } - return navigationBarHeight - } - - private val displayMetrics: DisplayMetrics - get() = MyApp.context - .resources - .displayMetrics - - fun dpToPx(dp: Int): Int { - val metrics = displayMetrics - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), metrics).toInt() - } - - fun pxToDp(px: Int): Int { - val metrics = displayMetrics - return (px / metrics.density).toInt() - } - - fun spToPx(sp: Int): Int { - val metrics = displayMetrics - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp.toFloat(), metrics).toInt() - } - - fun pxToSp(px: Int): Int { - val metrics = displayMetrics - return (px / metrics.scaledDensity).toInt() - } - - /** - * 获取整个手机屏幕的大小(包括虚拟按钮) - * 必须在onWindowFocus方法之后使用 - * @param activity - * @return - */ - fun getScreenSize(activity: AppCompatActivity): IntArray { - val size = IntArray(2) - val decorView = activity.window.decorView - size[0] = decorView.width - size[1] = decorView.height - return size - } - - /** - * 是否存在虚拟按键 - * @return - */ - private fun hasNavigationBar(): Boolean { - var hasNavigationBar = false - val rs = MyApp.context.resources - val id = rs.getIdentifier("config_showNavigationBar", "bool", "android") - if (id > 0) { - hasNavigationBar = rs.getBoolean(id) - } - try { - val systemPropertiesClass = Class.forName("android.os.SystemProperties") - val m = systemPropertiesClass.getMethod("get", String::class.java) - val navBarOverride = m.invoke(systemPropertiesClass, "qemu.hw.mainkeys") as String - if ("1" == navBarOverride) { - hasNavigationBar = false - } else if ("0" == navBarOverride) { - hasNavigationBar = true - } - } catch (e: Exception) { - } - - return hasNavigationBar - } -} diff --git a/app/src/main/java/com/novel/read/utlis/SpUtil.java b/app/src/main/java/com/novel/read/utlis/SpUtil.java deleted file mode 100644 index f93ea5f..0000000 --- a/app/src/main/java/com/novel/read/utlis/SpUtil.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.novel.read.utlis; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; - -import java.util.Locale; - -public class SpUtil { - - private static SharedPreferences sp; - private static SpUtil sInstance; - - public static void init(Context context) { - sp = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); - } - - public static SpUtil getInstance(){ - if(sInstance == null){ - synchronized (SpUtil.class){ - if (sInstance == null){ - sInstance = new SpUtil(); - } - } - } - return sInstance; - } - - public static String getStringValue(String key) { - return sp.getString(key, null); - } - - public static String getStringValue(String key, String defaultValue) { - return sp.getString(key, defaultValue); - } - - public static void setStringValue(String key, String value) { - Editor editor = sp.edit(); - editor.putString(key, value); - editor.apply(); - } - - public static boolean getBooleanValue(String key) { - return sp.getBoolean(key, false); - } - - public static boolean getBooleanValue(String key, boolean value) { - return sp.getBoolean(key, value); - } - - public static void setBooleanValue(String key, boolean value) { - Editor editor = sp.edit(); - editor.putBoolean(key, value); - editor.apply(); - } - - public static int getIntValue(String key,int def) { - return sp.getInt(key, def); - } - - public static void setLongValue(String key, long value) { - Editor editor = sp.edit(); - editor.putLong(key, value); - editor.apply(); - } - - public static long getLongValue(String key) { - return sp.getLong(key, 0); - } - - public static void setIntValue(String key, int value) { - Editor editor = sp.edit(); - editor.putInt(key, value); - editor.apply(); - } - - public static float getFloatValue(String key) { - return sp.getFloat(key, 0.0f); - } - - public static void setFloatValue(String key, float value) { - Editor editor = sp.edit(); - editor.putFloat(key, value); - editor.apply(); - } - - public static void clearAllValue(Context context) { - SharedPreferences sharedData = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); - Editor editor = sharedData.edit(); - editor.clear(); - editor.apply(); - } - - private final String TAG_LANGUAGE = "language_select"; - private Locale systemCurrentLocal = Locale.ENGLISH; - - - public void saveLanguage(int select) { - setIntValue(TAG_LANGUAGE, select); - } - - public int getSelectLanguage() { - return getIntValue(TAG_LANGUAGE, 0); - } - - public Locale getSystemCurrentLocal() { - return systemCurrentLocal; - } - - public void setSystemCurrentLocal(Locale local) { - systemCurrentLocal = local; - } - - -} diff --git a/app/src/main/java/com/novel/read/utlis/StatusBarUtil.kt b/app/src/main/java/com/novel/read/utlis/StatusBarUtil.kt deleted file mode 100644 index 1a49afa..0000000 --- a/app/src/main/java/com/novel/read/utlis/StatusBarUtil.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.novel.read.utlis - -import android.os.Build -import android.view.View -import android.view.WindowManager - -import androidx.appcompat.app.AppCompatActivity - -import java.lang.reflect.Field -import java.lang.reflect.Method - -/** - * @author: LiJun 390057892@qq.com - * @date: 2018/3/7 15:07 - */ - -object StatusBarUtil { - fun setBarsStyle(activity: AppCompatActivity, color: Int, dark: Boolean) { - MIUISetStatusBarLightMode(activity, dark) - FlymeSetStatusBarLightMode(activity, dark) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上 - val decorView = activity.window.decorView - if (dark) { - val option = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - decorView.systemUiVisibility = option - activity.window.statusBarColor = activity.resources.getColor(color) - } else { - val option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE - decorView.systemUiVisibility = option - activity.window.statusBarColor = activity.resources.getColor(color) - } - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0 - val localLayoutParams = activity.window.attributes - localLayoutParams.flags = - WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or localLayoutParams.flags - } - - // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//android6.0以后可以对状态栏文字颜色和图标进行修改 - // if (dark){ - // activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); - // }else { - // activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE); - // } - // - // } - } - - fun MIUISetStatusBarLightMode(activity: AppCompatActivity, dark: Boolean): Boolean { - var result = false - if (activity.window != null) { - val clazz = activity.window.javaClass - try { - var darkModeFlag = 0 - val layoutParams = Class.forName("android.view.MiuiWindowManager\$LayoutParams") - val field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE") - darkModeFlag = field.getInt(layoutParams) - val extraFlagField = clazz.getMethod( - "setExtraFlags", - Int::class.javaPrimitiveType, - Int::class.javaPrimitiveType - ) - if (dark) { - extraFlagField.invoke(activity.window, darkModeFlag, darkModeFlag)//状态栏透明且黑色字体 - } else { - extraFlagField.invoke(activity.window, 0, darkModeFlag)//清除黑色字体 - } - result = true - } catch (e: Exception) { - - } - - } - return result - } - - private fun FlymeSetStatusBarLightMode(activity: AppCompatActivity, dark: Boolean): Boolean { - var result = false - if (activity.window != null) { - try { - val lp = activity.window.attributes - val darkFlag = WindowManager.LayoutParams::class.java - .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON") - val meizuFlags = WindowManager.LayoutParams::class.java - .getDeclaredField("meizuFlags") - darkFlag.isAccessible = true - meizuFlags.isAccessible = true - val bit = darkFlag.getInt(null) - var value = meizuFlags.getInt(lp) - if (dark) { - value = value or bit - } else { - value = value and bit.inv() - } - meizuFlags.setInt(lp, value) - activity.window.attributes = lp - result = true - } catch (e: Exception) { - - } - - } - return result - } - - -} diff --git a/app/src/main/java/com/novel/read/utlis/StringUtils.kt b/app/src/main/java/com/novel/read/utlis/StringUtils.kt deleted file mode 100644 index 82cc46e..0000000 --- a/app/src/main/java/com/novel/read/utlis/StringUtils.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.novel.read.utlis - -import android.text.TextUtils -import com.novel.read.widget.page.ReadSettingManager.Companion.SHARED_READ_CONVERT_TYPE - -import com.spreada.utils.chinese.ZHConverter - -object StringUtils { - - /** - * 将文本中的半角字符,转换成全角字符 - */ - fun halfToFull(input: String): String { - val text = deleteImgs(input) - val c = text.toCharArray() - for (i in c.indices) { - if (c[i].toInt() == 32) - //半角空格 - { - c[i] = 12288.toChar() - continue - } - //根据实际情况,过滤不需要转换的符号 - //if (c[i] == 46) //半角点号,不转换 - // continue; - - if (c[i].toInt() in 33..126) - //其他符号都转换为全角 - c[i] = (c[i].toInt() + 65248).toChar() - } - return String(c) - } - - private fun deleteImgs(content: String?): String { - return if (content != null && !TextUtils.isEmpty(content)) { - // 去掉所有html元素, - var str = - content.replace("&[a-zA-Z]{1,10};".toRegex(), "").replace("<[^>]*>".toRegex(), "") - str = str.replace("[(/>)<]".toRegex(), "") - str - } else { - "" - } - } - - fun delete160(des: String): String { - var text = des - text = text.replace(" ".toRegex(), "") - text = text.replace("&#160;".toRegex(), "") - text = text.replace("\\s*".toRegex(), "") - text = text.trim { it <= ' ' } - return text - } - - //繁簡轉換 - fun convertCC(input: String): String { - val convertType = SpUtil.getIntValue(SHARED_READ_CONVERT_TYPE, 0) - - if (input.isEmpty()) - return "" - - return if (convertType != 0) ZHConverter.getInstance(ZHConverter.TRADITIONAL).convert(input) else input - } - -} diff --git a/app/src/main/java/com/novel/read/utlis/SystemBarUtils.kt b/app/src/main/java/com/novel/read/utlis/SystemBarUtils.kt deleted file mode 100644 index 751efb5..0000000 --- a/app/src/main/java/com/novel/read/utlis/SystemBarUtils.kt +++ /dev/null @@ -1,155 +0,0 @@ -package com.novel.read.utlis - -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设置透明栏 - */ - -object SystemBarUtils { - - private val UNSTABLE_STATUS = View.SYSTEM_UI_FLAG_FULLSCREEN - private val UNSTABLE_NAV = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - private val STABLE_STATUS = View.SYSTEM_UI_FLAG_FULLSCREEN or - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or - View.SYSTEM_UI_FLAG_LAYOUT_STABLE or - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - private val STABLE_NAV = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_LAYOUT_STABLE or - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - private val EXPAND_STATUS = - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE - private val EXPAND_NAV = - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE - - - //设置隐藏StatusBar(点击任意地方会恢复) - fun hideUnStableStatusBar(activity: Activity) { - //App全屏,隐藏StatusBar - setFlag(activity, UNSTABLE_STATUS) - } - - fun showUnStableStatusBar(activity: Activity) { - clearFlag(activity, UNSTABLE_STATUS) - } - - //隐藏NavigationBar(点击任意地方会恢复) - fun hideUnStableNavBar(activity: Activity) { - setFlag(activity, UNSTABLE_NAV) - } - - fun showUnStableNavBar(activity: Activity) { - clearFlag(activity, UNSTABLE_NAV) - } - - fun hideStableStatusBar(activity: Activity) { - //App全屏,隐藏StatusBar - setFlag(activity, STABLE_STATUS) - } - - fun showStableStatusBar(activity: Activity) { - clearFlag(activity, STABLE_STATUS) - } - - fun hideStableNavBar(activity: Activity) { - //App全屏,隐藏StatusBar - setFlag(activity, STABLE_NAV) - } - - fun showStableNavBar(activity: Activity) { - clearFlag(activity, STABLE_NAV) - } - - /** - * 视图扩充到StatusBar - */ - fun expandStatusBar(activity: Activity) { - setFlag(activity, EXPAND_STATUS) - } - - /** - * 视图扩充到NavBar - * @param activity - */ - fun expandNavBar(activity: Activity) { - setFlag(activity, EXPAND_NAV) - } - - fun transparentStatusBar(activity: Activity) { - if (Build.VERSION.SDK_INT >= 21) { - expandStatusBar(activity) - activity.window.statusBarColor = - activity.resources.getColor(android.R.color.transparent) - } else if (Build.VERSION.SDK_INT >= 19) { - val attrs = activity.window.attributes - attrs.flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or attrs.flags - activity.window.attributes = attrs - } - } - - fun transparentNavBar(activity: Activity) { - if (Build.VERSION.SDK_INT >= 21) { - expandNavBar(activity) - //下面这个方法在sdk:21以上才有 - activity.window.navigationBarColor = - activity.resources.getColor(android.R.color.transparent) - } - } - - fun setFlag(activity: Activity, flag: Int) { - if (Build.VERSION.SDK_INT >= 19) { - val decorView = activity.window.decorView - val option = decorView.systemUiVisibility or flag - decorView.systemUiVisibility = option - } - } - - //取消flag - fun clearFlag(activity: Activity, flag: Int) { - if (Build.VERSION.SDK_INT >= 19) { - val decorView = activity.window.decorView - val option = decorView.systemUiVisibility and flag.inv() - decorView.systemUiVisibility = option - } - } - - fun setToggleFlag(activity: Activity, option: Int) { - if (Build.VERSION.SDK_INT >= 19) { - if (isFlagUsed(activity, option)) { - clearFlag(activity, option) - } else { - setFlag(activity, option) - } - } - } - - /** - * @param activity - * @return flag是否已被使用 - */ - fun isFlagUsed(activity: Activity, flag: Int): Boolean { - val currentFlag = activity.window.decorView.systemUiVisibility - return currentFlag and flag == flag - } -} diff --git a/app/src/main/java/com/novel/read/utlis/VersionUtil.kt b/app/src/main/java/com/novel/read/utlis/VersionUtil.kt deleted file mode 100644 index a88c30b..0000000 --- a/app/src/main/java/com/novel/read/utlis/VersionUtil.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.novel.read.utlis - -import android.content.Context -import android.content.pm.PackageInfo -import android.content.pm.PackageManager - -object VersionUtil { - - fun getPackageCode(context: Context): Int { - val manager = context.packageManager - var code = 0 - try { - val info = manager.getPackageInfo(context.packageName, 0) - code = info.versionCode - } catch (e: PackageManager.NameNotFoundException) { - e.printStackTrace() - } - - return code - } - - fun getPackageName(context: Context): String? { - val manager = context.packageManager - var name: String? = null - try { - val info = manager.getPackageInfo(context.packageName, 0) - name = info.versionName - } catch (e: PackageManager.NameNotFoundException) { - e.printStackTrace() - } - - return name - } - - /** - * [获取应用程序版本名称信息] - * @param context - * @return 当前应用的版本名称 - */ - fun getPackage(context: Context): String? { - try { - val packageManager = context.packageManager - val packageInfo = packageManager.getPackageInfo( - context.packageName, 0 - ) - return packageInfo.packageName - } catch (e: Exception) { - e.printStackTrace() - } - - return null - } - - -} diff --git a/app/src/main/java/com/novel/read/widget/HeadLayout.kt b/app/src/main/java/com/novel/read/widget/HeadLayout.kt deleted file mode 100644 index c99cc35..0000000 --- a/app/src/main/java/com/novel/read/widget/HeadLayout.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.novel.read.widget - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.widget.LinearLayout -import androidx.core.content.ContextCompat -import com.novel.read.R -import kotlinx.android.synthetic.main.widget_head.view.* - -class HeadLayout(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) { - - init { - LayoutInflater.from(context).inflate(R.layout.widget_head, this, true) - initAttr(attrs) - } - - private fun initAttr(attrs: AttributeSet?) { - val typedArray = context.obtainStyledAttributes(attrs, R.styleable.HeadLayout) - val showHead = typedArray.getBoolean(R.styleable.HeadLayout_showHead, true) - val headText = typedArray.getResourceId(R.styleable.HeadLayout_headText, R.string.empty_info) - val headImg = typedArray.getResourceId(R.styleable.HeadLayout_headImg, R.mipmap.ic_launcher) - val showRight = typedArray.getBoolean(R.styleable.HeadLayout_showRightText, true) - val rightText = typedArray.getResourceId(R.styleable.HeadLayout_rightText, R.string.empty_info) - val rightImg = typedArray.getResourceId(R.styleable.HeadLayout_rightImg, R.mipmap.ic_launcher) - if (showHead) { - tv_head.setText(headText) - val drawable = ContextCompat.getDrawable(context, headImg) - drawable!!.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight) - tv_head.setCompoundDrawables(drawable, null, null, null) - } else { - tv_head.visibility = View.GONE - } - if (showRight) { - tv_more.setText(rightText) - if (rightImg != R.mipmap.ic_launcher) { - val drawable = ContextCompat.getDrawable(context, rightImg) - drawable!!.setBounds(0, 0, drawable.minimumWidth, drawable.minimumHeight) - tv_head.setCompoundDrawables(null, null, drawable, null) - } - } else { - tv_more.visibility = View.GONE - } - - typedArray.recycle() - } - - //设置点击右边文字的监听 - fun setRightTextClickListener(listener: View.OnClickListener) { - tv_more.setOnClickListener(listener) - } - - -} diff --git a/app/src/main/java/com/novel/read/widget/VpTabLayout.kt b/app/src/main/java/com/novel/read/widget/VpTabLayout.kt deleted file mode 100644 index 84c04fc..0000000 --- a/app/src/main/java/com/novel/read/widget/VpTabLayout.kt +++ /dev/null @@ -1,157 +0,0 @@ -package com.novel.read.widget - -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.ValueAnimator -import android.content.Context -import android.content.res.TypedArray -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import android.view.animation.AccelerateInterpolator -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import androidx.viewpager.widget.ViewPager - -import com.novel.read.R -import kotlinx.android.synthetic.main.widget_tab.view.* - -class VpTabLayout(private val mContext: Context, attrs: AttributeSet) : - ConstraintLayout(mContext, attrs), View.OnClickListener { - - private var animFinish = true //防止动画还未结束就开始另一个动画 - private var mBtnClickListener: OnTabClickListener? = null - - init { - LayoutInflater.from(mContext).inflate(R.layout.widget_tab, this, true) - initViews() - initAttr(attrs) - } - - private fun initViews() { - tv_one.setOnClickListener(this) - tv_second.setOnClickListener(this) - tv_third.setOnClickListener(this) - } - - - private fun initAttr(attrs: AttributeSet) { - val typedArray = context.obtainStyledAttributes(attrs, R.styleable.VpTabLayout) - val oneText = typedArray.getResourceId(R.styleable.VpTabLayout_oneText, R.string.empty_info) - val twoText = typedArray.getResourceId(R.styleable.VpTabLayout_twoText, R.string.empty_info) - val threeText = - typedArray.getResourceId(R.styleable.VpTabLayout_threeText, R.string.empty_info) - - tv_one.setText(oneText) - tv_second.setText(twoText) - tv_third.setText(threeText) - - typedArray.recycle() - } - - - //设置动画 - fun setAnim(position: Int, viewPager: ViewPager) { - if (!animFinish) { - return - } - animFinish = false - var animator: ValueAnimator? = null - when (position) { - 0 -> { - animator = ValueAnimator.ofFloat(view.x, tv_one.x) - animator!!.setTarget(tv_one) - animator.addUpdateListener { valueAnimator -> - view.x = valueAnimator.animatedValue as Float - } - animator.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - super.onAnimationEnd(animation) - viewPager.currentItem = position - tv_one.setTextColor(ContextCompat.getColor(mContext, R.color.white)) - tv_second.setTextColor(ContextCompat.getColor(mContext, R.color.colorTitle)) - tv_third.setTextColor( - ContextCompat.getColor( - mContext, - R.color.colorTitle - ) - ) - animFinish = true - } - }) - } - 1 -> { - animator = ValueAnimator.ofFloat(view.x, tv_second.x) - animator!!.setTarget(tv_second) - animator.addUpdateListener { valueAnimator -> - view.x = valueAnimator.animatedValue as Float - } - animator.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - super.onAnimationEnd(animation) - viewPager.currentItem = position - tv_one.setTextColor(ContextCompat.getColor(mContext, R.color.colorTitle)) - tv_second.setTextColor(ContextCompat.getColor(mContext, R.color.white)) - tv_third.setTextColor( - ContextCompat.getColor( - mContext, - R.color.colorTitle - ) - ) - animFinish = true - } - }) - } - 2 -> { - animator = ValueAnimator.ofFloat(view.x, tv_third.x) - animator!!.setTarget(tv_third) - animator.addUpdateListener { valueAnimator -> - view.x = valueAnimator.animatedValue as Float - } - animator.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - super.onAnimationEnd(animation) - viewPager.currentItem = position - tv_one.setTextColor(ContextCompat.getColor(mContext, R.color.colorTitle)) - tv_second.setTextColor(ContextCompat.getColor(mContext, R.color.colorTitle)) - tv_third.setTextColor(ContextCompat.getColor(mContext, R.color.white)) - animFinish = true - } - }) - } - else -> { - } - } - if (animator != null) { - animator.duration = 200 - animator.interpolator = AccelerateInterpolator() - animator.start() - } - } - - fun setOnTabBtnClickListener(listener: OnTabClickListener?) { - this.mBtnClickListener = listener - } - - override fun onClick(v: View) { - if (this.mBtnClickListener != null) { - when (v) { - this.tv_one -> this.mBtnClickListener!!.onTabBtnClick(CommonTabBtn.ONE, v) - this.tv_second -> this.mBtnClickListener!!.onTabBtnClick(CommonTabBtn.TWO, v) - this.tv_third -> this.mBtnClickListener!!.onTabBtnClick(CommonTabBtn.THREE, v) - } - } - - } - - enum class CommonTabBtn() { - ONE, - TWO, - THREE - } - - interface OnTabClickListener { - fun onTabBtnClick(var1: CommonTabBtn, var2: View) - } -} diff --git a/app/src/main/java/com/novel/read/widget/dialog/ReadSettingDialog.kt b/app/src/main/java/com/novel/read/widget/dialog/ReadSettingDialog.kt deleted file mode 100644 index 65f94f6..0000000 --- a/app/src/main/java/com/novel/read/widget/dialog/ReadSettingDialog.kt +++ /dev/null @@ -1,176 +0,0 @@ -package com.novel.read.widget.dialog - -import android.app.Activity -import android.app.Dialog -import android.graphics.drawable.Drawable -import android.view.Gravity -import android.view.View -import android.view.WindowManager -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.GridLayoutManager -import com.novel.read.R -import com.novel.read.adapter.PageStyleAdapter -import com.novel.read.utlis.ScreenUtils -import com.novel.read.widget.page.PageLoader -import com.novel.read.widget.page.PageMode -import com.novel.read.widget.page.PageStyle -import com.novel.read.widget.page.ReadSettingManager -import kotlinx.android.synthetic.main.layout_setting.* - -class ReadSettingDialog(mActivity: Activity, private var mPageLoader: PageLoader) : - Dialog(mActivity, R.style.ReadSettingDialog) { - - private lateinit var mPageStyleAdapter: PageStyleAdapter - private var mSettingManager: ReadSettingManager = ReadSettingManager.getInstance() - - private var mPageMode: PageMode? = null - private var mPageStyle: PageStyle? = null - - private var mBrightness: Int = 0 - private var mTextSize: Int = 0 - - private var isBrightnessAuto: Boolean = false - private var isTextDefault: Boolean = false - - private var convertType: Int = 0 - - init { - setContentView(R.layout.layout_setting) - setUpWindow() - initData() - initWidget() - initClick() - initPageMode() - } - - //设置Dialog显示的位置 - private fun setUpWindow() { - val window = window - val lp = window!!.attributes - lp.width = WindowManager.LayoutParams.MATCH_PARENT - lp.height = WindowManager.LayoutParams.WRAP_CONTENT - lp.gravity = Gravity.BOTTOM - window.attributes = lp - } - - private fun initData() { - - isBrightnessAuto = mSettingManager.isBrightnessAuto - mBrightness = mSettingManager.brightness - mTextSize = mSettingManager.textSize - isTextDefault = mSettingManager.isDefaultTextSize - mPageMode = mSettingManager.pageMode - mPageStyle = mSettingManager.pageStyle - convertType = mSettingManager.convertType - if (convertType == 0) { - tv_simple.isSelected = true - tv_trans.isSelected = false - } else { - tv_simple.isSelected = false - tv_trans.isSelected = true - } - tv_size.text = "$mTextSize" - } - - private fun initWidget() { - setUpAdapter() - } - - private fun setUpAdapter() { - val drawables = arrayOf( - getDrawable(R.color.read_bg_one), - getDrawable(R.color.read_bg_two), - getDrawable(R.color.read_bg_four), - getDrawable(R.color.read_bg_five) - ) - - mPageStyleAdapter = PageStyleAdapter(listOf(*drawables) as List, mPageLoader) - read_setting_rv_bg.layoutManager = GridLayoutManager(context, 4) - read_setting_rv_bg.adapter = mPageStyleAdapter - - mPageStyleAdapter.setPageStyleChecked(mPageStyle!!) - - } - - private fun getDrawable(drawRes: Int): Drawable? { - return ContextCompat.getDrawable(context, drawRes) - } - - private fun initClick() { - - //字体大小调节 - read_setting_tv_font_minus.setOnClickListener { - val fontSize = mSettingManager.textSize - 1 - if (fontSize < 0) { - return@setOnClickListener - } - mPageLoader.setTextSize(fontSize) - tv_size.text = "$fontSize" - } - - read_setting_tv_font_plus.setOnClickListener { - val fontSize = mSettingManager.textSize + 1 - mPageLoader.setTextSize(fontSize) - tv_size.text = "$fontSize" - } - - tv_font_default.setOnClickListener { - val fontSize = ScreenUtils.spToPx(16) - mSettingManager.textSize = fontSize - mPageLoader.setTextSize(fontSize) - tv_size.text = "$fontSize" - } - - tv_simple.setOnClickListener(View.OnClickListener { - if (convertType == 0) { - return@OnClickListener - } - tv_simple.isSelected = true - tv_trans.isSelected = false - mSettingManager.convertType = 0 - convertType = 0 - mPageLoader.setTextSize(mSettingManager.textSize) - }) - - tv_trans.setOnClickListener(View.OnClickListener { - if (convertType == 1) { - return@OnClickListener - } - tv_simple.isSelected = false - tv_trans.isSelected = true - mSettingManager.convertType = 1 - convertType = 1 - mPageLoader.setTextSize(mSettingManager.textSize) - }) - - //Page Mode 切换 - read_setting_rg_page_mode.setOnCheckedChangeListener { group, checkedId -> - val pageMode: PageMode = when (checkedId) { - R.id.read_setting_rb_simulation -> PageMode.SIMULATION - R.id.read_setting_rb_cover -> PageMode.COVER - R.id.read_setting_rb_scroll -> PageMode.SCROLL - R.id.read_setting_rb_none -> PageMode.NONE - else -> PageMode.SIMULATION - } - mPageLoader.setPageMode(pageMode) - } - - } - - private fun initPageMode() { - when (mPageMode) { - PageMode.SIMULATION -> read_setting_rb_simulation.isChecked = true - PageMode.COVER -> read_setting_rb_cover.isChecked = true - PageMode.NONE -> read_setting_rb_none.isChecked = true - PageMode. SCROLL -> read_setting_rb_scroll.isChecked = true - else -> { - - } - } - } - - companion object { - private val TAG = "ReadSettingDialog" - } - -} diff --git a/app/src/main/java/com/novel/read/widget/page/LocalPageLoader.java b/app/src/main/java/com/novel/read/widget/page/LocalPageLoader.java deleted file mode 100644 index 6c0891c..0000000 --- a/app/src/main/java/com/novel/read/widget/page/LocalPageLoader.java +++ /dev/null @@ -1,442 +0,0 @@ -package com.novel.read.widget.page; - -import android.content.Context; -import android.util.Log; - -import com.novel.read.constants.Constant; -import com.novel.read.model.db.BookChapterBean; -import com.novel.read.model.db.CollBookBean; -import com.novel.read.model.db.dbManage.BookRepository; -import com.novel.read.utlis.Charset; -import com.novel.read.utlis.DateUtli; -import com.novel.read.utlis.FileUtils; -import com.novel.read.utlis.IOUtils; -import com.novel.read.utlis.MD5Utils; -import com.novel.read.utlis.RxUtils; -import com.novel.read.utlis.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 zlj - */ -public class LocalPageLoader extends PageLoader { - private static final String TAG = "LocalPageLoader"; - //默认从文件中获取数据的长度 - private final static int BUFFER_SIZE = 512 * 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; - - private Context mContext; - - public LocalPageLoader(PageView pageView, CollBookBean collBook) { - super(pageView, collBook); - mStatus = STATUS_PARING; - mContext = pageView.getContext(); - } - - 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.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.getCode()); - //当前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.getCode()).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.getCode()).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.getCode()).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.Companion.getBLANK()) { - 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.INSTANCE.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.INSTANCE.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.getCode())); - //如果匹配存在,那么就表示当前章节使用这种匹配方式 - 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(String.valueOf(System.currentTimeMillis())); - //直接更新 - 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 = DateUtli.INSTANCE.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.INSTANCE.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, mCollBook); - BookRepository.getInstance().saveCollBook(mCollBook); - - // 加载并显示当前章节 - openChapter(); - } - - @Override - public void onError(Throwable e) { - chapterError(); - Log.e(TAG, "file load error: " + e.toString()); - } - }); - } - - @Override - protected BufferedReader getChapterReader(TxtChapter chapter) throws Exception { - //从文件中获取数据 - byte[] content = getChapterContent(chapter); - String test = new String(content); - test = StringUtils.INSTANCE.convertCC(test); - content = test.getBytes(); - ByteArrayInputStream bais = new ByteArrayInputStream(content); - return new BufferedReader(new InputStreamReader(bais, mCharset.getCode())); - } - - @Override - protected boolean hasChapterData(TxtChapter chapter) { - return true; - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/NetPageLoader.java b/app/src/main/java/com/novel/read/widget/page/NetPageLoader.java deleted file mode 100644 index 625d3a1..0000000 --- a/app/src/main/java/com/novel/read/widget/page/NetPageLoader.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.novel.read.widget.page; - - -import android.content.Context; -import com.novel.read.constants.Constant; -import com.novel.read.model.db.BookChapterBean; -import com.novel.read.model.db.CollBookBean; -import com.novel.read.model.db.dbManage.BookManager; -import com.novel.read.model.db.dbManage.BookRepository; -import com.novel.read.utlis.FileUtils; - -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 zlj - * 网络页面加载器 - */ -public class NetPageLoader extends PageLoader { - private static final String TAG = "PageFactory"; - private Context mContext; - public NetPageLoader(PageView pageView, CollBookBean collBook) { - super(pageView, collBook); - mContext = pageView.getContext(); - } - - private List convertTxtChapter(List bookChapters) { - List txtChapters = new ArrayList<>(bookChapters.size()); - for (BookChapterBean bean : bookChapters) { - TxtChapter chapter = new TxtChapter(); - chapter.bookId = mCollBook.getId(); - chapter.title = bean.getTitle(); - chapter.link = bean.getLink(); - chapter.chapterId = bean.getId(); - 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.getId() - + File.separator + chapter.title + FileUtils.SUFFIX_NB); - if (!file.exists()) return null; - Reader reader = new FileReader(file); - return new BufferedReader(reader); - } - - @Override - protected boolean hasChapterData(TxtChapter chapter) { - return BookManager.isChapterCached(mCollBook.getId(), 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(String.valueOf(System.currentTimeMillis())); - //直接更新 - BookRepository.getInstance().saveCollBook(mCollBook); - } - } -} - diff --git a/app/src/main/java/com/novel/read/widget/page/PageAnimation.java b/app/src/main/java/com/novel/read/widget/page/PageAnimation.java deleted file mode 100644 index b0640c3..0000000 --- a/app/src/main/java/com/novel/read/widget/page/PageAnimation.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.novel.read.widget.page; - -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 zlj - * 翻页动画抽象类 - */ -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/novel/read/widget/page/PageLoader.java b/app/src/main/java/com/novel/read/widget/page/PageLoader.java deleted file mode 100644 index ee5b200..0000000 --- a/app/src/main/java/com/novel/read/widget/page/PageLoader.java +++ /dev/null @@ -1,1552 +0,0 @@ -package com.novel.read.widget.page; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Typeface; -import android.graphics.drawable.Drawable; - -import android.text.TextPaint; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.target.SimpleTarget; -import com.bumptech.glide.request.transition.Transition; -import com.novel.read.R; -import com.novel.read.constants.Constant; -import com.novel.read.model.db.BookRecordBean; -import com.novel.read.model.db.CollBookBean; -import com.novel.read.model.db.dbManage.BookRepository; -import com.novel.read.utlis.DateUtli; -import com.novel.read.utlis.IOUtils; -import com.novel.read.utlis.RxUtils; -import com.novel.read.utlis.ScreenUtils; -import com.novel.read.utlis.StringUtils; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.IOException; -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.SingleObserver; -import io.reactivex.SingleOnSubscribe; -import io.reactivex.disposables.Disposable; - -/** - * Created by zlj - */ -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 = 45; - 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 Paint mSelectPaint; - // 阅读器的配置选项 - 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.Companion.getInstance(); - // 获取配置参数 - mPageMode = mSettingManager.getPageMode(); - mPageStyle = mSettingManager.getPageStyle(); - // 初始化参数 - mMarginWidth = ScreenUtils.INSTANCE.dpToPx(DEFAULT_MARGIN_WIDTH); - mMarginHeight = ScreenUtils.INSTANCE.dpToPx(DEFAULT_MARGIN_HEIGHT); - // 配置文字有关的参数 - setUpTextParams(mSettingManager.getTextSize()); - } - - /** - * 作用:设置与文字相关的参数 - * - * @param textSize - */ - private void setUpTextParams(int textSize) { - // 文字大小 - mTextSize = textSize; - mTitleSize = mTextSize + ScreenUtils.INSTANCE.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.INSTANCE.spToPx(DEFAULT_TIP_SIZE)); // Tip默认的字体大小 - mTipPaint.setAntiAlias(true); - mTipPaint.setSubpixelText(true); - - // 绘制页面内容的画笔 - mTextPaint = new TextPaint(); - mTextPaint.setColor(mTextColor); - mTextPaint.setTextSize(mTextSize); - mTextPaint.setAntiAlias(true); - - mSelectPaint = new TextPaint(); - mSelectPaint.setColor(mContext.getResources().getColor(R.color.colorSelect)); - mSelectPaint.setTextSize(mTextSize); - mSelectPaint.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); - } - - /** - * 跳转到上一章 - * - * @return - */ - public boolean skipPreChapter() { - if (!hasPrevChapter()) { - return false; - } - - // 载入上一章。 - if (parsePrevChapter()) { - mCurPage = getCurPage(0); - } else { - mCurPage = new TxtPage(); - } - mPageView.drawCurPage(false); - return true; - } - - /** - * 跳转到下一章 - */ - 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; - } - - /** - * 翻到上一页 - */ - public boolean skipToPrePage() { - return mPageView.autoPrevPage(); - } - - /** - * 翻到下一页 - */ - 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); - mSelectPaint.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); - } - - 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; - } - - public TxtPage getCurPage() { - return mCurPage; - } - - public void setCurPage(TxtPage mCurPage) { - this.mCurPage = mCurPage; - } - - public List getCurPageList() { - if (mCurPageList == null) { - return new ArrayList<>(); - } - return mCurPageList; - } - - public List getNextPageList() { - if (mNextPageList == null) { - return new ArrayList<>(); - } - return mNextPageList; - } - - /** - * 获取当前页的页码 - */ - public int getPagePos() { - return mCurPage.position; - } - - /** - * 获取当前章节的章节位置 - */ - public int getChapterPos() { - return mCurChapterPos; - } - - /** - * 获取距离屏幕的高度 - */ - public int getMarginHeight() { - return mMarginHeight; - } - - /** - * 保存阅读记录 - */ - public void saveRecord() { - - if (mChapterList.isEmpty()) { - return; - } - - mBookRecord.setBookId(mCollBook.getId()); - 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.getId()); - - 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); - - return loadPages(chapter, reader); - } - - /** - * 刷新章节列表 - */ - public abstract void refreshChapterList(); - - /** - * 获取章节的文本流 - */ - protected abstract BufferedReader getChapterReader(TxtChapter chapter) throws Exception; - - /** - * 章节数据是否存在 - */ - 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 void drawBackground(Bitmap bitmap, boolean isUpdate) { - Canvas canvas = new Canvas(bitmap); - int tipMarginHeight = ScreenUtils.INSTANCE.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) { - //todo 目前不清楚发生的情形,只能这样防止用户瞎逼操作导致数组越界 - if (mChapterList.size() > mCurChapterPos) { - 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) { - String percent = (mCurPage.position + 1) + "/" + mCurPageList.size(); - canvas.drawText(percent, mMarginWidth, y, mTipPaint); - } - } - } else { - //擦除区域 - mBgPaint.setColor(mBgColor); - canvas.drawRect(mDisplayWidth >> 1, mDisplayHeight - mMarginHeight + ScreenUtils.INSTANCE.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.INSTANCE.dpToPx(6); - int polarWidth = ScreenUtils.INSTANCE.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.INSTANCE.dpToPx(2)); - - mBatteryPaint.setStyle(Paint.Style.FILL); - canvas.drawRect(polar, mBatteryPaint); - - //外框的制作 - int outFrameLeft = polarLeft - outFrameWidth; - int outFrameTop = visibleBottom - outFrameHeight; - int outFrameBottom = visibleBottom - ScreenUtils.INSTANCE.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 = DateUtli.INSTANCE.dateConvert(System.currentTimeMillis(), Constant.FORMAT_TIME); - float x = outFrameLeft - mTipPaint.measureText(time) - ScreenUtils.INSTANCE.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; - } - - //将提示语句放到正中间 - drawCenter(tip, canvas); - } 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; - - //对标题进行绘制 - for (int i = 0; i < mCurPage.titleLines; ++i) { - str = mCurPage.getLines().get(i); - //设置顶部间距 - if (i == 0) { - top += mTitlePara; - } - - //计算文字显示的起始点 - int start = (int) (mDisplayWidth - mTitlePaint.measureText(str)) / 2; - //进行绘制 - mTitlePaint.setColor(mTextColor); - 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.getLines().get(i); -// if (i == 0) { -// top = top + 15; -// } - - canvas.drawText(str, mMarginWidth, top, mTextPaint); - - if (str.endsWith("\n")) { - top += para; - } else { - top += interval; - } - } - - if (!TextUtils.isEmpty(getCurPage().getPic())) { - Glide.with(mContext).asBitmap().load(getCurPage().getPic()).thumbnail(0.1f).into(new SimpleTarget() { - @Override - public void onLoadStarted(@Nullable Drawable placeholder) { - canvas.save(); - drawCenter(mContext.getString(R.string.pic_loading), canvas); - canvas.restore(); - } - - @Override - public void onResourceReady(@NonNull Bitmap resource, Transition transition) { - - if (resource.getWidth() > mDisplayWidth) { - resource = scaleBitmap(resource); - } - float pivotX = (mDisplayWidth - resource.getWidth()) >> 1; - float pivotY = (mDisplayHeight - resource.getHeight()) >> 1; - if (!TextUtils.isEmpty(getCurPage().getPic())) { - canvas.drawBitmap(resource, pivotX, pivotY, mTextPaint); - mPageView.invalidate(); - } - - } - }); - } - - } - } - - //中心文字绘制 - private void drawCenter(String tip, Canvas canvas) { - 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); - } - - - //图片缩放 - private Bitmap scaleBitmap(Bitmap origin) { - if (origin == null) { - return null; - } - int width = origin.getWidth(); - int height = origin.getHeight(); - Matrix matrix = new Matrix(); - matrix.preScale((float) 0.5, (float) 0.5); - Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false); - if (newBM.equals(origin)) { - return newBM; - } - return newBM; - } - - 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); - } - } - - /** - * 翻阅上一页 - */ - 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; - } - - private boolean hasPrevChapter() { - //判断是否上一章节为空 - return mCurChapterPos - 1 >= 0; - } - - /** - * 翻到下一页 - * - * @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() { - // 判断是否到达目录最后一章 - return mCurChapterPos + 1 < mChapterList.size(); - } - - boolean parseCurChapter() { - // 解析数据 - dealLoadPageList(mCurChapterPos); - // 预加载下一页面 - preLoadNextChapter(); - return mCurPageList != null; - } - - /** - * 解析下一章数据 - * - * @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; - } - - 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); - pics.clear(); - 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((SingleOnSubscribe>) e -> 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; - } - - /** - * 将章节数据,解析成页面列表 - * chapter:章节信息 - * br:章节的文本流 - */ - private List pics = new ArrayList<>(); - - 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();//默认展示标题 - String title = StringUtils.INSTANCE.convertCC(chapter.getTitle()); - String half; - try { - while (showTitle || (paragraph = br.readLine()) != null) { - half = paragraph; - paragraph = StringUtils.INSTANCE.convertCC(paragraph); - // 重置段落 - if (!showTitle) { - paragraph = paragraph.replaceAll("\\s", ""); - // 如果只有换行符,那么就不执行 - if (paragraph.equals("")) continue; - paragraph = StringUtils.INSTANCE.halfToFull(" " + paragraph + "\n"); - } else { - //设置 title 的顶部间距 - rHeight -= mTitlePara; - } - - int wordCount; - String subStr; - 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 = title; - 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; - } - - pics.addAll(getImgs(half)); - } - if (lines.size() != 0) { - //创建Page - TxtPage page = new TxtPage(); - page.position = pages.size(); - page.title = title; - page.lines = new ArrayList<>(lines); - page.titleLines = titleLinesCount; - pages.add(page); - //重置Lines - lines.clear(); - } - - if (pics.size() > 0) { - for (int i = 0; i < pics.size(); i++) { - TxtPage page = new TxtPage(); - page.position = pages.size(); - page.title = title; - page.lines = new ArrayList<>(); - page.titleLines = 0; - page.setPic(pics.get(i)); - pages.add(page); - // 重置Lines - lines.clear(); - } - } - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - IOUtils.INSTANCE.close(br); - } - return pages; - } - - - private List getImgs(String content) { - String img; - Pattern p_image; - Matcher m_image; - List images = new ArrayList<>(); - String regEx_img = "(]*?>)"; - p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE); - m_image = p_image.matcher(content); - while (m_image.find()) { - img = m_image.group(); - Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img); - while (m.find()) { - String tempSelected = m.group(1); - images.add(tempSelected); - } - } - - return images; - } - - /** - * @return :获取初始显示的页面 - */ - private TxtPage getCurPage(int pos) { - if (mPageChangeListener != null) { - mPageChangeListener.onPageChange(pos); - } - if (pos >= mCurPageList.size()) { - return mCurPageList.get(mCurPageList.size() - 1); - } - 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); - } - - /** - * 根据当前状态,决定是否能够翻页 - */ - 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/novel/read/widget/page/PageMode.kt b/app/src/main/java/com/novel/read/widget/page/PageMode.kt deleted file mode 100644 index 92d9ac7..0000000 --- a/app/src/main/java/com/novel/read/widget/page/PageMode.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.novel.read.widget.page - -/** - * Created by zlj - * 作用:翻页动画的模式 - */ -enum class PageMode { - SIMULATION, COVER, SLIDE, NONE, SCROLL -} diff --git a/app/src/main/java/com/novel/read/widget/page/PageStyle.kt b/app/src/main/java/com/novel/read/widget/page/PageStyle.kt deleted file mode 100644 index 6082c79..0000000 --- a/app/src/main/java/com/novel/read/widget/page/PageStyle.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.novel.read.widget.page - - -import androidx.annotation.ColorRes - -import com.novel.read.R - -/** - * Created by zlj - * 页面的展示风格。 - */ -enum class PageStyle private constructor(@param:ColorRes val fontColor: Int, @param:ColorRes val bgColor: Int) { - BG_0(R.color.read_font_one, R.color.read_bg_one), - BG_1(R.color.read_font_two, R.color.read_bg_two), - // BG_2(R.color.nb_read_font_3, R.color.nb_read_bg_3), - BG_3(R.color.read_font_four, R.color.read_bg_four), - BG_4(R.color.read_font_five, R.color.read_bg_five), - NIGHT(R.color.read_font_night, R.color.read_bg_night) -} diff --git a/app/src/main/java/com/novel/read/widget/page/PageView.java b/app/src/main/java/com/novel/read/widget/page/PageView.java deleted file mode 100644 index c62e47d..0000000 --- a/app/src/main/java/com/novel/read/widget/page/PageView.java +++ /dev/null @@ -1,364 +0,0 @@ -package com.novel.read.widget.page; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.RectF; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; - -import com.novel.read.model.db.CollBookBean; -import com.novel.read.widget.page.anim.CoverPageAnim; -import com.novel.read.widget.page.anim.HorizonPageAnim; -import com.novel.read.widget.page.anim.NonePageAnim; -import com.novel.read.widget.page.anim.ScrollPageAnim; -import com.novel.read.widget.page.anim.SimulationPageAnim; -import com.novel.read.widget.page.anim.SlidePageAnim; - -/** - * Created by Administrator on 2016/8/29 0029. - * 原作者的GitHub Project Path:(https://github.com/PeachBlossom/treader) - * 绘制页面显示内容的类 - */ -public class PageView extends View { - - 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 = 0xFFCEC29C; - private PageMode mPageMode = PageMode.SIMULATION; - // 是否允许点击 - 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 SimulationPageAnim(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; - } - - /** - * 判断是否存在上一页 - */ - private boolean hasPrevPage() { - mTouchListener.prePage(); - return mPageLoader.prev(); - } - - /** - * 判断是否下一页存在 - */ - 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); - } - - /** - * 绘制当前页。 - */ - 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 - */ - 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); - } - - return mPageLoader; - } - - public interface TouchListener { - boolean onTouch(); - - void center(); - - void prePage(); - - void nextPage(); - - void cancel(); - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/ReadSettingManager.kt b/app/src/main/java/com/novel/read/widget/page/ReadSettingManager.kt deleted file mode 100644 index b4f3adf..0000000 --- a/app/src/main/java/com/novel/read/widget/page/ReadSettingManager.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.novel.read.widget.page - - -import com.novel.read.utlis.DialogUtils -import com.novel.read.utlis.ScreenUtils -import com.novel.read.utlis.SpUtil - -class ReadSettingManager private constructor() { - - var brightness: Int - get() = SpUtil.getIntValue(SHARED_READ_BRIGHTNESS, 40) - set(progress) = SpUtil.setIntValue(SHARED_READ_BRIGHTNESS, progress) - - val isBrightnessAuto: Boolean - get() = SpUtil.getBooleanValue(SHARED_READ_IS_BRIGHTNESS_AUTO, false) - - var textSize: Int - get() = SpUtil.getIntValue(SHARED_READ_TEXT_SIZE, ScreenUtils.spToPx(16)) - set(textSize) = SpUtil.setIntValue(SHARED_READ_TEXT_SIZE, textSize) - - var isDefaultTextSize: Boolean - get() = SpUtil.getBooleanValue(SHARED_READ_IS_TEXT_DEFAULT, false) - set(isDefault) = SpUtil.setBooleanValue(SHARED_READ_IS_TEXT_DEFAULT, isDefault) - - var pageMode: PageMode - get() { - val mode = SpUtil.getIntValue(SHARED_READ_PAGE_MODE, PageMode.SIMULATION.ordinal) - return PageMode.values()[mode] - } - set(mode) = SpUtil.setIntValue(SHARED_READ_PAGE_MODE, mode.ordinal) - - var pageStyle: PageStyle - get() { - val style = SpUtil.getIntValue(SHARED_READ_BG, PageStyle.BG_0.ordinal) - return PageStyle.values()[style] - } - set(pageStyle) = SpUtil.setIntValue(SHARED_READ_BG, pageStyle.ordinal) - - var isNightMode: Boolean - get() = SpUtil.getBooleanValue(SHARED_READ_NIGHT_MODE, false) - set(isNight) = SpUtil.setBooleanValue(SHARED_READ_NIGHT_MODE, isNight) - - var isVolumeTurnPage: Boolean - get() = SpUtil.getBooleanValue(SHARED_READ_VOLUME_TURN_PAGE, false) - set(isTurn) = SpUtil.setBooleanValue(SHARED_READ_VOLUME_TURN_PAGE, isTurn) - - var isFullScreen: Boolean - get() = SpUtil.getBooleanValue(SHARED_READ_FULL_SCREEN, false) - set(isFullScreen) = SpUtil.setBooleanValue(SHARED_READ_FULL_SCREEN, isFullScreen) - - var convertType: Int - get() = SpUtil.getIntValue(SHARED_READ_CONVERT_TYPE, 1) - set(convertType) = SpUtil.setIntValue(SHARED_READ_CONVERT_TYPE, convertType) - - fun setAutoBrightness(isAuto: Boolean) { - SpUtil.setBooleanValue(SHARED_READ_IS_BRIGHTNESS_AUTO, isAuto) - } - - companion object { - /*************实在想不出什么好记的命名方式。。 */ - val READ_BG_DEFAULT = 0 - val READ_BG_1 = 1 - val READ_BG_2 = 2 - val READ_BG_3 = 3 - val READ_BG_4 = 4 - val NIGHT_MODE = 5 - - val SHARED_READ_BG = "shared_read_bg" - val SHARED_READ_BRIGHTNESS = "shared_read_brightness" - val SHARED_READ_IS_BRIGHTNESS_AUTO = "shared_read_is_brightness_auto" - val SHARED_READ_TEXT_SIZE = "shared_read_text_size" - val SHARED_READ_IS_TEXT_DEFAULT = "shared_read_text_default" - val SHARED_READ_PAGE_MODE = "shared_read_mode" - val SHARED_READ_NIGHT_MODE = "shared_night_mode" - val SHARED_READ_VOLUME_TURN_PAGE = "shared_read_volume_turn_page" - val SHARED_READ_FULL_SCREEN = "shared_read_full_screen" - val SHARED_READ_CONVERT_TYPE = "shared_read_convert_type" - -// @Volatile -// private var sInstance: ReadSettingManager? = null -// -// val instance: ReadSettingManager? -// get() { -// if (sInstance == null) { -// synchronized(ReadSettingManager::class.java) { -// if (sInstance == null) { -// sInstance = ReadSettingManager() -// } -// } -// } -// return sInstance -// } - @Volatile - private var instance: ReadSettingManager? = null - - @Synchronized - fun getInstance(): ReadSettingManager { - if (instance == null) { - instance = ReadSettingManager() - } - return instance as ReadSettingManager - } - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/TxtChapter.java b/app/src/main/java/com/novel/read/widget/page/TxtChapter.java deleted file mode 100644 index cb607aa..0000000 --- a/app/src/main/java/com/novel/read/widget/page/TxtChapter.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.novel.read.widget.page; - -/** - * Created by zlj - */ -public class TxtChapter { - - //章节所属的小说(网络) - String bookId; - //章节的链接(网络) - String link; - - //章节名(共用) - String title; - - //章节内容在文章中的起始位置(本地) - long start; - //章节内容在文章中的终止位置(本地) - long end; - String chapterId; - - - 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 == null ? "" : 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; - } - - public String getChapterId() { - return chapterId == null ? "" : chapterId; - } - - public void setChapterId(String chapterId) { - this.chapterId = chapterId; - } - - - @Override - public String toString() { - return "TxtChapter{" + - "title='" + title + '\'' + - ", start=" + start + - ", end=" + end + - '}'; - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/TxtPage.java b/app/src/main/java/com/novel/read/widget/page/TxtPage.java deleted file mode 100644 index e1b93b2..0000000 --- a/app/src/main/java/com/novel/read/widget/page/TxtPage.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.novel.read.widget.page; - -import java.util.ArrayList; -import java.util.List; - -public class TxtPage { - int position; - String title; - int titleLines; //当前 lines 中为 title 的行数。 - List lines; - private String pic; - - public int getPosition() { - return position; - } - - public String getTitle() { - return title == null ? "" : title; - } - - - - public List getLines() { - if (lines == null) { - return new ArrayList<>(); - } - return lines; - } - - - public String getPic() { - return pic == null ? "" : pic; - } - - public void setPic(String pic) { - this.pic = pic; - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/Void.kt b/app/src/main/java/com/novel/read/widget/page/Void.kt deleted file mode 100644 index 9f07962..0000000 --- a/app/src/main/java/com/novel/read/widget/page/Void.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.novel.read.widget.page - -class Void diff --git a/app/src/main/java/com/novel/read/widget/page/anim/CoverPageAnim.kt b/app/src/main/java/com/novel/read/widget/page/anim/CoverPageAnim.kt deleted file mode 100644 index 4d41076..0000000 --- a/app/src/main/java/com/novel/read/widget/page/anim/CoverPageAnim.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.novel.read.widget.page.anim - -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.Rect -import android.graphics.drawable.GradientDrawable -import android.view.View -import com.novel.read.widget.page.PageAnimation - -/** - * Created by zlj - * 覆盖动画 - */ - -class CoverPageAnim(w: Int, h: Int, view: View, listener: OnPageChangeListener) : - HorizonPageAnim(w, h, view, listener) { - - private val mSrcRect: Rect = Rect(0, 0, mViewWidth, mViewHeight) - private val mDestRect: Rect = Rect(0, 0, mViewWidth, mViewHeight) - private val mBackShadowDrawableLR: GradientDrawable - - init { - val mBackShadowColors = intArrayOf(0x66000000, 0x00000000) - mBackShadowDrawableLR = GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, mBackShadowColors - ) - mBackShadowDrawableLR.gradientType = GradientDrawable.LINEAR_GRADIENT - } - - override fun drawStatic(canvas: Canvas) { - if (isCancel) { - mNextBitmap = mCurBitmap.copy(Bitmap.Config.RGB_565, true) - canvas.drawBitmap(mCurBitmap, 0f, 0f, null) - } else { - canvas.drawBitmap(mNextBitmap, 0f, 0f, null) - } - } - - override fun drawMove(canvas: Canvas) { - - when (mDirection) { - PageAnimation.Direction.NEXT -> { - var dis = (mViewWidth - mStartX + mTouchX).toInt() - if (dis > mViewWidth) { - dis = mViewWidth - } - //计算bitmap截取的区域 - mSrcRect.left = mViewWidth - dis - //计算bitmap在canvas显示的区域 - mDestRect.right = dis - canvas.drawBitmap(mNextBitmap, 0f, 0f, null) - canvas.drawBitmap(mCurBitmap, mSrcRect, mDestRect, null) - addShadow(dis, canvas) - } - else -> { - mSrcRect.left = (mViewWidth - mTouchX).toInt() - mDestRect.right = mTouchX.toInt() - canvas.drawBitmap(mCurBitmap, 0f, 0f, null) - canvas.drawBitmap(mNextBitmap, mSrcRect, mDestRect, null) - addShadow(mTouchX.toInt(), canvas) - } - } - } - - //添加阴影 - fun addShadow(left: Int, canvas: Canvas) { - mBackShadowDrawableLR.setBounds(left, 0, left + 30, mScreenHeight) - mBackShadowDrawableLR.draw(canvas) - } - - override fun startAnim() { - super.startAnim() - var dx = 0 - when (mDirection) { - PageAnimation.Direction.NEXT -> if (isCancel) { - var dis = (mViewWidth - mStartX + mTouchX).toInt() - if (dis > mViewWidth) { - dis = mViewWidth - } - dx = mViewWidth - dis - } else { - dx = (-(mTouchX + (mViewWidth - mStartX))).toInt() - } - else -> if (isCancel) { - dx = (-mTouchX).toInt() - } else { - dx = (mViewWidth - mTouchX).toInt() - } - } - - //滑动速度保持一致 - val duration = 400 * Math.abs(dx) / mViewWidth - mScroller.startScroll(mTouchX.toInt(), 0, dx, 0, duration) - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/anim/HorizonPageAnim.kt b/app/src/main/java/com/novel/read/widget/page/anim/HorizonPageAnim.kt deleted file mode 100644 index 23300a8..0000000 --- a/app/src/main/java/com/novel/read/widget/page/anim/HorizonPageAnim.kt +++ /dev/null @@ -1,223 +0,0 @@ -package com.novel.read.widget.page.anim - -import android.graphics.Bitmap -import android.graphics.Canvas -import android.view.MotionEvent -import android.view.View -import android.view.ViewConfiguration - -import com.novel.read.widget.page.PageAnimation - -/** - * Created by zlj - * 横向动画 - */ - -abstract class HorizonPageAnim( - w: Int, h: Int, marginWidth: Int, marginHeight: Int, - view: View, listener: OnPageChangeListener -) : PageAnimation(w, h, marginWidth, marginHeight, view, listener) { - - protected var mCurBitmap: Bitmap - protected var mNextBitmap: Bitmap - //是否取消翻页 - protected var isCancel = false - - //可以使用 mLast代替 - private var mMoveX = 0 - private var mMoveY = 0 - //是否移动了 - private var isMove = false - //是否翻阅下一页。true表示翻到下一页,false表示上一页。 - private var isNext = false - - //是否没下一页或者上一页 - private var noNext = false - - constructor(w: Int, h: Int, view: View, listener: OnPageChangeListener) : this( - w, - h, - 0, - 0, - view, - listener - ) - - init { - //创建图片 - mCurBitmap = Bitmap.createBitmap(mViewWidth, mViewHeight, Bitmap.Config.RGB_565) - mNextBitmap = Bitmap.createBitmap(mViewWidth, mViewHeight, Bitmap.Config.RGB_565) - } - - /** - * 转换页面,在显示下一章的时候,必须首先调用此方法 - */ - fun changePage() { - val bitmap = mCurBitmap - mCurBitmap = mNextBitmap - mNextBitmap = bitmap - } - - abstract fun drawStatic(canvas: Canvas) - - abstract fun drawMove(canvas: Canvas) - - override fun onTouchEvent(event: MotionEvent): Boolean { - //获取点击位置 - val x = event.x.toInt() - val y = event.y.toInt() - //设置触摸点 - setTouchPoint(x.toFloat(), y.toFloat()) - - when (event.action) { - MotionEvent.ACTION_DOWN -> { - //移动的点击位置 - mMoveX = 0 - mMoveY = 0 - //是否移动 - isMove = false - //是否存在下一章 - noNext = false - //是下一章还是前一章 - isNext = false - //是否正在执行动画 - isRunning = false - //取消 - isCancel = false - //设置起始位置的触摸点 - setStartPoint(x.toFloat(), y.toFloat()) - //如果存在动画则取消动画 - abortAnim() - } - MotionEvent.ACTION_MOVE -> { - val slop = ViewConfiguration.get(mView.context).scaledTouchSlop - //判断是否移动了 - 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 - val hasPrev = mListener.hasPrev() - direction = PageAnimation.Direction.PRE - //如果上一页不存在 - if (!hasPrev) { - noNext = true - return true - } - } else { - //进行下一页的配置 - isNext = true - //判断是否下一页存在 - val hasNext = mListener.hasNext() - //如果存在设置动画方向 - direction = PageAnimation.Direction.NEXT - - //如果不存在表示没有下一页了 - if (!hasNext) { - noNext = true - return true - } - } - } else { - //判断是否取消翻页 - if (isNext) { - isCancel = x - mMoveX > 0 - } else { - isCancel = x - mMoveX < 0 - } - } - - mMoveX = x - mMoveY = y - isRunning = true - mView.invalidate() - } - } - MotionEvent.ACTION_UP -> { - if (!isMove) { - isNext = x >= mScreenWidth / 2 - - if (isNext) { - //判断是否下一页存在 - val hasNext = mListener.hasNext() - //设置动画方向 - direction = PageAnimation.Direction.NEXT - if (!hasNext) { - return true - } - } else { - val hasPrev = mListener.hasPrev() - direction = PageAnimation.Direction.PRE - if (!hasPrev) { - return true - } - } - } - - // 是否取消翻页 - if (isCancel) { - mListener.pageCancel() - } - - // 开启翻页效果 - if (!noNext) { - startAnim() - mView.invalidate() - } - } - } - return true - } - - override fun draw(canvas: Canvas) { - if (isRunning) { - drawMove(canvas) - } else { - if (isCancel) { - mNextBitmap = mCurBitmap.copy(Bitmap.Config.RGB_565, true) - } - drawStatic(canvas) - } - } - - override fun scrollAnim() { - if (mScroller.computeScrollOffset()) { - val x = mScroller.currX - val y = mScroller.currY - - setTouchPoint(x.toFloat(), y.toFloat()) - - if (mScroller.finalX == x && mScroller.finalY == y) { - isRunning = false - } - mView.postInvalidate() - } - } - - override fun abortAnim() { - if (!mScroller.isFinished) { - mScroller.abortAnimation() - isRunning = false - setTouchPoint(mScroller.finalX.toFloat(), mScroller.finalY.toFloat()) - mView.postInvalidate() - } - } - - override fun getBgBitmap(): Bitmap { - return mNextBitmap - } - - override fun getNextBitmap(): Bitmap { - return mNextBitmap - } - - companion object { - private val TAG = "HorizonPageAnim" - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/anim/NonePageAnim.kt b/app/src/main/java/com/novel/read/widget/page/anim/NonePageAnim.kt deleted file mode 100644 index 6962fef..0000000 --- a/app/src/main/java/com/novel/read/widget/page/anim/NonePageAnim.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.novel.read.widget.page.anim - -import android.graphics.Canvas -import android.view.View -import com.novel.read.widget.page.PageAnimation - -/** - * Created by zlj - * 无 - */ - -class NonePageAnim(w: Int, h: Int, view: View, listener: OnPageChangeListener) : - HorizonPageAnim(w, h, view, listener) { - - override fun drawStatic(canvas: Canvas) { - if (isCancel) { - canvas.drawBitmap(mCurBitmap, 0f, 0f, null) - } else { - canvas.drawBitmap(mNextBitmap, 0f, 0f, null) - } - } - - override fun drawMove(canvas: Canvas) { - if (isCancel) { - canvas.drawBitmap(mCurBitmap, 0f, 0f, null) - } else { - canvas.drawBitmap(mNextBitmap, 0f, 0f, null) - } - } - - override fun startAnim() {} -} diff --git a/app/src/main/java/com/novel/read/widget/page/anim/ScrollPageAnim.kt b/app/src/main/java/com/novel/read/widget/page/anim/ScrollPageAnim.kt deleted file mode 100644 index 4893d7a..0000000 --- a/app/src/main/java/com/novel/read/widget/page/anim/ScrollPageAnim.kt +++ /dev/null @@ -1,412 +0,0 @@ -package com.novel.read.widget.page.anim - -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 com.novel.read.widget.page.PageAnimation - -import java.util.ArrayDeque -import java.util.ArrayList - -/** - * Created by zlj - * 原理:仿照ListView源码实现的上下滑动效果 - * 问题: - * 1. 向上翻页,重复的问题 (完成) - * 2. 滑动卡顿的问题。原因:由于绘制的数据过多造成的卡顿问题。 (主要是文字绘制需要的时长比较多) 解决办法:做文字缓冲 - * 3. 弱网环境下,显示的问题 - */ -class ScrollPageAnim( - w: Int, h: Int, marginWidth: Int, marginHeight: Int, - view: View, listener: OnPageChangeListener -) : PageAnimation(w, h, marginWidth, marginHeight, view, listener) { - private var mVelocity: VelocityTracker? = null - - // 整个Bitmap的背景显示 - private var mBgBitmap: Bitmap? = null - - // 下一个展示的图片 - private var mNextBitmap: Bitmap? = null - - // 被废弃的图片列表 - private var mScrapViews: ArrayDeque? = null - // 正在被利用的图片列表 - private val mActiveViews = ArrayList(2) - - // 是否处于刷新阶段 - private var isRefresh = true - - // 底部填充 - private var downIt: MutableIterator? = null - - private var upIt: MutableIterator? = null - - - private var tmpView: BitmapView? = null - - init { - // 创建两个BitmapView - initWidget() - } - - private fun initWidget() { - mBgBitmap = Bitmap.createBitmap(mScreenWidth, mScreenHeight, Bitmap.Config.RGB_565) - - mScrapViews = ArrayDeque(2) - for (i in 0..1) { - val view = BitmapView() - view.bitmap = Bitmap.createBitmap(mViewWidth, mViewHeight, Bitmap.Config.RGB_565) - view.srcRect = Rect(0, 0, mViewWidth, mViewHeight) - view.destRect = Rect(0, 0, mViewWidth, mViewHeight) - view.top = 0 - view.bottom = view.bitmap!!.height - - mScrapViews!!.push(view) - } - onLayout() - isRefresh = false - } - - // 修改布局,填充内容 - private fun onLayout() { - // 如果还没有开始加载,则从上到下进行绘制 - if (mActiveViews.size == 0) { - fillDown(0, 0) - mDirection = PageAnimation.Direction.NONE - } else { - val offset = (mTouchY - mLastY).toInt() - // 判断是下滑还是上拉 (下滑) - if (offset > 0) { - val topEdge = mActiveViews[0].top - fillUp(topEdge, offset) - } else { - // 底部的距离 = 当前底部的距离 + 滑动的距离 (因为上滑,得到的值肯定是负的) - val bottomEdge = mActiveViews[mActiveViews.size - 1].bottom - fillDown(bottomEdge, offset) - }// 上拉 - } - } - - /** - * 创建View填充底部空白部分 - * - * @param bottomEdge :当前最后一个View的底部,在整个屏幕上的位置,即相对于屏幕顶部的距离 - * @param offset :滑动的偏移量 - */ - private fun fillDown(bottomEdge: Int, offset: Int) { - - downIt = mActiveViews.iterator() - var view: BitmapView? - - // 进行删除 - 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 == PageAnimation.Direction.UP) { - mListener.pageCancel() - mDirection = PageAnimation.Direction.NONE - } - } - } - - // 滑动之后的最后一个 View 的距离屏幕顶部上的实际位置 - var realEdge = bottomEdge + offset - - // 进行填充 - while (realEdge < mViewHeight && mActiveViews.size < 2) { - // 从废弃的Views中获取一个 - view = mScrapViews!!.first - /* //擦除其Bitmap(重新创建会不会更好一点) - eraseBitmap(view.bitmap,view.bitmap.getWidth(),view.bitmap.getHeight(),0,0);*/ - if (view == null) return - - val cancelBitmap = mNextBitmap - mNextBitmap = view.bitmap - - if (!isRefresh) { - val hasNext = mListener.hasNext() //如果不成功则无法滑动 - - // 如果不存在next,则进行还原 - if (!hasNext) { - mNextBitmap = cancelBitmap - for (activeView in 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 = PageAnimation.Direction.DOWN - - // 设置Bitmap的范围 - view.top = realEdge - view.bottom = realEdge + view.bitmap!!.height - // 设置允许显示的范围 - view.destRect!!.top = view.top - view.destRect!!.bottom = view.bottom - - realEdge += view.bitmap!!.height - } - } - - /** - * 创建View填充顶部空白部分 - * - * @param topEdge : 当前第一个View的顶部,到屏幕顶部的距离 - * @param offset : 滑动的偏移量 - */ - private fun fillUp(topEdge: Int, offset: Int) { - // 首先进行布局的调整 - upIt = mActiveViews.iterator() - var view: BitmapView? - 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 == PageAnimation.Direction.DOWN) { - mListener.pageCancel() - mDirection = PageAnimation.Direction.NONE - } - } - } - - // 滑动之后,第一个 View 的顶部距离屏幕顶部的实际位置。 - var realEdge = topEdge + offset - - // 对布局进行View填充 - while (realEdge > 0 && mActiveViews.size < 2) { - // 从废弃的Views中获取一个 - view = mScrapViews!!.first - if (view == null) return - - // 判断是否存在上一章节 - val cancelBitmap = mNextBitmap - mNextBitmap = view.bitmap - if (!isRefresh) { - val hasPrev = mListener.hasPrev() // 如果不成功则无法滑动 - // 如果不存在next,则进行还原 - if (!hasPrev) { - mNextBitmap = cancelBitmap - for (activeView in 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 = PageAnimation.Direction.UP - // 设置Bitmap的范围 - view.top = realEdge - view.bitmap!!.height - view.bottom = realEdge - - // 设置允许显示的范围 - view.destRect!!.top = view.top - view.destRect!!.bottom = view.bottom - realEdge -= view.bitmap!!.height - } - } - - /** - * 对Bitmap进行擦除 - * - * @param b - * @param width - * @param height - * @param paddingLeft - * @param paddingTop - */ - private fun eraseBitmap( - b: Bitmap, width: Int, height: Int, - paddingLeft: Int, paddingTop: Int - ) { - /* if (mInitBitmapPix == null) return; - b.setPixels(mInitBitmapPix, 0, width, paddingLeft, paddingTop, width, height);*/ - } - - /** - * 重置位移 - */ - fun resetBitmap() { - isRefresh = true - // 将所有的Active加入到Scrap中 - for (view in mActiveViews) { - mScrapViews!!.add(view) - } - // 清除所有的Active - mActiveViews.clear() - // 重新进行布局 - onLayout() - isRefresh = false - } - - override fun onTouchEvent(event: MotionEvent): Boolean { - val x = event.x.toInt() - val y = event.y.toInt() - - // 初始化速度追踪器 - if (mVelocity == null) { - mVelocity = VelocityTracker.obtain() - } - - mVelocity!!.addMovement(event) - // 设置触碰点 - setTouchPoint(x.toFloat(), y.toFloat()) - - when (event.action) { - MotionEvent.ACTION_DOWN -> { - isRunning = false - // 设置起始点 - setStartPoint(x.toFloat(), y.toFloat()) - // 停止动画 - abortAnim() - } - MotionEvent.ACTION_MOVE -> { - mVelocity!!.computeCurrentVelocity(VELOCITY_DURATION) - isRunning = true - // 进行刷新 - mView.postInvalidate() - } - MotionEvent.ACTION_UP -> { - isRunning = false - // 开启动画 - startAnim() - // 删除检测器 - mVelocity!!.recycle() - mVelocity = null - } - - MotionEvent.ACTION_CANCEL -> try { - mVelocity!!.recycle() // if velocityTracker won't be used should be recycled - mVelocity = null - } catch (e: Exception) { - e.printStackTrace() - } - - } - return true - } - - override fun draw(canvas: Canvas) { - //进行布局 - onLayout() - - //绘制背景 - canvas.drawBitmap(mBgBitmap!!, 0f, 0f, null) - //绘制内容 - canvas.save() - //移动位置 - canvas.translate(0f, mMarginHeight.toFloat()) - //裁剪显示区域 - canvas.clipRect(0, 0, mViewWidth, mViewHeight) - /* //设置背景透明 - canvas.drawColor(0x40);*/ - //绘制Bitmap - for (i in mActiveViews.indices) { - tmpView = mActiveViews[i] - canvas.drawBitmap(tmpView!!.bitmap!!, tmpView!!.srcRect, tmpView!!.destRect!!, null) - } - canvas.restore() - } - - @Synchronized - override fun startAnim() { - isRunning = true - mScroller.fling( - 0, - mTouchY.toInt(), - 0, - mVelocity!!.yVelocity.toInt(), - 0, - 0, - Integer.MAX_VALUE * -1, - Integer.MAX_VALUE - ) - } - - override fun scrollAnim() { - if (mScroller.computeScrollOffset()) { - val x = mScroller.currX - val y = mScroller.currY - setTouchPoint(x.toFloat(), y.toFloat()) - if (mScroller.finalX == x && mScroller.finalY == y) { - isRunning = false - } - mView.postInvalidate() - } - } - - override fun abortAnim() { - if (!mScroller.isFinished) { - mScroller.abortAnimation() - isRunning = false - } - } - - override fun getBgBitmap(): Bitmap? { - return mBgBitmap - } - - override fun getNextBitmap(): Bitmap? { - return mNextBitmap - } - - private class BitmapView { - internal var bitmap: Bitmap? = null - internal var srcRect: Rect? = null - internal var destRect: Rect? = null - internal var top: Int = 0 - internal var bottom: Int = 0 - } - - companion object { - private val TAG = "ScrollAnimation" - // 滑动追踪的时间 - private val VELOCITY_DURATION = 1000 - } -} diff --git a/app/src/main/java/com/novel/read/widget/page/anim/SimulationPageAnim.kt b/app/src/main/java/com/novel/read/widget/page/anim/SimulationPageAnim.kt deleted file mode 100644 index 68ba596..0000000 --- a/app/src/main/java/com/novel/read/widget/page/anim/SimulationPageAnim.kt +++ /dev/null @@ -1,664 +0,0 @@ -package com.novel.read.widget.page.anim - -import android.graphics.* -import android.graphics.drawable.GradientDrawable -import android.os.Build -import android.view.View -import com.novel.read.widget.page.PageAnimation -import kotlin.math.atan2 -import kotlin.math.hypot - -/** - * Created by zlj - * 仿真动画 - */ - -class SimulationPageAnim(w: Int, h: Int, view: View, listener: OnPageChangeListener) : - HorizonPageAnim(w, h, view, listener) { - - private var mCornerX = 1 // 拖拽点对应的页脚 - private var mCornerY = 1 - private val mPath0: Path = Path() - private val mPath1: Path = Path() - - private val mBezierStart1 = PointF() // 贝塞尔曲线起始点 - private val mBezierControl1 = PointF() // 贝塞尔曲线控制点 - private val mBeziervertex1 = PointF() // 贝塞尔曲线顶点 - private var mBezierEnd1 = PointF() // 贝塞尔曲线结束点 - - private val mBezierStart2 = PointF() // 另一条贝塞尔曲线 - private val mBezierControl2 = PointF() - private val mBeziervertex2 = PointF() - private var mBezierEnd2 = PointF() - - private var mMiddleX: Float = 0.toFloat() - private var mMiddleY: Float = 0.toFloat() - private var mDegrees: Float = 0.toFloat() - private var mTouchToCornerDis: Float = 0.toFloat() - private val mColorMatrixFilter: ColorMatrixColorFilter - private val mMatrix: Matrix - private val mMatrixArray = floatArrayOf(0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 1.0f) - - private var mIsRTandLB: Boolean = false // 是否属于右上左下 - private val mMaxLength: Float = - Math.hypot(mScreenWidth.toDouble(), mScreenHeight.toDouble()).toFloat() - private var mBackShadowColors: IntArray? = null// 背面颜色组 - private var mFrontShadowColors: IntArray? = null// 前面颜色组 - private var mBackShadowDrawableLR: GradientDrawable? = null // 有阴影的GradientDrawable - private var mBackShadowDrawableRL: GradientDrawable? = null - private var mFolderShadowDrawableLR: GradientDrawable? = null - private var mFolderShadowDrawableRL: GradientDrawable? = null - - private var mFrontShadowDrawableHBT: GradientDrawable? = null - private var mFrontShadowDrawableHTB: GradientDrawable? = null - private var mFrontShadowDrawableVLR: GradientDrawable? = null - private var mFrontShadowDrawableVRL: GradientDrawable? = null - - private val mPaint: Paint = Paint() - - init { - - mPaint.style = Paint.Style.FILL - - createDrawable() - - val cm = ColorMatrix()//设置颜色数组 - val array = floatArrayOf(1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f) - cm.set(array) - mColorMatrixFilter = ColorMatrixColorFilter(cm) - mMatrix = Matrix() - - mTouchX = 0.01f // 不让x,y为0,否则在点计算时会有问题 - mTouchY = 0.01f - } - - override fun drawMove(canvas: Canvas) { - when (mDirection) { - Direction.NEXT -> { - calcPoints() - drawCurrentPageArea(canvas, mCurBitmap, mPath0) - drawNextPageAreaAndShadow(canvas, mNextBitmap) - drawCurrentPageShadow(canvas) - drawCurrentBackArea(canvas, mCurBitmap) - } - else -> { - calcPoints() - drawCurrentPageArea(canvas, mNextBitmap, mPath0) - drawNextPageAreaAndShadow(canvas, mCurBitmap) - drawCurrentPageShadow(canvas) - drawCurrentBackArea(canvas, mNextBitmap) - } - } - } - - override fun drawStatic(canvas: Canvas) { - if (isCancel) { - mNextBitmap = mCurBitmap.copy(Bitmap.Config.RGB_565, true) - canvas.drawBitmap(mCurBitmap, 0f, 0f, null) - } else { - canvas.drawBitmap(mNextBitmap, 0f, 0f, null) - } - } - - override fun startAnim() { - super.startAnim() - var dx: Int - val dy: Int - // dx 水平方向滑动的距离,负值会使滚动向左滚动 - // dy 垂直方向滑动的距离,负值会使滚动向上滚动 - if (isCancel) { - - if (mCornerX > 0 && mDirection == Direction.NEXT) { - dx = (mScreenWidth - mTouchX).toInt() - } else { - dx = -mTouchX.toInt() - } - - if (mDirection != Direction.NEXT) { - dx = (-(mScreenWidth + mTouchX)).toInt() - } - - if (mCornerY > 0) { - dy = (mScreenHeight - mTouchY).toInt() - } else { - dy = -mTouchY.toInt() // 防止mTouchY最终变为0 - } - } else { - if (mCornerX > 0 && mDirection == Direction.NEXT) { - dx = -(mScreenWidth + mTouchX).toInt() - } else { - dx = (mScreenWidth - mTouchX + mScreenWidth).toInt() - } - if (mCornerY > 0) { - dy = (mScreenHeight - mTouchY).toInt() - } else { - dy = (1 - mTouchY).toInt() // 防止mTouchY最终变为0 - } - } - mScroller.startScroll(mTouchX.toInt(), mTouchY.toInt(), dx, dy, 400) - } - - override fun setDirection(direction: PageAnimation.Direction) { - super.setDirection(direction) - - when (direction) { - Direction.PRE -> - //上一页滑动不出现对角 - if (mStartX > mScreenWidth / 2) { - calcCornerXY(mStartX, mScreenHeight.toFloat()) - } else { - calcCornerXY(mScreenWidth - mStartX, mScreenHeight.toFloat()) - } - Direction.NEXT -> if (mScreenWidth / 2 > mStartX) { - calcCornerXY(mScreenWidth - mStartX, mStartY) - } - } - } - - override fun setStartPoint(x: Float, y: Float) { - super.setStartPoint(x, y) - calcCornerXY(x, y) - } - - override fun setTouchPoint(x: Float, y: Float) { - super.setTouchPoint(x, y) - //触摸y中间位置吧y变成屏幕高度 - if (mStartY > mScreenHeight / 3 && mStartY < mScreenHeight * 2 / 3 || mDirection == Direction.PRE) { - mTouchY = mScreenHeight.toFloat() - } - - if (mStartY > mScreenHeight / 3 && mStartY < mScreenHeight / 2 && mDirection == Direction.NEXT) { - mTouchY = 1f - } - } - - /** - * 创建阴影的GradientDrawable - */ - private fun createDrawable() { - val color = intArrayOf(0x333333, -0x4fcccccd) - mFolderShadowDrawableRL = GradientDrawable( - GradientDrawable.Orientation.RIGHT_LEFT, color - ) - mFolderShadowDrawableRL!!.gradientType = GradientDrawable.LINEAR_GRADIENT - - mFolderShadowDrawableLR = GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, color - ) - mFolderShadowDrawableLR!!.gradientType = GradientDrawable.LINEAR_GRADIENT - - mBackShadowColors = intArrayOf(-0xeeeeef, 0x111111) - mBackShadowDrawableRL = GradientDrawable( - GradientDrawable.Orientation.RIGHT_LEFT, mBackShadowColors - ) - mBackShadowDrawableRL!!.gradientType = GradientDrawable.LINEAR_GRADIENT - - mBackShadowDrawableLR = GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, mBackShadowColors - ) - mBackShadowDrawableLR!!.gradientType = GradientDrawable.LINEAR_GRADIENT - - mFrontShadowColors = intArrayOf(-0x7feeeeef, 0x111111) - mFrontShadowDrawableVLR = GradientDrawable( - GradientDrawable.Orientation.LEFT_RIGHT, mFrontShadowColors - ) - mFrontShadowDrawableVLR!!.gradientType = GradientDrawable.LINEAR_GRADIENT - mFrontShadowDrawableVRL = GradientDrawable( - GradientDrawable.Orientation.RIGHT_LEFT, mFrontShadowColors - ) - mFrontShadowDrawableVRL!!.gradientType = GradientDrawable.LINEAR_GRADIENT - - mFrontShadowDrawableHTB = GradientDrawable( - GradientDrawable.Orientation.TOP_BOTTOM, mFrontShadowColors - ) - mFrontShadowDrawableHTB!!.gradientType = GradientDrawable.LINEAR_GRADIENT - - mFrontShadowDrawableHBT = GradientDrawable( - GradientDrawable.Orientation.BOTTOM_TOP, mFrontShadowColors - ) - mFrontShadowDrawableHBT!!.gradientType = GradientDrawable.LINEAR_GRADIENT - } - - /** - * 是否能够拖动过去 - * - * @return - */ - fun canDragOver(): Boolean { - return if (mTouchToCornerDis > mScreenWidth / 10) true else false - } - - fun right(): Boolean { - return if (mCornerX > -4) false else true - } - - /** - * 绘制翻起页背面 - * - * @param canvas - * @param bitmap - */ - private fun drawCurrentBackArea(canvas: Canvas, bitmap: Bitmap) { - val i = (mBezierStart1.x + mBezierControl1.x).toInt() / 2 - val f1 = Math.abs(i - mBezierControl1.x) - val i1 = (mBezierStart2.y + mBezierControl2.y).toInt() / 2 - val f2 = Math.abs(i1 - mBezierControl2.y) - val 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() - val mFolderShadowDrawable: GradientDrawable? - val left: Int - val right: Int - if (mIsRTandLB) { - left = (mBezierStart1.x - 1).toInt() - right = (mBezierStart1.x + f3 + 1f).toInt() - mFolderShadowDrawable = mFolderShadowDrawableLR - } else { - left = (mBezierStart1.x - f3 - 1f).toInt() - right = (mBezierStart1.x + 1).toInt() - mFolderShadowDrawable = mFolderShadowDrawableRL - } - canvas.save() - try { - canvas.clipPath(mPath0) - if (Build.VERSION.SDK_INT >= 28) { - canvas.clipPath(mPath1) - } else { - canvas.clipPath(mPath1, Region.Op.INTERSECT) - } - } catch (e: Exception) { - } - - mPaint.colorFilter = mColorMatrixFilter - //对Bitmap进行取色 - val color = bitmap.getPixel(1, 1) - //获取对应的三色 - val red = color and 0xff0000 shr 16 - val green = color and 0x00ff00 shr 8 - val blue = color and 0x0000ff - //转换成含有透明度的颜色 - val tempColor = Color.argb(200, red, green, blue) - - - val dis = Math.hypot( - (mCornerX - mBezierControl1.x).toDouble(), - (mBezierControl2.y - mCornerY).toDouble() - ).toFloat() - val f8 = (mCornerX - mBezierControl1.x) / dis - val f9 = (mBezierControl2.y - mCornerY) / dis - mMatrixArray[0] = 1 - 2f * f9 * f9 - mMatrixArray[1] = 2f * f8 * f9 - mMatrixArray[3] = mMatrixArray[1] - mMatrixArray[4] = 1 - 2f * 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.colorFilter = null - - canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y) - mFolderShadowDrawable!!.setBounds( - left, mBezierStart1.y.toInt(), right, - (mBezierStart1.y + mMaxLength).toInt() - ) - mFolderShadowDrawable.draw(canvas) - canvas.restore() - } - - /** - * 绘制翻起页的阴影 - * - * @param canvas - */ - fun drawCurrentPageShadow(canvas: Canvas) { - val degree: Double - if (mIsRTandLB) { - degree = Math.PI / 4 - Math.atan2( - (mBezierControl1.y - mTouchY).toDouble(), - (mTouchX - mBezierControl1.x).toDouble() - ) - } else { - degree = Math.PI / 4 - Math.atan2( - (mTouchY - mBezierControl1.y).toDouble(), - (mTouchX - mBezierControl1.x).toDouble() - ) - } - // 翻起页阴影顶点与touch点的距离 - val d1 = 25.toFloat().toDouble() * 1.414 * Math.cos(degree) - val d2 = 25.toFloat().toDouble() * 1.414 * Math.sin(degree) - val x = (mTouchX + d1).toFloat() - val y: Float - if (mIsRTandLB) { - y = (mTouchY + d2).toFloat() - } else { - y = (mTouchY - d2).toFloat() - } - mPath1.reset() - mPath1.moveTo(x, y) - mPath1.lineTo(mTouchX, mTouchY) - mPath1.lineTo(mBezierControl1.x, mBezierControl1.y) - mPath1.lineTo(mBezierStart1.x, mBezierStart1.y) - mPath1.close() - var rotateDegrees: Float - canvas.save() - try { - - if (Build.VERSION.SDK_INT >= 28) { - canvas.clipOutPath(mPath0) - canvas.clipPath(mPath1) - } else { - canvas.clipPath(mPath0, Region.Op.XOR) - canvas.clipPath(mPath1, Region.Op.INTERSECT) - - } - - } catch (e: Exception) { - // TODO: handle exception - } - - var leftx: Int - var rightx: Int - var mCurrentPageShadow: GradientDrawable? - if (mIsRTandLB) { - leftx = mBezierControl1.x.toInt() - rightx = mBezierControl1.x.toInt() + 25 - mCurrentPageShadow = mFrontShadowDrawableVLR - } else { - leftx = (mBezierControl1.x - 25).toInt() - rightx = mBezierControl1.x.toInt() + 1 - mCurrentPageShadow = mFrontShadowDrawableVRL - } - - rotateDegrees = Math.toDegrees( - Math.atan2( - (mTouchX - mBezierControl1.x).toDouble(), - (mBezierControl1.y - mTouchY).toDouble() - ) - ).toFloat() - canvas.rotate(rotateDegrees, mBezierControl1.x, mBezierControl1.y) - mCurrentPageShadow!!.setBounds( - leftx, - (mBezierControl1.y - mMaxLength).toInt(), rightx, - mBezierControl1.y.toInt() - ) - 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 >= 28) { - canvas.clipOutPath(mPath0) - canvas.clipPath(mPath1) - } else { - canvas.clipPath(mPath0, Region.Op.XOR) - canvas.clipPath(mPath1, Region.Op.INTERSECT) - } - } catch (e: Exception) { - } - - if (mIsRTandLB) { - leftx = mBezierControl2.y.toInt() - rightx = (mBezierControl2.y + 25).toInt() - mCurrentPageShadow = mFrontShadowDrawableHTB - } else { - leftx = (mBezierControl2.y - 25).toInt() - rightx = (mBezierControl2.y + 1).toInt() - mCurrentPageShadow = mFrontShadowDrawableHBT - } - rotateDegrees = Math.toDegrees( - atan2( - (mBezierControl2.y - mTouchY).toDouble(), - (mBezierControl2.x - mTouchX).toDouble() - ) - ).toFloat() - canvas.rotate(rotateDegrees, mBezierControl2.x, mBezierControl2.y) - val temp: Float - if (mBezierControl2.y < 0) - temp = mBezierControl2.y - mScreenHeight - else - temp = mBezierControl2.y - - val hmg = hypot(mBezierControl2.x.toDouble(), temp.toDouble()).toInt() - if (hmg > mMaxLength) - mCurrentPageShadow!! - .setBounds( - (mBezierControl2.x - 25).toInt() - hmg, leftx, - (mBezierControl2.x + mMaxLength).toInt() - hmg, - rightx - ) - else - mCurrentPageShadow!!.setBounds( - (mBezierControl2.x - mMaxLength).toInt(), leftx, - mBezierControl2.x.toInt(), rightx - ) - - mCurrentPageShadow.draw(canvas) - canvas.restore() - } - - private fun 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.toFloat(), mCornerY.toFloat()) - mPath1.close() - - mDegrees = Math.toDegrees( - Math.atan2( - (mBezierControl1.x - mCornerX).toDouble(), - (mBezierControl2.y - mCornerY).toDouble() - ) - ).toFloat() - val leftx: Int - val rightx: Int - val mBackShadowDrawable: GradientDrawable? - if (mIsRTandLB) { //左下及右上 - leftx = mBezierStart1.x.toInt() - rightx = (mBezierStart1.x + mTouchToCornerDis / 4).toInt() - mBackShadowDrawable = mBackShadowDrawableLR - } else { - leftx = (mBezierStart1.x - mTouchToCornerDis / 4).toInt() - rightx = mBezierStart1.x.toInt() - mBackShadowDrawable = mBackShadowDrawableRL - } - canvas.save() - try { - - if (Build.VERSION.SDK_INT >= 28) { - canvas.clipPath(mPath0) - canvas.clipPath(mPath1) - } else { - canvas.clipPath(mPath0) - canvas.clipPath(mPath1, Region.Op.INTERSECT) - } - } catch (e: Exception) { - } - - - canvas.drawBitmap(bitmap, 0f, 0f, null) - canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y) - mBackShadowDrawable!!.setBounds( - leftx, mBezierStart1.y.toInt(), rightx, - (mMaxLength + mBezierStart1.y).toInt() - )//左上及右下角的xy坐标值,构成一个矩形 - mBackShadowDrawable.draw(canvas) - canvas.restore() - } - - private fun 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.toFloat(), mCornerY.toFloat()) - mPath0.close() - - canvas.save() - // if(Build.VERSION.SDK_INT >= 28){ - // canvas.clipOutPath(path); - // }else { - // canvas.clipPath(path, Region.Op.XOR); - // } - canvas.drawBitmap(bitmap, 0f, 0f, null) - try { - canvas.restore() - } catch (e: Exception) { - - } - - } - - /** - * 计算拖拽点对应的拖拽脚 - * - * @param x - * @param y - */ - fun calcCornerXY(x: Float, y: Float) { - 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 fun calcPoints() { - mMiddleX = (mTouchX + mCornerX) / 2 - mMiddleY = (mTouchY + mCornerY) / 2 - mBezierControl1.x = - mMiddleX - (mCornerY - mMiddleY) * (mCornerY - mMiddleY) / (mCornerX - mMiddleX) - mBezierControl1.y = mCornerY.toFloat() - mBezierControl2.x = mCornerX.toFloat() - - val f4 = mCornerY - mMiddleY - if (f4 == 0f) { - 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.toFloat() - - // 当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 - - val f1 = Math.abs(mCornerX - mTouchX) - val f2 = mScreenWidth * f1 / mBezierStart1.x - mTouchX = Math.abs(mCornerX - f2) - - val 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.toFloat() - - mBezierControl2.x = mCornerX.toFloat() - - val f5 = mCornerY - mMiddleY - if (f5 == 0f) { - 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.toFloat() - mBezierStart2.y = mBezierControl2.y - (mCornerY - mBezierControl2.y) / 2 - - mTouchToCornerDis = Math.hypot( - (mTouchX - mCornerX).toDouble(), - (mTouchY - mCornerY).toDouble() - ).toFloat() - - mBezierEnd1 = getCross( - PointF(mTouchX, mTouchY), mBezierControl1, mBezierStart1, - mBezierStart2 - ) - mBezierEnd2 = getCross( - 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 - */ - fun getCross(P1: PointF, P2: PointF, P3: PointF, P4: PointF): PointF { - val CrossP = PointF() - // 二元函数通式: y=ax+b - val a1 = (P2.y - P1.y) / (P2.x - P1.x) - val b1 = (P1.x * P2.y - P2.x * P1.y) / (P1.x - P2.x) - - val a2 = (P4.y - P3.y) / (P4.x - P3.x) - val 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 - } - - companion object { - private val TAG = "SimulationPageAnim" - } -} \ No newline at end of file diff --git a/app/src/main/java/com/novel/read/widget/page/anim/SlidePageAnim.kt b/app/src/main/java/com/novel/read/widget/page/anim/SlidePageAnim.kt deleted file mode 100644 index 355f3e7..0000000 --- a/app/src/main/java/com/novel/read/widget/page/anim/SlidePageAnim.kt +++ /dev/null @@ -1,92 +0,0 @@ -package com.novel.read.widget.page.anim - -import android.graphics.Canvas -import android.graphics.Rect -import android.view.View -import com.novel.read.widget.page.PageAnimation - -/** - * Created by zlj - */ - -class SlidePageAnim(w: Int, h: Int, view: View, listener: OnPageChangeListener) : - HorizonPageAnim(w, h, view, listener) { - - private val mSrcRect: Rect = Rect(0, 0, mViewWidth, mViewHeight) - private val mDestRect: Rect = Rect(0, 0, mViewWidth, mViewHeight) - private val mNextSrcRect: Rect = Rect(0, 0, mViewWidth, mViewHeight) - private val mNextDestRect: Rect = Rect(0, 0, mViewWidth, mViewHeight) - - override fun drawStatic(canvas: Canvas) { - if (isCancel) { - canvas.drawBitmap(mCurBitmap, 0f, 0f, null) - } else { - canvas.drawBitmap(mNextBitmap, 0f, 0f, null) - } - } - - override fun drawMove(canvas: Canvas) { - var dis: Int - when (mDirection) { - Direction.NEXT -> { - //左半边的剩余区域 - dis = (mScreenWidth - mStartX + mTouchX).toInt() - 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) - } - else -> { - dis = (mTouchX - mStartX).toInt() - 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) - } - } - } - - override fun startAnim() { - super.startAnim() - val dx: Int - when (mDirection) { - Direction.NEXT -> if (isCancel) { - var dis = (mScreenWidth - mStartX + mTouchX).toInt() - if (dis > mScreenWidth) { - dis = mScreenWidth - } - dx = mScreenWidth - dis - } else { - dx = (-(mTouchX + (mScreenWidth - mStartX))).toInt() - } - else -> if (isCancel) { - dx = (-Math.abs(mTouchX - mStartX)).toInt() - } else { - dx = (mScreenWidth - (mTouchX - mStartX)).toInt() - } - } - //滑动速度保持一致 - val duration = 400 * Math.abs(dx) / mScreenWidth - mScroller.startScroll(mTouchX.toInt(), 0, dx, 0, duration) - } -} diff --git a/app/src/main/res/anim/anim_readbook_bottom_in.xml b/app/src/main/res/anim/anim_readbook_bottom_in.xml new file mode 100644 index 0000000..48fe0c0 --- /dev/null +++ b/app/src/main/res/anim/anim_readbook_bottom_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/anim_readbook_bottom_out.xml b/app/src/main/res/anim/anim_readbook_bottom_out.xml new file mode 100644 index 0000000..2e91beb --- /dev/null +++ b/app/src/main/res/anim/anim_readbook_bottom_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/anim_readbook_top_in.xml b/app/src/main/res/anim/anim_readbook_top_in.xml new file mode 100644 index 0000000..e36360b --- /dev/null +++ b/app/src/main/res/anim/anim_readbook_top_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/anim_readbook_top_out.xml b/app/src/main/res/anim/anim_readbook_top_out.xml new file mode 100644 index 0000000..0b8acbc --- /dev/null +++ b/app/src/main/res/anim/anim_readbook_top_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_bottom_in.xml b/app/src/main/res/anim/slide_bottom_in.xml deleted file mode 100644 index 1dd6c09..0000000 --- a/app/src/main/res/anim/slide_bottom_in.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_bottom_out.xml b/app/src/main/res/anim/slide_bottom_out.xml deleted file mode 100644 index d333fb7..0000000 --- a/app/src/main/res/anim/slide_bottom_out.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_left_in.xml b/app/src/main/res/anim/slide_left_in.xml deleted file mode 100644 index 842a616..0000000 --- a/app/src/main/res/anim/slide_left_in.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_left_out.xml b/app/src/main/res/anim/slide_left_out.xml deleted file mode 100644 index d9c3bd9..0000000 --- a/app/src/main/res/anim/slide_left_out.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_right_in.xml b/app/src/main/res/anim/slide_right_in.xml deleted file mode 100644 index c3ccec1..0000000 --- a/app/src/main/res/anim/slide_right_in.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_right_out.xml b/app/src/main/res/anim/slide_right_out.xml deleted file mode 100644 index 77ee771..0000000 --- a/app/src/main/res/anim/slide_right_out.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_top_in.xml b/app/src/main/res/anim/slide_top_in.xml deleted file mode 100644 index 177e700..0000000 --- a/app/src/main/res/anim/slide_top_in.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/slide_top_out.xml b/app/src/main/res/anim/slide_top_out.xml deleted file mode 100644 index 7b51c98..0000000 --- a/app/src/main/res/anim/slide_top_out.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_back.png b/app/src/main/res/drawable-night-xxhdpi/ic_back.png deleted file mode 100644 index 8ba8d4a752e6dfdc4b854535c8962bbdb3be7865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D%zojhF}Ln;{G z-i+otDV51X#7yL>zBm~iF-5p~&%?N&dTotFqI#v9+dm8c-#z`)3YNi?ow z@zPwpcHOLBp~k{}m$V&b9qu}!mM*CvIVt4cLyNGyC89FUyRzQ$8pWDClDTv+;_w5O z<+5|$7vwS7u*qM{Uzu2RKrl%6z{-;^EG!t$#cmDWAFtz>o@KMk$;`OGXQ9x8kc2lM zoL|fE#P3%%-M4M+fsKMIk1Q)J`+M%KeCe{2iQQ}Gu4h}aXMaK;`y_7`$t4WOy%l!4 zOpu=N>E4=M(jIz(DHE7v^i36RCeNEwzq77m%I89U54{T$q_;~?R#~B;r}eDn%Nu94 zh8Jw*U%oFrC#q8LEO?^>Q+nUy_3A1GGA%s}OdJXg7=*NF1=BY7MG4#I@8SRkErX}4 KpUXO@geCwA_>)lp diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_edit.png b/app/src/main/res/drawable-night-xxhdpi/ic_edit.png deleted file mode 100644 index 73765cc7dd4a5f76bac4c6d968a04990e874e8ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D%zpLn`BhEy=V zy&af$$bg3}VMZC(z4DEB6V#u`?J4d%>-cxIN3V23U-Du3l|@gR9@pqPX+14?uz-P8 z!-0`2pn*wbfrImd8z*vu_8Xa&j(W_`ZPq-x@e_ANeD+-2UIR;%=0 zwaB>6&uKg@W4q35uS-GP?7F`d61NHEPD>4Ty>;`jK!} zsP>5mM9J_kxMH!m@zUcSmMYFUfexDsQtp*b**ddl>!LRiB2$bm=aogSfBGyjvP8`< zvgc{kweF**U77z@Ywf#xUu_aJySQ%3FQ_Wft+C@skLzR!N|>M~pfbfn zft4+j$pzCRBl|DeC7$H~Mm~e5 LtDnm{r-UW|Il}4y diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_menu_mode_night_normal.png b/app/src/main/res/drawable-night-xxhdpi/ic_menu_mode_night_normal.png deleted file mode 100644 index 3847e088dc8d00b48bc6e8a4050637b11c63a2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2608 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 diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_theme.png b/app/src/main/res/drawable-night-xxhdpi/ic_theme.png deleted file mode 100644 index c7c2fdad4a060e8dafbec9025cc9213b44a05f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1842 zcmV-22hI42P)Px*>`6pHRCodHTzhO3MHruN@7i9a55yvZfc^nBQA~`{5FTo@F@~4`O2iPw#038^ z(HgzG-mA)L?|LmG1Lpv*v-fieT7$^fVYyhZPvP17S=34?nW zkaL8QzX8}^1mGu4BL`;Bs5{u)+&p|OF)KxoFA(iwguNmn00;~c!gd4EzJh7)9UB6H zq)6APa?L46PWWMjTrl&45rc?{k_3mi{>7gTx zvFl|610a+U*jx!(I35q5leLr8Q;HxC+8c~{38M+w04C^N1P#{LR4sW=*B>04P@dPV zQm+_~q}DV4Z2&lCBdV#4vbP4(-yaMFqDyVqPimqZLAt(rgfa5rq-Z4y@%3DQ&8OEF zYI{~f-BLw4f;eI~aeu=57EAO(1y;c*+3X9py&+VQ6e!mRWpMj~(LLB29?Cr1z2fV- zrN+~^j<-xZK9p=hJP>@%`s@UhZG$AQO{Na-()B)fwoK+(S%Po|{ew&Zaysncke!~^jL+W5?RYOXS3pSOENtam(^FAAPgdpxsaFw zBz~Pg9J^braYdpyK~Q@Is&jWZh0v(MHpqBXn;^y-WP-4#!os!|^z>{XalqAR-YQG&zRv~UJ`*VT)DWv zQ;Hx1#uC^kcnU{^$TQ3mNt7YTABwi%O8W^B&_b4Dy}~u05(MF%{0amqoq}+hEZjk< z5&0}SL6~;93&CyUD{K+SLYFfpPVE*A6c5@PjxD1G?c;|M3QdB!e0KcFQ;@ct#VrA>zWay>+jYK zq%XdlOs9N!a;#1Ss3_$?{t(q$aDsTgWt7mT22$rEg-(Epg0w2fS1fmeT0-s14Msb0 z<7^E7;`?zZ+`~LoeF@!v)~Z5(>xTJsY;-v$$Cr;#x&$|pT~;>5mD3+Z^$S}NrN;Yc zbkpUn%>_6NKSxr-%o~gzMZ(Tt@MrO00FuQ9QD+7Yl{2wy7T(XKqr>AJ?`2z2-HMb$ zYVNGM{UR_zf^ge6g~4apVS0&?d004)OK@^GL5_pouxRXkk<}+LI%2cF^4*s!^Pw`BX zYCRmY)DmFt-rj*F_cfiyso+Xg0=0t!hxH+FX^*tGd5_83OA*AK?d$J7w0LRLb$E+w zt5W=7)=+b;NyH<)xuBPN#WD_St0R2RYG>xTl&&}$N4nzS?YUyki6C7E3Jsp836O)i zR#Z%Ve%e0K5wW!?kP|^X$b{cNSV7!PSn0RL3|hKwfNlI!1Zn*&MeNk={dE0{%7OHs zAK-%i8G9ZIZ3PB?=NjA?Z?*I7+5g~d6O{3Q$@le`U)D3vDqOL3UvO!#rn5b=J6}9` z6T|_ugkw#(eX|MkLG$wkT-Rlm0F!ojS1Z66WM51$s4fZ^yZr5RIc6z4VsVnv~{2vc+V!Dx-lTP`~_ERu|G8OSx z@A%2&DgtyF26R96Q*$%2T(1cB324w+N0R8Hcg8{O$(m$M52W`&ZfZl%LBClo=>9 gP-dXaK$(I607iHclD}$*m;e9(07*qoM6N<$f)8$Q`2YX_ diff --git a/app/src/main/res/drawable-xxhdpi/cover_default.png b/app/src/main/res/drawable-xxhdpi/cover_default.png deleted file mode 100644 index f81b9d7c4bbaee482a91147e18edda9f181be8c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1926 zcmb`|`9Bo+1IO{t2;-)N+(eAjtVVLTL#k1OTwz_4Yu2)jFphC$98)1u8W}m-F=}&+ z9Z`gkvB<1Z&Os=R-1j-y{r>d*X@A?F-mib){dnHJW_wv&L_q`qAa0Gaa`Bn>Tvi;q?j^H}FZ8+8={siyg#RKDE4w-7W zEbI2{wKRVZ6#m#r`-$x-H>b=3bl|10c0eLA49Tz?tdN5y3R$V~9lnF)KQ8qjC4T?J zKwL}EoW!7PVt|eVehz0tW;lYKlOqZ}p8yc#@FAQ(J}-x)$byh;ocMDS?wE*ObN|v0 zX8DJFVWlN--7GrGn5jmMVyDo56@{^t_!A*uKl@d2_i$dIfkfN4qy?MW`to%^ zPTbq|a|vRjPzhv&|IEAo{ORSZwThAmMvBm$o@)~#)lkLh?CD}T_i0`1Fc02NhQE5_ zQ$tgH{}3urx!vkL=g2x}z!077SqiJT`aD@e=ry~(xL>P{#>$sHmHBeB(m&IbA>X?a zzJaCAuE&#ZE3N~6ijtw*-rD-JO>_n>GydZffdZAyA6(@JlqI{-YT5Y^mN7TIiaE1T z=IWVkwz5E_7^et1?AbB&8z+jah4o%MDmAMaoT?M z(@SGoh74RR@7c5hY_19WWp~Ksm;1rFRgK;<0vn#i>g-UlkYxgGX0%N*-$3^d6bZ4CGq$DLGl|lyrO0 z*lc)hwO(b7fe5Wixri`XlNxSr{?zjSH(xstJ6XZx2u!{hg-adcX!d+`S!y}5v_V<4 zS&Ltf5CNU!zUB&ktz9LcWdwj#mB41?c532+B|s&S@$unhyDDIsps~{o0p>#xJ!`lM zvJEc`ZiO=qMZ)De)AlSvW8%`(ftA9RfMxZVBP2(eZj__v5WRQjx0ZN}HxdMob48jq|32DKmsed^Vx3I+VeT>_te z^%plAY7K{%VGo)4*+!1#QfBlse*0a}w{%khRK&joY;N8A$n|A6rc_Ym+oKqy@%rx2 zcf3iheNFDJ@F;9QH0-)(3LS*x@a^dXMCCn{m!oq8o#*zoV#U0% z_R4!cs^C%s!T~I?sDj{9%BT}Of^1tQA6u{oaHt5FcYJ>5C zs>!ucyFRG>-tExd*axq77h%&~qN63xV4nGOz98cI+wBm=g-$crGKpV0KL~VYib}qg1fG+7Ejizt z+qA)k=DqU^8~De=6O{2GTp6t#mivI0MFYG@1?yWL;>iO|sh8KEuOzg~6=JV?F&)A3 zR1?htV4}8@Oy%O=?i3N`3lG!vw;Y(J`x9qL(*ve@f@ZogA|P4S4-ifcyrUDO){vLM zR&nEBY|dild|1*}Ye0b#SPUz%;Y0rU$AXvnS4%$RUNALln6F{x&dV7VH5TH?3yH(o ntgHV-l>RR@`ghufs|OOmETWW1iN8tuAF$RJZLKOSF~q+CTDfR5 diff --git a/app/src/main/res/drawable-xxhdpi/ic_back.png b/app/src/main/res/drawable-xxhdpi/ic_back.png deleted file mode 100644 index e15f8e7e57879b71497431f2638a9d81bc1d47ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D%z{XJbALn;{G z-gL}5?7-9d@ItNM1he$3mb15nXUe zVcK}1$*9vw;mYryXJv%B8!z0jSa(xdMZjzEn(TAEeHUI`*EoIN{OtVYTyGEVYzTh8 z;Ev@3j>O72Hf+y1eVFb}eSd1AVAR%f&(MRJ4F?$AnOs|{t`-)(_x>z@^t;;@r`0Ad zV42K~ib#+1%wO;;XNWN~ZGcki!#@=JWl#(WcpO$Yj%r;ap)loj@-*8dMFA;k&EqbL0z>% diff --git a/app/src/main/res/drawable-xxhdpi/ic_book_add.png b/app/src/main/res/drawable-xxhdpi/ic_book_add.png deleted file mode 100644 index 0b0962abb32cfdd4d7bf19809a02ef71c5fcebd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8297 zcmbVycQl+^_y5dfk}xSc(R=R%AzBjM1W`hCAyE<}dN+DR1W}_CHCiG>FOecd7eN>! zLG+Q)8N=^Pa_{@S>wWKUt-J0YmS;WAv-duq&pvyf^EsmRbkxrv7!VK$)QOXeuVerbao(`>s@CxJz)NLnD!$iLogo_>73p+P?uXB>k8wFoofjRd(LaJy zP>>WQkaJyjx)iPPAiVwfF|`BU!z<>USi-Ae3_a$?wqO4)cB-jqJ~Oa2Mx<${XC-q! zARFB&>2AMsq4NwBPOgE>HPMm3=$+bTMU4#|YUq6{AG}uiz0c+grlFY0De!f$pGCmW zMVfPX{2gy!vq3k}Wak}y|JaG6=^VPYh1DaEIO8lAo0;kkf@ZPDsM8*vagUqiVEjKqIThWe(5zcZo1>w!h(L-qjAjs-LAE!SXS1? ziruR0kx;UeQ?~mv=((r7*PDblHn8$Eg%hTQcxKOo*6HgRjIK_W)aL8TFKQbSR%Ir3 zxp$|B12qy1EG zLx=F*!Bii@sM^Nm*0)3Fw5{>O#oC{5ijA!&*F;B7TJ1_V4O!&kcOF-2d2daY;|Key zl5)`gX1Lg?w585swC&fuS~u@3Pla{J9BT{u|^hWf4Rhp_`WdbN_43>jK8c6^Tp&9NMG^8Ej}oD)_vuua z`{1=a+iAduRCDVWqtGx?PDPlPk!?<`%nTa~qYImg%Q|YDTAG?9XId-!KcV&dnr6_t z+eLDe-!DT#N@+_F!^d(&9y=wed#{L)T}vvG!<;@FA_Tv%m!+CcLJ2j4QS+GX-L4_A zV^_B6=C}%vMhQa^i4_5ortoU=T(MgTJfSM>DUgV+>#g*{up1D4s3r@!nzc|O1hlAHK4LnWe#k%`$R{(eUr1#b@ zGAJ-}qLdRM5v7`uUU2dUJjyl?)pS8h4sa>kI6cW@CXUlf%O4yThmo8IPw93J>W~lz z7?(NTq5n#u%$BYk7;>uyvH)m*bV{r$6GsPmtIl=_`XgCej6WPuM1YOt zF>Q2jy&VXJz;FO9=Kkz#3gz5OsE*H&E0QphcT~Az?_U+$!^s^0N>c3uz&;Mnhs3Qc z(nH}4;OUImc@VBV6k#Cm@23U{IRT!Io$e)JBiBXscmMu29R6&06;kgdmj!CrQObrOu75O4 zQIIYH3BK_vTM&kqC`T5JYr zp#`)|ynqw!eWo)}TOxwf-V6YL8cYg7DZ3H9n`@B(@0Y5y7Ii_28o`kKv*{%5m_)vkEVxqh%zfx@LSBgy# zQ!Ig)V*iN0znh<48poSqVUYBvK+-##{Ia)nN{G{wNWQft0KBIS4pC;4C3+X(h6C^H z;PF)HKqLfq?Kp7#ix@VLFo-|i@gcA6Eiw_Yp)QI?ID-r`0)YIZVg22|Q^eX**76t$ zTYNUayfBrD1Jt9SkbS+!zH|G|4woPy8nDcR$N!U`|8#zQ$b{)dS|~jII3KcCTIiR( zt>Y;PjYRUrL;>JGtY8qf_)OrPJCza!yc1VjgrUO~NJt6M^)F(`DRagCd`DeWa^Ufp zhz-I(BSIRiAOWy~{>iX*`?=pKB38vzMcl~f0?da#ky3#5(WV^8*V*hwkgfqa&jr;9 zQvaX){5$^sZhq878b3W^Ah2FQ%5BCJqP>uP*e4A%k^D3|0QiO|6hf|{1H3=cCWQj; z8sPEIbqZYn+qL^QOMLp3+wT-fGk!eUUJW;mFheiapSd-WWzf?UTj;ut~bU zk8b8w%M*`0_6bMV@gB4N+T@-e$ty1<$r`9q&jiG610#Nme~$Nk()t z(4=l`xnCN*Z#JJbQP44C-YHvaBtw<#B!0K-68|Ikd+$p6bsUrK%-_-TKs0gdg47 zh|E?pP)I#uf5E25+AR*MdTO|++J>-qDPr)Jz-6-l!o7V=e!e6Jr?Y$F>lV$7w#gm+ z6zo-+=kpWHbvYbT9J4(#26RO|QI~c<(db=j)VL@)VZ`-%@&3db{UYw2%Tn1u@O;_Y z22H1H>Bh1Bm>xx%5@Q}(I5Rh|vW=Dq_Y9eaKVR!P^XJ)>hS0GKhb$*o^7L#xu#_|< z+8)6sO1h!5XSoD4v_O@Da)tn`D3&>D+7R(UyFVG4p@O9kymQkeH-EZ(}bC^BkN=g<@9 z(EoFx=IrqIdOqZE(pE=SS?N8meT9dP3||&M_gy69ZD(vR9cB$ze5zJC4%_H{ z$(ZR-8F{ws9-WiuB9FFesr0(-w(V#a;ncD;c7vh>^o)9o{g1;k7dNnE0kcLnrnOUO zw4#CN%IhXo(pIG$c8XHE0n4{1x7wKf9DK=ql4VMSd~Vo@>b1nP?s|NS>yN{ZS+I2P zigu6l+R7d?@!7oUE#&N+gif}S#~|ZRPFXS=rkBP%OkZNd zylzeuh+Tc;_l|jw3Vo>i`R6ZBMsIaPdgMJ0eVEtdEvAA{&4$cm2Wz=ri#Ti z=L(PNjHXJem#oyZzXPt`QF%D|jJ!`gl;ggV3eR*BTUZ;hTDE(ynilr3@D)o0f0p@a z>S#sIZALl6r-w1TCx=Y@xLxOZQ!Epu^g-z=Op4{ciOUHb&Uq(lbyJEqM_{^&e8+3D zngVRyo(N?1Y|&9z=4jS;MU-|?E3TYLJoN|_3jDHZKZzYh&YX1P23w+g49@-&^{@NAnqU*OP#raw+waS_EYyGc@Y3S-xG2iAO%owZT|`|yKozD`GhozZ=9lhs zK@IBK`)%@ENNR&)rL8H?WPNs#U}FDh@>BrimU(;e-MZ?OhIF#b>IYW5+@O~wKCui^ z51NqYs2SH<^y=j0@@%kGl<-CumYGlMJDqZC(CJo;?QruZg# z_@;Zu)w9@kAr?jv(Y|vh;?vs&_EX-EYy?<)!-is-29)3#U#r)WT)c3UK{4FzU27)m zAwgThF^sU@^H-H2cv3d9!Q&B*B<1(3p7Ve0r}t*Pt0aU99OJ$&7{Q+skc+vQ-T&dZ z3C~bCK_%@ZHoW7!*vPK&=bTE}Bt|9o7bjQ3ga#S-k%J5Pi(go0`j%V^Z&AX=bT9k< zROCa3nZ*WPC3re)ja|$O%Y|%TN^yua-(!wd9K*ds7!1qko_J=eHdFFi>5XegW*R}_ zLa#!ELQ%MWW&d5=j|WL)E1Yj+JU+1)9787k$lqrv;Td0i9ho2(qnBUVl6hx^jcS9J%1Z*EgD8N9Z@88?LM7b_S|F(s^r1aj?0 zy6}Ttzj(SQJWxojZL@T7?4|C~EzlbHnB_X}bLHJbMuY~ME*6P#Cy@niefSpMAx?wX zb}Y>3NYYc>9ARAJp?+Md_d-_?Oms6t6A>w-VKliC1u#v5=_yj;*Kpkd8mz^NZst z&p11EbX-6i>Zeim#vXD9tLEXx8*p>;KSOc5e%7Bpf!(}th6{&ofD=c{*b00ie4{TJ zL&~ep+rA^%T;{1dyl?on=VyihAyt%Mo{ewN7aB26-YAx+FBH&QxUAjc89>nUe&DqX0$g{bB+p>Y;hR$8d zLn|+We5GKLlK4xV;`(R#b1b7le5~VF`8&Z8LSOnsoT}=ga7*$*+xo=GVA?y|q#yNY z7Aso47@km-^ox&dbUUwu8c4?t^$p?mIOhg?I7ccprtq@aexqFT)aMAtA;J(Q9wwK0 zG0*kJ!JBwp+pXhJ*ZDKhE@G`w&wkDamZRwMJ!~<3M5bDaMA^#FgGjy;;MjQvl{6$E zhuJJRe2DYX5-((msawCz->Gqz0PqeQmR3(9PREYdOF;7~Julvr&dX7K<@hSMAEM z%f7zx%^}hf*>VVh);{Ol`3|B-iH|`b=^*K^S>%tW$r@H$YI&S?rAv(jR~$O zJKQgNSte$X6zS7dQ0?Sk+2Ax9JmTl=jYoRhjC<8Bq{rb6NYgGvQeW`Bd@%7fOu{`Y zk+lr5UMD-KFnfm^H&WK|uGuZx-toatkH>Q*hsYgfD&q%u!A7a;N8F3tWL}QQGXmHRt zj4jIvHcm*-rZ?6J^6U!UeJRW!)P_uk_#+LH`wrhM9K;-{5OzF|%5@|xQ1#m(~Gn!XLrtag0k zTY7Yeq&B(z7m08<@c`We-bC^XeNTJ&*b7Ve`KEg^dBN3GE;zPlX zC_;#fHcV6>v50#39@>WaEHb&I)9F0Gd#sQD2U=|;{*05N_HxA+zp~mXr;55F2DMU! z?2g_gT=`e~TC8}5ze>MC`Fv~Ha@^yEfkDxW4RY@nxWd03Efbq${-g0{04VrB4 znw`zZqK2NrrE5)RTBEY(TH>}Qou0maeA10v%=^RdTA0!26j%dRj{BO`^9Fiuw4O%!$?g|JL0&G^Q-i?14!)n zfOID282+fe1{}bP6y81}3povrrSv?p@f2xZ#3Py`EAI?AcN!A+wAa$~uhQOUw^qqb zH?H)M!GBwNmE^sMU3@O~pH_~Ibem#c3%W2&a{8?bB%}uZykmAg*}&uv5pPI~e2~rh z8Y&S(`>HRELc<&^NuN*>GH47?^I~q;_mFUjfVLxlDLe|L3e>#!<&wAIlytdb+}Ug$ zSK9M|ns@UHy(BCegiEPQ{*4{jiYqYbk+W4}V~1LN?rnA>oeR?=S8fO57*o|TIQhp* zxr#}kr7~5kJ|a0sF+E$CpdyKcyMZm}T$1oj)%FL#rba$J4@?#aLvG!)FFCA1p|Il` zJWUmn3AS0Xw_;2v#5j~~B%U}#Ml0(8JTt3R%YiK*NS&83kBo-Ex=6*U%-#6e+2B1y zQEo340wI}Y2gLf$M)OgKfz64l!Q$-~;2pr5Q&%M##SbP|>LF!mt^qz0S&MP1PZmtPhvoU{Erm#7a2~TsJ+F>Q*gtIfE?uf-ys9+l3h;3D6;_U z552^TM*u&Xc} z^;cOY3LFdmB#gK1>Mtt(5;7mMXsFkk;^XfQ_<#~>05bcZke`z*`3t1Kh>Jvh0sZN>L+%ycMkwzIzf#8E?@tbd{E4^Ip5w&1G?USl(oO8 zsw|+mrmAQEA`C2?f0wU+Lw>;ZzF&)akys-9WZ6030My^|V%TqeP1Y{v94IiLM*O>c z{hMN?XJzeZSAUuc3V%XeIkWngmH(o$f!y?+`?J6#V*da6`l3WExiF)j^KL#!kWvah zbfcfpema`-5SQO!STh;zcl_54oF+*LN!G-0zu+P6dxv4Yt%BfBa^kI2lk$!F3bc+X z78TrFB33(rUBx2gm5CQxLVDC#4&z4WQ)njqTr5`h$mg1k>BZ$KCU>U0#4D%;#6sp! z?Uty3{tn?2Z_HAO^EI2soyXsO{FD6)Eff5Sw^Erf_rfOQCUvWO5&jJx*bGmr7(}9L z0A}1J$EzZ!mJbcoh~4x*E(x!lD(UNSQS2n3@uLk^9#a=ZRw{>oD%+!F zmeYRLG1BhH&|$B>#`F(4zbV$H2tet^7fxJoVV$2EkS$pA#t$Dm>XZs*!RII%Wp3ZZ zesFy;>F)Nq$Pk*y`|ExHUqj|F?qD!feuO`mjt!m+=5`KPNQvGb>>a9=C26sd}n_K7nW_~lD^F4FVZ{|1cuu_viJL6NEfB`B{hygM{ zag&HC$P{D>iX&hOisKhM2Tcd&0b_w)ab0QC+V_Evz*FEHa3-|%7(i=*EuoGZTyH0^ zJj7=xpz*+EAhdo+Ut{ac0gm`K5<0*ez$oYJA+Qm6@9VtI_T7PXz)0suuiF4$pCN#T z0(YIG@4ztNg|FiV+4lt=0bQIw!Mf$+I|R@|V83&65}4uRunD%Bq^CH)OMtyTeFy=x z8rbHX>;o42IBbHg`nbsXT?1_Q=|c!0IoWD}@-Z8r0tp%*1N5JO%|QifFhB-~B>(31 znZFbmhP}du$3UN|dvAc@z?TgB$8DlWdNkONAXX~k_TvJ&cGD&9n5HFK@PZC!0|Ew>gMJT{Z`6vU@-6`V*ovY zXF%7gdp`iZa&I&2^=j!At3>EB(W*j!;8Pg@sgDzY({9i=fepa;}jH#l4xPAXAVjD2{+BD2`u}bI_1F z?A0rPt?bA7AWIIAHs`Jbit5|4`~k+fwtd=74v_ZA_V|pz!!|GAt<^+wfI7J-ytl`| zTVtwpmid4JS)Y;|AfL`R!qx!U-+Y|TOhIK-P(8kbigct&T)BxYOL7XT*LP46AT8^T z2DE}%U6KP-&+nijNLdL|$pNa@cTf?WcYt<0w2_#!f{F&x==;ejsL=q5{28D!{>>LX z)kfYo1(|~4^kxc5O+jT&Bwq#W@DXH4j-tL+cRMF%0VNWoTuxLSm(Z~Z9iM1*2?3;d zM;R3=-`okBthAF>ccPAlTGhMgPIj5t!uL!4N?5G0o-w`1)&>{a?2ua@Ds3p@8H^PiJ!pP916)WF??uncgJ^ken%D zQ6Vg^kY2kkIVOSEfxem0xTRKncseZ#~aI25ho_9Xp*a> z36L=Jns9|z{@^FYrm_;0|HYk-O=_+5LIwYaFgl5=Ye_|OQ`2GKtI`AG>#KHa>67jI zHq;_&1+}7ET3*pyu|BloIU;la@9_lTv$`9wGD!KY6eZmXK3RWB+#0cZKiP=9#LXxL zydBU__FtZo11I|lsQoM`F054aG`9_`0Xoe^-sH92{_hCd|Cb}roZ#GpC5{byyXx&R z`r4u`MZaYe3d;7q^!*!8kP&m~8o!+U#gl;Zl)Rsa#iNGSypnx1lU?q?%1#Y7GCx$RzUlbA3}f1F6ghFw zw#*pTh4X*NSFhXq`}b`f_8hhx)_fO_zDy1e4_~Mz`!hxtAgIY|Xth64S)JC?_nr9~ zq|s`TSCQ><4u)_Ie%zHQ;(n`1 z2~%hljYWA{4OJ*=*P0`nkBA%wmRgPGN<;#seu)@$7&$rKz8KUzgp!YzFml^zYOX;iM>h=R>5n zRbzX*lrLeNK>K_09zF`Cv(e*~*87^0N&EaHaEDzav8Ts@G+MZq2tYyA*5=}eR~V6w zAV6LpiAzA+P)iF73+aklm*X7Kfq4Qu8DnW<3i=>oD%UvW8Y!6vA3GEighFbywU!(D zoqG@}n)43oYiqmfkh}W=1~>0;pH+FXVJ}t*wz4T>GW+Z*M*!Q@zYHn_pP2If>#13cl`kdq$vMLz77+TZnUh$C5gGukxl>1PyboY(&5U9yzBm16-@9aI-W zDFa)5ye3VT(5F|~aqn0Qfs1mrWHEP1(gTAufzNy9mzU!-awO_~9&XNDVmEKH{?N8jdWk}bRw9L5$a&?!8;y>2pk^3vI3y(^6D z=*xXpoWQDe?7X1}j?=~^lcrw4Lm_5nOYXf-E^4f^vy;fU`ODGq_4Swk7`XuAlcvbi zcyx&QgAfkSCFSboz3}e8`8wN~nVI$%sv9mGgUKE@O(^=t&gwhF(@o3}B`uG{-5!*$ zxA&=7jqz_cmce&l`w}!bnWq#n7_gtI9_FaTt!M$>RNb-xcb8}N^>HUElQ#+JHuFv! zW9lUN1AzW8wO$;R@+0ER|1({}xfJTp%F2qDNqb-bJ9^h!zShv9rg)lGtDw_(0D`vM z>6dYMW>ls3(1vKesejtjpKL-v!xl=8`HZ}lKK0*#O$6L^=Bo!E*qB_&Yq0hqrluWv zm!QU$(uLJ!&d(u*<5}%+`7R1mLkdVcyQAbYjn!?(>We5q>z4Jqz9nj097jB9m|uLR zb`6bOCcek??Cd2%KcMZE@TnO-W{Rxe#m@99I3q^nJ>>6>0(1!)_UC?Qf+bC&0 zRMCnZqpsFnZ8d`Ul|{;jiE^!prILUTGpFlUNo(>Wq3aBEMQ1N-r0{r9_i+NYX}2(j zO9Az-_S3sg{%!F3t_B0CHjUF>Zz<&DY>gSp=ci$8UmvdeS4X>XHDT}fa;G=EtH~7q z#hxMV0}7;MmIrDpJ&_N$PY-dq7+>JFcTb$~T5eBL$z??q5BxS6jIBS3i-BE|8qu zzs!=o`c8}bIh(a*;k>3=QvYn5{RL^u5%8h+M$SjRW_3R{8IO|pAxu2Jz25mp@xbP= zw}-v%>p{VRXo90bb-*r~Y8dm^fmxXh@^cH6>a!L(s=FtK5_MoVHT-Dz1HxG=62cBb zcX=faBtk_J#4Y(ALww5y3VOKEo;@b27I~r z6II_%t2Dk_<)D~waV9ZvC63zRf*yh}T_|J%o-P{Ak;F1QyG37jZPJ~b?A{#ciFpr@|49#1J=a3pu*h?nN7OLd zH??`UNl=T&7rw>9DoikIzTP>+I|m3kjE^(~!FmW0v!)06q!h|K4xvF%$=yfO7Z`-bP}=qPKFw*6g+sf9Djm3wDWx=y1$QEftrv{&lX}Hqj|4vKF(4pjaPMdcPF%7FI2s? zUla}&KnD;xJUj;a9p3J0paQIhBC=XmLy%I!#;8?ffMPKB zAP4Rg^?msY)WB6{@80kV(O;HD5sep*Qcq^hcviM$6iANE5{x=|ijWsO!&zp5 z_t$&K6zpJST$qjB=!z+yoXsrap-OM5-F1DQA*x^xQGI8@dw=88d#s%!H9EYql1ojf zJVWLnd|KF13%yW>=^uM4xi!%Fm*Z%^;RNN%+Mt3zCXg@;WijbvWmiP18lEp}!MM*%gCR z*friOo<0Z3<_Q2Ht8{zXWm2Qi>+|iwRbiSJ+6?G}Tj&YNgwle5_sXh^UCd!D14eZL zhoQmDJF~#sfYlX;7gTy?H>>4zb2N^LL*Y8gaaR0vnfHj}s7AaNIw?3W^x|ZY0f%<; zSwr`#CvP~^+Z$f2Ff!@bw&oVe5xi+$OqMWs z@o>NDy%~2xlQ8*7m00S$AximwcAM~DkND*Se;{j%Qc~lSvi{pe+~=U2I!iu|re(I8 zYrjAA^KVTsf>}bLtN0NLc)%mPLh4(L!oh8}92Whr|K1kl&$pi;Yy*^13;8hVq(s>7 z`7Ix<9VTE+p^r-~}!AK#hKsD%!_ADWV2RW_dKSBPcvukmnlc9XmH5iZWCWImBI;zP zF`%sm!2=Ky4tWc+?P6>6HXbX?GzDp3WERY9-uPrB@)kH>*cTbI(SN8IPY=-($k3nEk*x>oXlU)B?QHi}IBv7- zqLZlYbn`PE>R9(#DjRi5ApniMa6VfHQ)0Bh{r9j!6olx}fC(8&CAK7E#;sE=`~MQ z-ZxlFm+-nu?GW7^(joEFyPxOJ#3e6uthgb=@5;<`>freK3TSY zPC>7V?eb=@Ou~X5ZW_m|*r_G&5>ZH^1dP!lHE;Ef_~I>T)jvk75xpW1On3J)n;dbtPNP!q*(Q6}U{ldP&GWmJue-T2)iSy|mnhs*@}|IzKoPq3hM6cl;6 zy9;&RShlyj*lU!g6s!1;=1L#?)<{jI#&CHt3%zMss+to|sw$Aq+WN0bOdTI$I z^TU!>keY$m^b#|#ibW?1#v>+&2Um&6r+O4Qxd1awX)-paSNh|&hs+E9Yb1~?jUIU?V61k*0n~Anyqny6!6Z=Yp zwpJ@qclBdU!5aggXwO}^ePRbDS81c+{WJQozWaAdCyqbWlII{emVIm4!7Gh$V$FjG z3{;)3jJ!cwW3_4PBNh?i>*mix=N#vtpYO$9^e8KZ#nS+3cXk@6g$2V6$47%S3w2f6 z71YCRI?}Q^=i#%+-k4tmL&FJYH~I`}?bIU7##h$9%Fh(#hszvIdSE>NF9bTfxH)v8 zKl;~uFO0C>6KixXwWbhOiuoxn_f>Rim~da`NhmN_5BkA@e~c!K3m9WBQF<{VL=5$G znF7>I5O!Kyc{i7(e5mc(ST@y(zZ>4-O8NiR%y}kvUh#3tocpikgNQX5@L-9E`)CdF z)T27vMp^%VbN}UWM+aAM1sU8#ne0tJXUfw@jKYKV)nf?y&Xm4Py{0 zd5AQHkHH`Q2!0hfoT4-9Ba$`G!`wTWQT0$ZPfxhw>_U)o+4(QW&aW=A6OEYQ)vXw` zwv&E(tE)(YCcV`}#q4O^v`oM3z+7qGQFkw`5W_kS%Y0m@sA;?V%=)J{1Ltc#$D7i@ zEi@v$;0Q1z2SF5L^7sD!u?1s6h(7B&3~w}`W$_4^YExM}GN*8--FN?}II8g>{Wj}l ztM3M`c_&1ZFudjpnTm*=7)6tMqbMBJRl%h|Cw_UyTpN7N2(}|!TMb8aTl*zVQYZAG zhPMaPp=KDGwqwj)U^9}5!_cMwvc-0Y`wo~?Gr>Fa+^=Vm(}ylZB(=)3c8UR%~t z?e|e5+K^C_gcX7_F|SB2|1@qH1!SJbc-4;2wu*@uF1@Q8T59$(6PMW)D6=o?L+s;7 z>jx=PH*VZY`%nRUUnJ;(4BYR=|3V-v0_|<{ruhfE3`eG|z85jq2qG8S6t%c0woLLu znbWeTw*bL@wfjOf^RBMC$$g<(mxgxkz*SVi=iP@}1k|=7b?sl(U#JjyKds6*k&v*z z|LW|yR`JyCe=T}{FJ<`U%ZWcSR_i@%b$21kQ|&k}v0i7}{GOj*PK_3YZmH>R<;2J< zylN|@xn-QVcNJWI*W87A^oR3eVYA3B>-JpO8k`kU@-Z`sl5L@tkr%3j-$7D@@8CLn zK>$DBS-@tT80pZ3{MFg_QP&R*T1V2KEf42yb6+9dZ4AE1`&1JWw{>o|`TB|Y`x99h z$leG~>zN>!jNTC2?XQ=-49w<}k-6=ynJwi7-^@BlearA`M(h(L1-%KvZAHd{IM00s zQCF|#Prsp9tXb_XC63bAi7v8%>cs_fXb+Q~f#9H%Ybb#+|K|^pgBxP3mBkcV4A&1=J2rZoit);AF4yHlvg9C9z@mmtpPgf zzp1h9j4VGF^;h-%&LkghAWuE{qLcfvK!oN6_Y$+0U850Ok2yZ4+<&TL6eNZETl@Sdk<+VP8E0(X1Kt!sVyoM`QAyIsGtAM#;Y%KS+Vh z7Fkj=@)ky~jhFG8BOVSCkAWwD@c5(<(62VX1xEjyCJ6Wy_3+U$m(YtNLl*hlM*!|-;Ib?-_qO4E|0uezoWreK zVJ?r@knVG>PkH($FMDkGfAJbZ6>A5!@gp`*podkCvR`+%%O=-DsZ0v(G8`MRig2H> zw(Xjh^S=tZkqqcS_I%{OsCODiXMIf1%5PcDFs?WUYf+saW?GIii zQzN6nF@d{{7`~lg&qdMJXy%{7fWw|f*nI^;4AWQE5$QwkHJbhEY`m(f>Le$i`$CCa z7If_ycy)L4ih~HBVW4KE4<61%eFG2fG+M+McqJ|tx;;VhoUnG5?)F@>T=V8ZNFi~( zypK&+CGc46hyBzPqO^Rrb3H!>kPpeY{_$Uzx5YYK$knNVm;%5_I6DN8OtdRqc2k1jwSxQRo%;Eh^}oRLmx#D^hwAqXK+F__8~Lw1GV`?$z9wmM zXF`>#<6QhTYU|8dZpd=sgWfl`?y&hD6N9wJ%_kE&Tm-@NDyZC@%$*8q_nxwVVqk3R zQO=Kl9pi+duW-bJ#w(fipuuqe439DwMNOx+{17COqB*Uc%D8$e@}Gid3JdTSZXo&s z;OHX&nWsqkFvTnsDiCq$jT3|96?K?4%IW_jKVjiN9PR1Vp8aL<_k{>BG+PpiG^H^J7 zkIbvN8{K&w!Ve;}PxSSV0}GLKOiuAAoifATbGPsgJ@Q_y3JNSj3km}tD%D;?38G_( zJ_J9%x^Nv&VD2zCuV%psZ^Y72-oV{vJ1+<#uZG0wU``VnHJLKkl|%wlgu}~lAXMUc zDZc%A1>;(hDpdXN``INbA-Z_fLh8#|l$;iMAuH!=PpuB^P`zqGF))1K{(fl{frQIG zmDua|$*gxO%ULGY4EO+V`(ZzGOX~qj2IKu^-_hA--+oAe^;;oNg1!y5fl=?ULa!$L z@*Y_cO{%tX`8(+rWlcsN<6C;av;y;q;k<93-6?)KSLuK{!Wniz_`I{WTVeyZwH|fQ zwMb3!o*I*un_jUH%qn7xG9!;~96z{#u|tjKfS>D5xro)36<_4#eu}IX`3sV+68Tc7 z+?+z)1Pf)59U(Gn_mKxE8h^V=#k_{|WqEd_P>CBq~w8=Xo=wSSEN5AUiZ9T*T( zL1&C+t|B(ZzL0!nqhcx{_W3c#tuIO=x%Xq$YF(zRHhlnLHQJAb?&UnLkf!@9eLs4} z4RJ2#rC*QF{QR(79LPDMk3Sf(GRDc1R>gpoae%A`(-vosL!4i`( z25%Ii^<-YQp<$+ucE#VmI{qS@%zWggev_;`Aw}vL_6NfXga#wnTl&Pq%#d;CMU@?y zIUcSx&TV!k&f;d!XiJen)|d(^{VyMTbuH*S_pmv?@GJo2L!|mQqV=xYi}!i__BC>2!ePiwlV1Y)(s{`^&CYGN2qc5Ds?Fe+u& zoh1~g0uKadkMDduohD;{H+G`wp5CB11cFr&swgl0%dTp(4DZ;`Z@(K=mRL9b|< zE#yixbLsRH7gr>7oz!)C0T#C+H~>h7Bj;B%MPHW`1AsEX0XcZIy#RQ8?XP@9vC7&u z4S-*JDK_&pE!PWKP~P}WrZUaUhSz0;Rv#f1-I}4U#~n}jevv1rfJj}-oCyFUH7=F$ z%&5M|jcU+Q7Tx!q{lr^t=Z?u07+8pq@mOb%DKMU;|JkG$;Uiy=hxTJ#2%dk#$am@^ z`x1ix1pK_4J1D_`0mL4VRK}|t>jf|%B7S%ktP$GAHzkj?{rLAf8xUNLr~KWb`>Ie= zEiMxu2WUOUbc}g2_o>@g53O&I=Sv@% zeuEQ3G@y6&vJPq<8LR^;hhV#u#8fWr=b1@e8S3E)U|{C{Ufm^8X8g>4$bwc{)}VKa zU3FvS`g-O>;agG24p)^iq+)wJX5*py) z67DZld`7co;Ll+dF1S17M?^gF0fzt(JULNPH2K=|n~T3411WZ%eK_m#OYRGK`%f(F zhh;9|^2vMBGSs^KmjpW=z?~a!x+v%0gh#fSwT%QcU zJNVsr=5=JT-IySWc{mcjPjFevJ=pNYzhIYLJw=AO!+lix-t#eVS2l3$z1D{ZToC+! z_6~x&Hzm>$jj3a!5SF zu*9{OZh%par-R1wlH_v8|B^s1uuEj(Ev5H*=x45|Fa zti5@Go$);WTityj^-X$an85bJ?FHY%mEOx+l~iV(mjQM3W1LFml83xBDKv`)L>zGEc=cz&-1Iha7b3#BjsEc)O^fMt=#8(6+fPr^3k_QTUR6m&khH8AVF){SE!d|8W5fzhZF{0J>2BJ0W`7q3bWv%!fgDUu`C2pK2?iJfDyE z%~{qd1_o0Y%Id+tZ;C5^8(?k|js+LUh2OhXcml-`sUFt(e5rbkxPNPr#}xHHRc~r) z9#q(i8Zc*le|&ovsi{XGb2bL(4U>R*gAlKE1jK)!&4L6u44KLZ&GB?AH})FL9O!jM zxy=iPiN`K%lIYr&9bTXVx{1ab#Hcndg*)R^COVhlm4eZBUS)`IlOJMjbfwkraJGPh zzKl7P?Nts#?;PtC9M1OR2S)=wPnYw&fWQ5QrZmA5W> zdQRe^-*F&9s-Nq1Ror2x#f;4O;VfLCo&5oTD}ud3TBRhl=6)o^4YXWsN;Bzz2Fwv2 z88YdRR-wT#jk$o@qogY2Ox6!OD3*>xEV}Hu_*Whr!4RHXiok5@b zs`6igftv-C2kvIXT?%3hL4-s-Ti~GTNnl*Feh#-|Q4;&^9NdrG$-Rao8 z>ax?a`&g8C9r*sFMx1Uwf`vh}9$j1KG?3RF*WpuY;`YTd+-Yxryf0x@6z$}l z=Xador54V|+od*m?_WZB%4N6OgLg4W`Bb!E=1GUrkJ@Y}4-|Vp7*w8*wn%goj6zqG zXcO3FuXeKZq5RPWpaPf~H6{U9w6&lHL8fvD1;{-AfB(Ip%(&Tg{q{s{@}@46V~lyQ zY!u`zX5&c+*#-TgaP{|F4Ey|f{fnshO~}HYu6@|4U4M6jB%jkQ(Jh3|K+#lhA-|i5 z{ABag)!ccd$tK18z5P}P(O*y^`eYUUupc-WjXFYN3&_f%l|y%}BK{)ves4qy_vhVW z{3$i+;IPK*_HFN01k;mXD^yMsK{TNSb6rw!65xNmHL~`bXMH|Ki@6GSA=s|#T`{Ya zedF`ftMGe*>+8CZQ-=qBQ>Tbt9`>GZ^D1x={6o2CF4wQ3+xg&`ZPnv*y5ysDw0QJAX^p-0Q>C&Ap^J` z%wo(wOZ_w7Q@Rg?BjI(2YUYLN{cL21IDt&TD)goT`^%=4F1ZD9t<1$iT$5_JU z0$s)g-S+T-VDvfBb~$7VwB7E$RaPlU<$RE2ZEL`)9X0pgFsk5K=+nFNrDyBcXvdG^ zU+gf@wDZcrMV>*#fbp=0Y2L`l1R2Y=(t;kAYIY7GeYu)GZ`0Xy{^OayMK zKkmPovST>vDwZ)@npRAWjI^QxZEX>#*XaCgU;s1Fg_w05LTHkKHG~Gd=vYJTJ@#!; zX0FO3iMFvw7zf{Qmm2t8&ug32{x^}yvgAU`Fo}W7c6=l^i^zs0Y-p;yppHWX3OHHRxl`99ZJ z|JH!-$-IKuc0S*SG2N0qP(dJTF*?Gi8%By zfp9bb$JJew>4g!45e^8pn=5%y|CGAK9Ln4^Rj!;oE1%0{E%$t>wG*eXaSy=se(3C6 zN>`l7UF{+e*YpX+G6n4uhvzang2prvIubjE)PxZV?z!`!A1(v95RGQ)$g0iZ;_wL>+si*|>ZC#(iFS)Od9W|gjLi}ee zNdN5u>LidCTHL+NqsPy>%97qLJpU?lLt^0qMah{SlU+#8;qT667Fr?k6kpslV8B@0 zS3a=TDCWCSnMr;}hBvMNR^PNvs-nrC9+_|5KOw5$=Jj&S8l& zwpUHa)l#~(k>zq+Rt5eoa%&Hr6K!;J!Yv-+j?Fid&h^3An$yS%?T-(1pB}jDxt2eX zV(fq{C328YP2AbQ4k`tbjvB1JGS&l-UCilS@D5v78~_1l?;i5xJgQHs>PMK3Jz#bx z6p)hJJqDaeUQ|5^>@^KC7iGzS%0SA%|Dhjfgq-P#H_}F)JkjDlY|RIzb?{H!-?z#v zkm>9bFxRWtKz`RqXe#klA?%49PllOF?wH~45B%6R&qubO=CV)4L+W+)*|YZ)D0$`*)Wt z(%LyxO`nJh>Y@7|irzE!MR?Zxw)W_mridw4Plyqv#Q+?uKY`ko5UYX8XtK*jeIjTc z0dZ=i0m6S>O3CwrMKY(H8AAb`!`1XOC&%O!14NfmFE9-ZQ=fSwLA!QyEij9lZwngx zZPj9^1-wie4B^59H90Old#|wcnB>HfB5o$Z@@RB2+w z6wIKDpk97YDs*;1?Qr}vB)pP;*ZM<|Y5~U-A(s!#`;lt2=TQAr_VSJZZEfq!%9PZ& z3Vid8_v_ARpOn%pD`j*7+ek#urv8|L5^j<~ZUPjd8|s z+|_TOYzj-KD1b6n@ymPe?KQEYR)~WgzJ%3}=b0=3W!tBS67GJRGvyg7uA{=D4-tn) zb3hJJFIVCsNGAu=9aaX08)9Kg2U?MGGme(r7Qc0Axtb*g{Y|z{6zzSXDljE5P^-o! z!RUUx^jqyNNDr&SRs7Tb1D^!skQ`pXAqs?2=E)+Q>?Lm@PK09+ko-yI-vo__pFqib zyE(!jY`7`iXz5Gj<*O;YmsAj%V{%zZ*R39L3 zl;OkHQ6*AZ0MD-K4d181F(L(Zxr6Kuv)_e94VCu@$K!H09;791vzT5bP1+;B52n}n z6Zz{Wi_`oJB~|q45ESIlVpN1_f^*b1s<|K%D7{+ zqn4spGP&w~Sam3?nf5X70?-LHvE?YzWbJMeA54+|PC=}cL|^MP{PX-a{Y90ang_bz zS4fQILN_{9vbj@Gq!rrZ=f@}E%~tn+%DyENy!u6#uP|bkGkRW!v`JobWsU`Y?8M{Y zl6B!?oG)N<(WZ|3E9-}BR+;gYU4m|l{cUy#?vJ~dtY2eRet@Z6|E2j-LK@US_W?if zUj<}oag@(loGz=m*%TeSSmUK`lMhg$J55rF}FHv(q zI@1bzQQ2h$*&Y#5iyqimEJo}|H;b;R1{-Zhr}mAr?0xmxUi|c@2z<0sSE^Wku5Dm; z{2WeM?zKgTt}Y&Z{RfA&b43c4OQ>!C-^^=Cr*I>+po2d#2QPMBiqfb<_YbBIWoeY` zqTaER@M3a>6|k$=q8&JZUZRUftkgC$Rd|NoI`cECM z2Rr-9=wm$D?0DzXBiFymZuWgx#S^L=&o{l>;52lK^d{?S&If-+PfTIz$@m^KdG6-w z{VrU~DnHDKO0CupBSVl0%X^2F?ZkW9S3V-8IY8k{f3Iw^=l51fj1s90aY*MLWwlxR z72+E>pJoU{;HT22_zUi#b4O6CsSB6Fc_vyV1&AD=3hu=GCAIq~3x`w!p9vVFhkCzj zv$uN(w4yLPNz4s$^!F#ZRDX=1yFf5VfjR38Tt!|!bGG%7>ERc$8Q-7x5B*DLVs{om_>z?NWfE|8MG6zyOVkiK`@y#?Z1KV*Fqy zO=n$&b$^2On|49Cj&x}48@b`=ZE@D-ZW5T`_s=pw9?8%lh0Rd`dn4)o`0h1Vr#hj< z$|wRsgc@CJ^m5(c*ao=690Wd504pAI=fIeN$}*Tli7G_uldXZg!l{T7e;I_9T_gAA zAug_7wvr*EDsQSKOR1Jp8OR0cjSgY03lLdw|I`gM zyNghgnC~L#C8)~=Q}Ab;gVU;rbNev&zT1V_SPSxx8fblzSZ;U~F9DpPz7m*qbVRtE zwtrr&m*c=Tp8u|Oojs}E(hfZ(a#>xuEhPon30789%^ZIFY$D>#iK~MJJP+9-aBTr& z2uI$-#KCln3lIM`+2aH17rusH>4Nfg6tOH-FlwuamoT+-gV2FT5y_tgN=(yz-}<6| z_cKj2*vD^!v@HSU%ua5M^G>FymSxVZdQ&l*RdKZxH(eP3 z*VlZhTme?1hWxg>f82#>vU2W8K~oolSLT^LSX<*`>0+2ev&;n`nzleV#L4}fl_F7z z?HyT45l@L8XPQ$FoAYN@co$7z!XFR=@s)l#4)NVZPR_lo|H;Y<3J(zH^!O|?mxb4_ zj|p4FT%UoPgJWmm*nsF?!G#ZIC#|kKLjx|~{bJT>@fm~)!2@)B_}}&t@q4DK6vumi z)ytTY4hn>Ew-*1=CyYPUX9-v3SEeb6;AJSAC@$v;UExpCb|jXa#M{z{^&ubPVLaz* zNyCite=ELr$f*1wF?4X%3i9Wd48QaAQ57!vw{>sJFDED8GMMqS83cVzC@LciK49?} z#! zPL@|0T1oow0snj^!XAE|kj-C83g;3GbUzj7M1WtIFi~s(pcOLpUSBf%QQgOfF8ot6 z9LRVcS@R`yrb^lP@X9*$8PAx1K`a>NUoOUAoG)i-&c!0QHaF-XuQvSATSirL*I&l- zE%lA3cP(tEuE8`2@1xxMUIvXc3AK|uV`A{RtFSqZqW`$3A?Zo4*)%r4AmaE);1Q&< zXSn9l^jhp-^6U8Pc-bWy6P2)EUsVMa0f`9E(O6Yl6o8(M8`4SV?aSIDAN7lVUGKjO zHb)HKRN)cP_OQ~|Za2*y`&I2a zl(@7^2s_G&q0`i|Z4v4N4S!>>A$;=W&owe^BB~yYoCiW`WBXBkVS-*eO(;n)q0c*7 zQK=EEH`~hCZyl$ABI44PSY<&Ql2k6c_fv(68B)^ttIOvBk7AOM(d8_XC@t(}FR0l$ znj+4@1v!MD!-J|<0wV2GE2T|$`-P#!q}Kbs>;lbn?&E$ zIm^a>3VBiCo|rOlIsH<<8oKcx8h~Z-gbqamS~{PyWgdqZOpOkq*Ic!>cH9>_jPJsi zndU86PeE{P^EWd7=LT0uURE-vGN?MC(MgLct<59{Rp{-XImtn(SpoBo!T56%7R z*|u!Ff(oNCP`vsA743`FPD&*E#|IxX-d-Y!KS?kGjOjBR~mp@w?{XE63 z&Xa*)>Uew+b=(TM1?ZVoEg{Eoz)6uetMFz?k(EozCi zif}xi!@iF6D}W7`?8iBE(PSLL>EBOEej&2Zr?&hj;~s&49v?3+n;D|RSTuq^ld>KF zgZ*$D1Ly1eN22Uk0p}H2$$zNR_o&JI?4+O9`mRm`mvE_SJUCCm>fwS;)(f3ORMls@ zcW@n?#!6AkcamAdM9@jh9PFG)R;UiJr)|wa{f?@m|a#}jhIkKoW*$@Jn zY99CS^XcoOL)}wO;vEa>w_rzkj5pY0JQ5;#5f4EUX`ME54o_|pWs zfgyw9_wn|1oOB_YSv5jNw@N3TG|TjUwezNWoOfjjtgYlYf99gv$(A`ItL-efIr(Xs zaEYcxNK+JxIbHo83%<3TEk5y;TPDR2?RS#uZ2=34RSi*w&&immo$F&&6UiI*R;~Z3 zB&tfkw--*j##g)D5K-~t_=vL(Il zHmmgR+LTl+GSGGB6@@U)Y1chiYgbPuJMbszycG>ti;sv6w`xgCYtUZ}Xme(~fg2{& zy7zwZe@|HUG1JV+g`kb;ihKWHDgv+PJ+)59;a7TNtP)AK(NNN$JRuQuuhKPi&8>{v zj>gVqdzmC6i7-U#=Y2bXxM!y-A+UA7?R-8lWbS71ms85FSQ-B2D$Y4jBFCEdMh5;0 z)IK)WQ9+Cil^8BbU-dn_OQ0b;Q6_0Yv3v?ELjy$R@6paYhh1&#MfoXV&!T8)5A!xF zEobC2Uo)pZWsv5#b-XwYw~(|f)0#sGiS-v(f_|74Xd0Dg`eep&QbIw&3iFm0Y*rCCHc4=!i=qEg*!ypuV@uExz|l$gf62hC=MuTO-1`NXgELVN zNpli19YkX-6x{nr33Opk(rl?EgH61yaMoJ$(Y@zvlB(pu( zi0Wt-0Ec0ph7VM?+-U-He%B#8cgn~}RSD@j&y8Q+D0*dB11xAS0nAh!2_cV6wsuNd z6M33n%zdNM>T_|NK!jO1J9WcgBYBBN^v9eH&Rsan8YPwsMgGf+RGVrj9)BedufT75 z+qGgQrl3EHJt@P;9^_yV3xc1s52QC7>3lal0(=#~Hi>m%c=y$etDS!&ExlI5-s*BQ!ZC zk*s-ZQ;HfjADKbk4?9`2$kJNw$U8a63; z+y8cb53GE_pHc@IR^X|_&~e>BMAgnc-LMkbkC7-~A)Ip6hP z%7}BS!vKn&lUea`#=Gq^`H%2w&bWzQ=+)sc~*o&6m<|7{aK z%e;X$a{*fVD6SmT)DLod7nnNnn{jKP`~9U?w);@aeS&RESk{TMt?p<9Xci- z&tU(48o*4|uU@)I8enbiyzJA5(XT&sj16LoSMpqjd)-HKkRK{ibH`g&^}{GUQTD0~ zx@Kic=)fyM5h(^pDpLXENR+Z}YHwRd`7dV6MP2{i%T#kwH~$28Q{|YS;w52%sX{#N z({{uy`QKRQxQZW^j14Ark0*vzd-!Hgdk={8Ve7Zl*okt~_$tA_-y3VbM4J?~_bSni zXn7tCxNfgA!(f?K*pERKfh9?VD3OX`d6|dt`KG-bCF0%9UpUOl7ddE ztHf}%*%KVXAbwT4fQ=}luo_>ds;GV)I_}5=jIZ6CS+%=6I&LCxm9fLl`SD!YYD00! zk1>_rFWEP?(n0*|zJvrX*lkrM$pKDZhSg1L>orp5RjZ*EUK3q!mQKKn<}ZWFoN-0X+S)Xj4sSktO{{Z(h# zDg48iSJj0OmGHti@%RL3)WbIvw&V70G;11>xX|}>xe8C1>r+|`S05k+RnioZFhv5! z`>9(W^rCM(0VA9=-J3$X-v8qQa2j&XEJ2pj3D&nJiWdIGG?|unoM_51OFz;B;!)Fl z>qvgrmM^+N-rW=%zAoxxub1Js2H_=?RxQPTp22mhKB%W6V(zyUggpI-uVi-#`;tCeRZ zU|e!ksZs%VTe}F~oLyUh!JkDf*n%sNklzSvY~H-_1q}(DIphtFeu{DXvo5H!y8ZXL z-rFBpgp()Zh~EZrc^c#lasMx+G+N6L64PnnR&8ukjbDDKV9|n?%BxxsQ+0>>fuztS zsu1-6Q8Zv$cD?=WVI6(I`%Q zfT%%pRG>NsIU0@MxN+moKVhS1?k@_E-3IZf)}!N7T={?u-4Lf0VMK(DjkWimII&Hu zQvClG$zIFV0k{~(k$@ZH5CPO9W4>3i0j@F8st-Og)h)c$YB0NOv{A5ayBvW4C8Liv zZy<$Idy5?HS@;G6gXipCWm9c-V_-Qs6gdzpJ5YH@`Jw(FR)NsUY@>!qqm&d&4S;h1 zB*AZ){QB!AosL}_G}@uj{+v&#r6M+*NOMjhv`RW*ZCkBuk)R=%C^GrE&oGC7;A^b$ zM^J`P1#Y!W8FN=CSA*Tir1WXegEQ-SVyU8 z&L3M-uf{#PazmW9MzBi6L-G)2sSS>XP&gOJ4*`H30svGbbdDmD zB={Tpd@^ot`MDZD`iYVjCDSE5e5XsjK)9t|AjqL<+mvaGrp53$$e>OE;z=>y5`i2* zs?-bC3OTD}rJ4Xf4 z`{7|VR~O@tpW4d3Fz2h$2LRY74}pJ|>ldsDDn_G6!Yj zpgg5Mnh)sq=#wY6K68D&|FYXd5ClQ*pIo>qxwTmeVLBD&pAV3O`+MgDV0XPrn63~e zUOrHPRNq&R9}dJ+e(tqJu&0;mu_Ia1*(1Z{o}gC;4CeKgpfQx-jV-8DI?}lSF?2#A zt3%Z9Llt4!6GX<$=;BJS@c$?>+2DXE5CFv>;9?pL$J?1;o|OP#pwyHy)D9X1VnPCRpxs=uH;(EFhZ!RR4@mNXX0MKEfMrq=-g@U{q9S225qywCseVEAwE?Cku1 z?Db=!Kmyt&i?*zl^9huwZP0%#7wxrZdl-cXHJftAK+I?xyi zJj%~c>o2;J5}D56dTUQ~27u>*1sJ;eMcSnKsb${}ts`LyL;$$I%U)mFspHZCfTE7w zBNQ9d(y`wMPf&=OgIjp_w9_>wPo3h*FY$ez2SEEX89p__VG;~0QrgV*Rgsb{5sN>2 zlU=!T^XG~p-|^L-vW!7}2n5jo!y{60Fa}PDjH1@G-5zGkoDiwec;@v80O<0C6=9tZ z#!*RFlc;+_tBZ2^ya1&@k{7I>Jh}amwYA=P`olAoK=-|R3dG6`FT-_n!Q3Xn=L3KO zX(hOt1e0}J`l1oW8ofxIS}|4?N}Pe43)Y%~?)cHR>bg%f)b%Ql@g!8a5H2Z}6)0L) zkc|*JBvVO{sZ-QVkC9p=XY}%5Jon*e!$ULJyGNd%S}C-JTG}Z1^Uz(Pno00#6YK>- zZx4(g{XA)R%^ZIQ?a(p-Mj+tkw}_Tx@o+qMfkF!9rMd(NTDQnD@x0If@Nn?j?c4W% zRe8QQ_(I0d3vn?8#tU(mJS3Z#@lpq6dl7(CH?0Wo?d>IXvjI3Oz+aUphh{4kT1O-h zAgrfpa{Rex&)^*4Bvb)rxwqgeM}nO(EW+FXLx-{entD|q!+Ca5&>w-9D_lxqL)r7AoAeTUnx8Lv16vlj+Pz^AoA-W)!BY+PAE{ahhOjaT~3dD_93IJOt zuthJo4$-e3bCeL-Q>)8jY*q>NB~g`u2+0Zvt(v(mC{23x!{@D=9&kt+l>r&~0smW6 z9{Cv=t(AIR?Ev4lBaza0HXRMka38A?RZ-%{>!vuWE7+}V!hVUa0}Qegh&26{dFIp! zlSs=0D!VX#PI^IkWE9eB|FC{tp3Be6GXb;z;d&2;qszB$?fxo~UXee=@L37cRp|b? zV0m7S!UM85H#c*CCHg$?-$a4Z4HXP`uJ1;`YHVAPXAF6$A%t zo(cl@^7*-8vwXI+ygg}^ARXMTK+)C>_2NqZEI=e5u+>;yj>|99&KOgKkZp9d5QX-0 zat=TM*xR#h6Ih646KQ@EU@A62)vE(4Lt?QsvTYvQHvP4pTY?4Sr^Yw5T`>12Akh~h zkZy&L1zEDGt`-3%nq0YZ^B3~GxYtB~RQ@cAVx*hk{F5O8fTk1T^)=MP(Ivt&c>uOV z=%LwhJi>Va-FY;~PlDZ9V&&S_*82Omwl+WHcZd2u@JTTC^1!IzDZK zwk-~_4UT&Lb@o@sAbCNqolKKt*u78BV;F;`w|}#@xBn_r9Ov<+{~x^H(jPq%DM`{1 zPK4?8qKSVvc5pWET>d{d0)%PPcgg(;rrac&)lwJ9FmL?`gMNo9aPlasW9W zfOHbsc@v%w5N?S}!9)Fiei*g~0418$2%ue~t~$&BU|ymCpdKK*E7VaOty*)2ZMlry zd}-$eB#$6RYh9qzjCil70}fA=DIMbHwTp0d9>D`2FVo`Z=2i&q1_d=K@~N4Oh715Q zZZ>wh6)Q-vMMC&F?f2JhZuTGyZf&OX07&t1-kwJuxjljsUs7Pb-Jr4^n&}U}d!O=V zS$6;W_1nM9+CFc5)}oiFKeqR$j{e|4JbZ!wL;Vr@)5!l<0>H(K7h@fenM@{-GTZoq z8iX?g@;s-5Ggu8GDkLYz6uu%P04Ucwo%X5Ir%!&CW`SW2fDgQ`84d=iJwPrI&JAh; zIKfa`8MKH-Ql3NwzYr#oU&*(4eNH4b5ms-dc4n!N<^pQS*0^1-XVt&?L7&Z(H@|uQ z&@RU1-_*srN`2`1sNrZN&|JelBU3I-eyP2IR>c=)G8%~SbDe-e5Sc`dH{}imPEz@x zi-=BtVIas-D_Vjp!|gKSNM4?{KH#V%oF%~WDV-TWst-pMHGbDCXs=LtNUyP5lZ&@q5)Zs?+RL8;_KxKb5cGp2Jox0#Rl&Q-FkGl zmYqDdop4jYxky5)jt;}fCN?wzPR1iKc3z#B;Ab2l*vMt2dJO7B1`le_UY)(UJN}61 zm0fkh2G8r!;rVG0S&Cll@u>xdPMUGYr0NA23*Z*Pjd5=g1+yZxdd3MwrWl*!1!|o7}v4_gAv4 z*aHCK7zHkk0POvp@?#EN>vKFz({iMz!pHG&3J`eekJ6uo{C{NtC=EhQKu?ar%0wKV zmt|ZOOOn_sLRu4W2{0MHjRMACrGNMAsZ+;4RF>F8&tXwHxV9XyJjs-ZZ`tePafk-` z?-rV^)I+Lt>Fo*9perQQdn|KojSQM2(09E$K}d<}i4A|(7kXy!VY$9XnZ&EJN7Gwo1@x?-VU03Pdr3LI9-e%=t`UR(AMANLF_! zXOIK()YEIy%idm2h_`)4mT^+$?auAp-#Q!&ujygezWj-TmsEW#$uA-RD?hDKSw<5* z2&3H|WOeEfvkR-m&0N^IDv%ceW@wNW#mX{k#c|P&B1C~{7m83&6QFa%Y5)LAM9DCY zS~_v!*h}kc{by})OpZiSY0_7PI0xX}m|6r=Nt8Z3Uz*et=6${1c6(|K$rZwU@ChXN zf_ZJw49eL;mO$4gxXjtzrs?otY^?`al~im)DNgm1V)NHT*Ch}9+jwp|VMcg8^?Hj8 zNk5MxGoDPyxY?K^ra)rEbchAz1riA;A$BLp>j{t=0XVp*XXk59M<$7sYEPUObxB{N z|DFyHhga_2z5nSbG6O#56yCl#MAGY@0-YB)6vebA;I~E;MchLojM{)4pr=Qv;y5Krkc9^I0fIP= zd#6rq|2yq=3(=tx0qRsB-4v(&KpFv%wAp@sZClV=dtioEmibLt3gjs;zDlG`aSm8w zx*lcW3+ZT&K30!s5-W96WM0+7Misvjq6x1&FF#+EK-lq1ohZ|_=u-TmM3{PdVv|Wf z6LEb?d>I64W>Ub?sfY_Qj(Ux<+T!j}EY(5f69>|~&kgB0gCe!^} zw|0KLD9V9)e;7X+-&6(ik3i+e6a%zA!1&XYy}u^E+WRvajf$6EdWn}N$=4$9{~!RM z=D2RR8|x9Os0oy1-a;ObWm7svm6PFE4$>npPu1a~h>-je00abx4)nM*ZEc-7bK=9s zM5z{o>KEoz}OA1u{U@2j-|tEh-&RVa^In|xaS&oudT+P~*J zJegC1h7vk901sdlfK-wMcc4LiMA4{a#Y7iztfZ+kxAGSOfE;teY_w$fa&8x-Px9U> zdxGAG8pME*C?S#6r$lV@`lUyr$~(0bOqC_K1|`pn?B>n8zYgis7()O6_gC+)3XrHl z()6Y$!6(C_FymIM7(w<7li$H$P`vWWD?a~UNPkuVfIgPgpnks}BMP8J8c_iGfJ&kO zfG3IC>M+*;$~El^@^S&lrhQ`~x;CGJd(p~NUalo`0WvSL+wPSJ(T?{QfeJ z(S^Gj$yBy<+PxUEP!cjq->WO{rwwiVGdkg2asbu+DXFyyF@NktD?LCE74wc@WyZyk zfMBDy^x_!6N{J5k2RC-_?Y(A9IV{U)AhM?gfYba*4y|~9P#={(wemX{w6mJz7cPT7 z;3oRBR0Ie>K(S7vz+f;)yWKA30*j&m=K_}c5D-)fRmoHU&@aofd-CM=%iT_Ut9ooH z_svs3P!I{UIZh3qa|AYg0!Za|bf876yvpfa`-2*#UoTk3Q0u^8RhxhW%}}BsVuU|e zW4E5m@^EK>N?VxbsKO)0E((xVc{LjFtuuD=+_sM35@WV!f29eZ9jqLmTAlSg28E2P zdYRE^a_`Qa-A`e`oH5}390C05Zya+Qgtj}^d4I0@u1(#8>IX+bkosFO8g%vRR*s7Yu z6<@ADRL=?sjolgXGBD5vxy2^F=zN5_zv6pY-_t6EAq7W9A${Z5wrKEv1qM+aj}Ey) z7<+O$SHP4e(Lt8Lpcyc%99j8OTDTnugos74nNFt%H*enkR9PB$eF1=_KA=IC{^+tR zzRhjoyMp&`)c*bJ+em?&H>{{Z6a}z34w7hH6o_NfK{5b(DWJT6{* z@kLdBxKOkt{aKm<1vIEJ3ZO0!MPup|MO^?gC-Z!?K}3B?gvIl7ax6`9q8vq3OiR=S*>AXvXLL)WYD@oeHP-c)m}=EI=g*wk2|E zT`4BF@9e&s=Q%w55ML4nl=qYRBhn{*FGuFnPBeTW~qbTaHN=i^M9_jqRUoRY%A}Yio7G65 z#;?+)Q+PDtwTZ6>06tls4WE->O=b}ZkO1ozZ`ZFC0t2s0`+V#GTv2AXZtuJ{on|=5 zjy(S?_tyjNbk9F(0Wkh(P!z>btG;E~8AJD1y!+QS*1%UpZ4$DxNC|8GhRseMY zjsn~x6vvTNh%2=LHGZN$3#>mO2@8SK(pmfJ6Ln?8) zh@p?KCc#!vB?iPvFuy*{VSJTGL5mKRJ9l>97>_4=Q53=OL3@TmYvAc^0xShDX>{{x zkMsVW4!1i)_diPS|F8g{ND$Tq&?=4UFuu?uG@Y7G9LH1}KyfUN%U+&?^1$22nh$7l zOf-ojK!FGV03dpF(lp&TapKr>#*{QkHcM&vU~M-L!^@@k0F3I9OKiN=1M(aI=JOSo z1K7++?)U`19xmIX5WD00$gS#q)q*^`T5{4;QW006un zMXy%NjM4E4?vF1Wct_8VSM{}R4?@j?CY8k(e`yuS`aJFp(&#Z01<)hJQJ~i<3Z+8h zPL{h3`CJg4dP01L>ng%5sWe2vMf7jxj26O*x4jOqRfRcjtFk) zZS{mn_4IxeaHrE~!y3;C)L%Qt`&HU=mu=3k)Liu@z%wB)Fz|!$t)6@$-Aa-PbI!58EEX@Q(ufYJ`Kb`h^3-0SK^2H%5<;c8d1#$nqNXXfMx%REQ*F-@g0ugdBjG2{|q*5!5W zh-+hz2{Dm3_3@5UaX*mK9|np`fGz0{vT~abl*Ww4jgfUAS{!0?6lgZ8k8 z*UnGw|1pQ$42SPmsZW{~JjSw2{sjX;|Vzx)9^9#GMQ*mmLni%^(cLrGnL}(F^^d$AI&r-v`eF>Z5bMX_{te zcOH#K40fJ7ay|J~mejHuCzN+KE;BR@*p%*f#%4p>39^3tfui$w0Q8DQ7 z`DbL$-~pj3{?pO(xUv?(W`A@O{ttVYnml`a*xWjoHbbZ1~Rj%VD0!LlnF) z-o1ARY;}LqKLYz3~>~Y1zU8V z`G2v7Rtiv{qJVmY=_ewAP!c{1HHunP6_fB~IWnMoHzgBHXrmMvBqDP;Q#RMpg)%SRDgh=6-7K$$rI0mF-N66zUos$eN^`3Fup?D zL)|C(z!Yc!6~fFwq%#Am3T0U*)dCqjH$aeO8B`rDlJy{aN>WTfKr#&Pk4Rt)uU|AK zCux*HKnXEL0%OXy!I>qU78Y+Ei=sI3+o|m)1+goYIO$9PCb{9rN~I{)u+QF~C!2$u z>hm|Hyp2B(WJm>_yLE<7;LxZbZCMP@@9p0m4u@!Kn1ZG#=V$uE zlGdi$k^le|S4l)cRHx(pkUup7Fc7??cNoV2K{1NsgtUI}{wRv30KsU~%6!%5QBa>F zi2(DWKuCqqEC*>6AW&%(2AgG5+Axitp*ZH8K(9$$TC&yW;_HOVAde2eQ`~XZva^M z^x?yO)y2oF+qJ0%@4#FsWa;jIs(y1@vo@^hZ`5VsNOTVl27|r5gPo!%aVQxXDZV_< z597D=M;qC^>aXy921QXMqc}#Pi}ijKx|H{i$7zOwSFbn8A0_oUG5{>1LhW`t(l!Yc z$RLesJ^(s|eL|oxniPW;l_fR8QJnzM08s%TK(UO!UjYH403J`O5ORwsDsd!hJBs48 zl_cGbt+lN*#YqkBKcAZTGT%ylJ~Jv%6)>}uC+LlRX;Z7^5E&<)Z8YAcu4ahetFxAyNX&Jn7B@srfL*HhOkq)Jz)68Z069e{!a zw?$DFdwcu)gTW9RnURoY0sx{t@YbL_#zZh)pZZwi_o$F!g001w}Lo`f@ z=72z?Q9M3DR6s7!HHMWT_f=9M4yV$@anf2}?{D;bT}Y@pIBNqyQ<6HvU>YvY48Rs< z7|o1p5rbk%M3asI|Vnw$|&l@q5A(Tz8{Vh=*%jn7!Pq>i#oHXbl3CpoGk)LLL*s|hC$h@ij8W-T!$;za zF3<6}n?vs(kB=2zuTQ1X?I={A@RNCH707==FA7ws(4wR`&q0UggTRjjZ2a6Hhg(dG z;TChmXq`3&IRH(fA(FuRTRJ3XleMr4pMemk>+8L>UJvJeLL{m7+t22_Rhe`4LdwEh z;o!3XS`|{&zu;4@urZFDkKIRI?ak2Eh&i%tad0>o9UKf`_|vkCa_9Al_Q2=~0HX9z zwHIDrI6vqNdVY}HlE*I!7(a9VvW$@!SBxL@N!y!Y{7`&Q?9!z7aqxcs${r~If+#RI zAK2a9Mc+_G88U|ZhQQ_Fz5PfaAh6SAkU$XyWPFl9fLs7kAc}|vkvtm5kpQ5CN<@*M zEFCnAla2terf`#luqY>qH1i-sn@YA;07<5vWTa4h=)HmOkF(}Uw54o1Vn z!^1<2Ph&qA8@_se^7`WWHR)x(Zwy+TW6&5FJSjiY_=c7S+z0I$vGJq8m6FD<6UjeB-dhBjqz7_|4~vO{WOmp05w#|0zqd7v`7YJsM}>a1bI|J;0@DA)tFkL z(LY2j(eU^T0FprIR@5V{4bZKh4~R-6bODMs(-I6i*h`kP6mU~XgnSxaV;V`eApU&hK^=#= zz!u3u5FjDWvUVDR07k6IvE&7mAMmU(ZqXr1Y7xFi9itinqNwPA7C{!3Vi_q<904d2 zV2xaYsK60{fe=M;3~JQtb?_e)E2k;Wn{f;*ekQ37%L;*k&py6N$(nv1%1ojfmE*}I z8xF_g(P)gqQvsU89^d5HE~B1bWlo>>OR_5-!j0bqeZJ71F|?e)5yRx3r7nHT2Q z)yY;=g=TVyhPqoA5atCCG-*vH(`+)$C&S@zlIJ?I58GcrlR_#Fo>}ma&#)?tp zl}=BkHZXDp0Q&x8Dr~{<0g@!a@3GVgwMT~8iT12u{G8f6WUE6{M0jKoU{OBcg8(ZQ zJDq!RNQa6dgJHH&*>xZQug@$k;#LR%!Fhj{L-qS){FDzw5h+48DR$}*@&eQg2nfgv z5_en18Wl>M4+KPY(pJ0OZnfLEZSiRk^j}kDU~vu*Ql=(`IVTyhwK0kfSJuHy_2ZQ-7p=nPkm4#^b2EOONL< zMl(^V6NaB8NfsLa_V#u$NA7$q#;>1R6G$HF=S|8`nx;`*PN3=#n%qRor~V;MkXh}C zq8v2?iUgP&R!XFG0nP&u1q!M-b7ZK{p%w~ephQwM6KYh62C>j1IbN$IAOH|?97U~G zk|s$jZM7&^#7Pn-tyT(uP7QgsfIHJ#6V_c910;?k7Js`en^Roe3;82@7dKvN_@`}86ZwA(pVjk$G#PLd%n&Zp9FYc&JGa{n&4ztSa+ z0LTTHN_mN~|AOBXWBi>$)V4^7@x$=PYoCqTtG&vU98mt~vQt!Ntsq*5-T0SvTz<~RK1Bqoe6vw2EwbOY*IE}P*M-%}S|ZDT zWrYQgVA$laYVb6|4}e&Y?|FXE95Q_N{7iYG$Qr-u{8E*L_a={TjUWGJAW%d=@oNIg z1E2r|QYVngE_?hqo@UJX+qvrezS>ih@LJmQsCmDC?H_3l5Pryu=#UQrtrMVPJRY|b z^bP?8W!Y(=XokE%X^}^X5FNnvsTvH=&r!g6e|+Cdgl$4B3Xuf?>I0BT>p_6SSXeC* z5Wth$`a%ocY#lSF0Gq9~-9j{1Daklig&BLM^bY=#11fF=L})Cm<9@Rw{D?o^SmA{Yqa8Zy~XsAA9-9&{-8>gdMbul%EUAZJA0B$`TleY$}`R;lYS8z|4T2uq|0lS%DpYL=WU}v z{vV!0hX|CY7-NdT~>7fh$q1eB;K@{}nN8?hF=d=DQ*QCp&dCxup`fQ z_sjwS-dnYQXZQ>TV-hiTNUZp`QXNu{rcnfs4{d*%f%d@bx7*WP`96}}K<2D#ZFr5!Vr5{7GWy zRt=shkIf^{GEI>rj#(Ar#yOfW)1;W>QStmzF(yEeG6Wz<;j)qxt2C(c$Q7^m65WeUcc3v z<|=X4Q6Ay@q47TvhOZa?Z3n=doS+g3pb&+Ws4g0`T2lf;QJ`f33wmjrw16NLYE$Ao zZA*C+5OECZ!(LzLRLX!T(-^DS84Te5qz-9fEPxOi1aNSX%+&`%X_U--=DO?pO-+7P z@|1+QD9c#9KPtPiczsfTyu_EaekpjNB8(GKMfXP(py@7nd4PkwJM(yaFQ;2cZ0-Fl z%jx&y7*q!dZnM{~p*+g5LQ{q=if{D=hV{gDgAG1DO5_>mMB1q>dbC@2}m7w)@67~jM8I{I%;B5b#e zB7IN^l=OX$1l-S4l{{lBc_I&hvEvq=z9<|G63?HZ=Uo)oJCBHsbk$`jh$6A=L#lH-|ZfJQo~M4BM`(V*2zVkkweR+eO0 z0uTTUF#HM-(6<2Nmoo=iWtmvxX9`5zpP~ZS0{{kmp@dr`xD`No784<_a=cC4N41vO`KRy*I3K(@vR0uRE z&jAX2!MJ1jw^AE?pA8=#UkyLYk{q7D)oSIMyK-qUBt+jOrj<*j8Ul-;FB1!n9S+u4@# z2d`j#157fq2$Q_sN~U*EYmp#=D%oK!r3mKP&dCBI3n2{rPLL(qA8U#o$e)n}ib79F zAuokOgsy^4_5t?5C;9{asQg5?*NFfj7>w(kUh@JxuhW69O%(z-==bM}iM1&@K+pGE z(-u;vl-45R2k>{hrj$03JI~LRD8E#A0RJsU{hJ}c7un!HZ?Kj{bdlFY2x){zXbo9} zymhIhutFdN5=RSzZ1c>yl$=#mAp+Mv3Zc4hh(#Zu?=QBVzySQg11zP{gXq7X10vvO z%K*_2@C;zmrw_iF@eN7T0K6MxTWyzD&Uk{ZUov(oZ z9l2xwAn##Z?Qzu^;6x@E&HF*QluA*^qSx1)XrSQ_Mk18*nL`?Fw>g)BL_!T!iLAg# zGbDfjtN>qx72s?3j9}LQoA39}mNrs!;4A0m0iqY+k8zL9mWP<=;O6mN7MdI%D?%ixKX-j=Sn#{!=b{_!3-(9b$7ofL_&2@F5W_Lm+`{g%I{O z4dem=)Rm7J+r~$@A$NAW(l#3gt{;>}78-w)IwSB`rOg2S(y%*_6;~ehZ%P6kWAK^g z*+oQnd&_CF`Aa3qe1gbF#wUnujR+6|uMlJq0q9PQzOos{h~bm|cL`EB8B*Q@-VAYS zZ5f9cv)5fp%>vLo%P12Z@)9Q4t_=M4>8`e~x6CHmbVjpj0G>O3&!WD$96&!!s+d~V zi1wt1TJQDYf%QD_FVXq8Aa{;o>83Kk_zSE^u$Dzfi4Yzk%raFYk(}@eWCcp7$H*YE z%QpGqb;2Bks1?*ZIclv?!D{~wdLu)R{Pa*`FL6ElHwWA{(BUOUpO!+pf@elHabmceFr^1NICQAiQQ#8UNbYkz)H0L!r+dw=jwI-IT>`b z1h~*2oFsyXB+93(_=GVlyuU+=Lo$#RK0i}p4MO-1FC#~S6kJ1!5%_-Y;D;oqJb-5c zZ-$l5fVkIpi0L#r2^{!$l(38pBjCvon+*|vqv-mG^sUYF<0D}IrLE~46&+;G%L|W8 z`818ciuP-%^J9P?__=uke3uBk{+Lf7E3C;tcqcQ6q=b0}{2w2XfCnAqgo*a8ju2p% zx6Dc&9NPpr_=M6m@Pib?`(I>`gW8{nFil{bktIKf=%#|~f!J!-+z0SnhoW26tz j6X7q2_CFr@@pu0RAWjWJ_&Qmr00000NkvXXu0mjfkJr`< literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_book_n.png b/app/src/main/res/drawable-xxhdpi/ic_book_n.png deleted file mode 100644 index fc501064f5b9eb1c516cbe9f212ac78d6d5af03c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-HD>VB+$0aSW+o ze0#^=>u`Vo+XwU93(Oo%^?VPVt~a@BiD9-piM(|_#?>>fjtghR{O%& zCZJG&V437(22sF)cX5vX#?hw$Hjl@-r4*etJx3 zOH-ii@B4X=r%aS${BES=g0{qe7I>~c>GSnvU#;iX^-f<< z;CQcO^P0OQ^Lf{HvtPN;ko$g`!vh|H4hIK@DKizA7#Rc7nmAZk9A70 z@>czfM!Vjr$#=!W%oX-0l^VsrpWPVtePQ$5vTZt_vgV%U5y`s*44_k0fwddXC9!e& z8+`Ef%3gf!dUwr_X4$Cc2F$JM;w|bD9VcqJ;?3=!&z}D|&-}C>Tjjqb)<;!b0S&-N dbJ)c+|Ng!5Ss$)2yZ|N<22WQ%mvv4FO#rtT@%#V) diff --git a/app/src/main/res/drawable-xxhdpi/ic_book_p.png b/app/src/main/res/drawable-xxhdpi/ic_book_p.png deleted file mode 100644 index 9277e010b50e02ddb78a5d9a099bb5a91b4ec58e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 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 iUh?+;AAld9_5T9wA?GE$PD0000V7BmdaSW+o zd^>x8x3Htg@y(qwPdbv+izG}|{^4hex)Gb0o}BEoDnwjB+M1VLEG$fjgX82DeY?gP& z$L4)^UwrXeg29hHlNzRUFPr-B)ULXxD;QtoteO{6ugeg)$=sClb`z`;aFYjtkZ7bTj=YwhK{kLW3A1VLU>$OyJuwkGua{8W>OS#* z^Wn$|Zw+NU?=FIuSKU-M&iXHNS`3O@@n&hXaH+4TLy zaoMLgJk2>B?jKV6uGsoA<^9EF&4-=qo)zsBezzm%9HVIW(ejf2KZK^SICEV-A;+ff zYW}Kf^UXhkhS$2D{82j_cr9z|+mk7uI(PB^u*h3Hv!Fli(DuT=GkW}41lW_fgC-SN zygR~hvtf#fOtOR7b%D5TlO7%D6yASP%5`=&$M3)Y<_E3(QfD>y-eUh3X7ye{-OTN^ z$2;$5h%KJ^Ea&UWSsmw=y$bvrw)(5~?6Y=Diu)FyOV-ts`L?h-H2raL^H~l7-b-u6 zuiR|<=iKkBaI;}EkAwK?b7gvQ!4A*aZW*{ZZsJf6TcOQ*WTLT3)r>n!-+5Op_~Z9m zxoPw4E5&@r1+E^E?+$Fv%``dvq3hS*r)j6xirQT|9{i@v8?`TMhs?@|Vq;OtX`5;|5b@7}Yt&Tb-nH;6Y6*GK`jhK%7Pw?i8zs%aZ x!ku*++bzxKhb-4R>Toc!I55CaLNMna*6Di%8}G_QJOE}W22WQ%mvv4FO#lvZhhP8z diff --git a/app/src/main/res/drawable-xxhdpi/ic_cancel.png b/app/src/main/res/drawable-xxhdpi/ic_cancel.png deleted file mode 100644 index fbebab56ddbe9ad864a1470716000a608cfc598b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1497 zcmV;~1t$85P)Px)lSxEDRA>e5T1|)?MHH^rJ25(mCTk)p3SJCGB;??NM;Y_uMNEu3o?Jn*Y<4pW zB6wZB21JN!HZf6fJvnMj#ETo2!K1hr5iyV)JQ$1^P1I!LW@o#6U(eRkRo&HHHQPHg zgl!n=@6~(X*H!(x`n?fi^;*3HJ#h!9XcYB&{kGpPiCt32ijcIG4Lry;`X!0mVT+{r zmy63%i1XYyOM)7AZx&~&)#`PO7j+dv?8uR?`y=u?+{=BLRni`eAkH|wrk{pWQC^`?+AT9Gs(UVTKoqI78E`a9ko9DMSc*W8$J zTf`cTM(L-Y|9CkR;w>h0Z%kitRifVl*8j-EcYRc;RGPkuy@^ds)bDGC;uJqa1HQ)E zk>_V{rWA<1BO}!dKJ)pexL@PPK7Wi!&2)+skiiyg!nQk7A)JYgPt;!wo8h-?=pG*f zMaaS?Yy*R-TL5>9H^tgKWt|zPxu6t0UK@Vy zyDWQ|#Eu{T;{N|`EPUUM?UxOjF0w-z$Z{ywXACa=`uqaCU&o)REK(Q)CU|CGw8>hD z{do4$EBuan)Hbo({Y-8k!e{}KN(?6oCN*Z6ljtTAKLmZjPJZY7nHY5Jz}!d&>vEjJ zODD%7tSJ*xiABdG#}fre(YiG|Y6qU5mVKoi?U2J9%!Ll{s$_7=7qww*7zJW@Ve zxrL5)1A82)MlAaB_54WmC09HtI7e9qb}KPK;)(d6Yu%OHN{~_*8AC7#^tHl!3ads;b>0l6Mr<*dxolo8 z&zZ|h+y{t>T_eVd3J6rT4zy|B&jea9ISso;EDAfD);-!;D}`qYKT};%;W-QaC2HbNq6(Z(`SoF}Q}aqL`oyDR{~(Z@Ju+GqG#Lko9OK2x6#ns;;Dznw202 z%)qW}pwx)9QaN%eE|69CC8cx~PfkvmX(){t3?r4J0OXa_M=zv#KbMzp9y#dFv#-X} zFeiwW*NCq~l*&=l?4=CDckme>mvAAaDY>Trw#pYs5!^!Su` zUa|eK3!H*DP|i8Djq5jTNlOr>62qLs6Q2!>Fg%KSuU-MsaBZ~uK^nfqR#ZaUwr>8A z@8XPV_gV>T$adOrS&1P%dh0EH&#;1vw#nV<2PR}Wvr@QLVgNlf^z5%x3OF1`bKN45 zv`cfql$B}0oJ?X6KprXx#1QJeZ~;qRZVWhci9rY%L}U`XyKAx>e$~Q;KcB}E6^^bH!&zhCUG$_IOh5icLAfx z@XME9z;ENVljZ%iIk84t#MJzo?k`7*m@1>38q!aksXmOK8pzBs1U`sy9%;vM)O!Cx0dIvSla00000NkvXXu0mjfl5Wmr diff --git a/app/src/main/res/drawable-xxhdpi/ic_checked.png b/app/src/main/res/drawable-xxhdpi/ic_checked.png deleted file mode 100644 index 881a033aa30863ff870c73b09fd662e5c43f79e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 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 N22WQ%mvv4FO#tqqoBjX* diff --git a/app/src/main/res/drawable-xxhdpi/ic_daily.png b/app/src/main/res/drawable-xxhdpi/ic_daily.png new file mode 100644 index 0000000000000000000000000000000000000000..8b89b05105bacb7d270611b53184e38006e77bad GIT binary patch literal 28626 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

VVDikw2-6fH?tm`}^o1vq;G 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 IM6N<$f;V*b-T(jq diff --git a/app/src/main/res/drawable-xxhdpi/ic_edit.png b/app/src/main/res/drawable-xxhdpi/ic_edit.png deleted file mode 100644 index 677adbdca7b3394cae2fc5ccbe9a94d2b9f174b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D%zH+#A`hEy=V zy&dRx*np?uVPhHBy`2)~4_bD!zn{aL#pxd@@{mX7c$@vDE6d)^`LcSoXKuOGMF9r} zMivMm!C}L*t=Fu!$4u{*ne}ql!}pif?s!@cV?@hOB3nR;o^Iul%I3?CkQ_f)-5+AD_Im zwo*-2(e)um$McObje93=^O$In+K{rSN#s+2KU?;#SoP{}sT!WEa=%&cs^9iB_V}US zj>ldyb0|0;;0ShPkYsY3!Nqh!z~E4bfJ0k@;IbwLBbFWmQI-jc2`wuXm|v*>7thWY tmw5TQeWk)<8Kx8lK{t44J0xg);5;AV%V_GW*A0wI22WQ%mvv4FO#rKE%*Fr! diff --git a/app/src/main/res/drawable-xxhdpi/ic_edit_recommend.png b/app/src/main/res/drawable-xxhdpi/ic_edit_recommend.png deleted file mode 100644 index 6edc4c2ee08054f9ca35ad7134c970a6f0171c76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcmV-F1i<@=P)Px&`AI}URA>e5Szm}$RT%$$^GC*^1y>7wP)IO+Ni>3uq!;xe94Xjh4SmskP!!YE zNXvatq6blE*R`#-vNuI6DBB#NHzAE6da%GA0*mY+#a(=uaoTq8*YB!#_ulJ0XPlWc z+XQo9xaWS~cfRlU`_8%NJNFLIZtV=TGw{F8fVf6q7|=IVv7LTzi{KlXg`?+p%9!go zfj{>I`gN29I;R2%#uV6kVXu4{$Xs4iE}h-?H6HfqlVO%l75a5$SnjItoB*@!#lew8 zp0dHX+{L|f0v1rKdOp#)7JXeRrv$bQYZi*fl8|r~(xno*l5~y8oD%r6j3oqzeLXt21Uz)xK%^A6Z2Ee1&Ir6Pta)yi1se#it>0|=dUVbR zcxCLozg-$}bj-s|qq0tg69O-u)DD6_Pz}Ra33IC1)T%e`7_~T>xQ!z$V2@TCqZMrF z8PenBacp9>dxA^Om_R1vRyKvNzv`7MHopy@h1Lz|E3Ca|Y(b`Uf`3GDon#kJ$?Tm8 zNn>+ykDNA{88cuS5SAC-)1~6!Tv1Hlhndr&+q%yp=hu49P$>GI)>x+Q*%@xm8D)-j9KRcMjP{d0!ZiH1^Fr3TdC!71o3>4ngO9a2lG$5VF(#bm* zA)#d^n1V8dS%M+l6(CcmTwYhp{K#O&|u+KZ#U zlacLGF80c?C21@oiEipn^LNb@paJ=>{7k&5+IYrJZZ8e$!iu1?>q%Tayqa&wRoeRZ zwG)410c(3_O1Rh>Xp@4`hmG4nnD)?i2HF{DXTU)Q{srPd`+rd05(oeQ002ovPDHLk FV1mHs7MK74 diff --git a/app/src/main/res/drawable-xxhdpi/ic_end.png b/app/src/main/res/drawable-xxhdpi/ic_end.png new file mode 100644 index 0000000000000000000000000000000000000000..e04647da157bd2082dcca798016598c2dbc0c4a6 GIT binary patch literal 1015 zcmV zKTH!*90&04?}`y{G3d}g48{=uL>D#(9c0u=24Y;mgh)`Z)kPPHiAGo30t%wWs4<3^ zFzDofCXP6m7!?zBAuSSPqQQvTyPvsYW39Bk-tP)t`7y%%-o5v^?|b)hcM$ZaqyVW; zX#oW)lMn?`AlV|K30m$1MUvcRT4*Q6W(FE$*Ux!15f%t|2gXDyMvt6VF4H32JjPAt zS0tHn$g9o?+8H+*a5U9J9|dh>OFfxlEeT#b&zJ&Zr?f*})e|rs2%~kTgT6`H^aLmr z=ZnlZE$K)#Y6-ZMj?oE8+hU+iH+cQR7tDdNM$(b0)Dldi9zn@e69Wa~ybp|rRT-cM zjT!+QNcGc%+or@o;W!_*7}wo)pxSjr=uJoIire#ufkJWaX2w;w9jJDlLFh|GX~^w) z6sX!8MNLo{VFgkkx69XJohC>VqzNh|ptpIw&98!uA`#vM4D_sP#Iw)y*aOCxeSdJW zIMn=3ng}oJ8Ex-l^dSclN^m<{xWDRwmcp@7nlE!C^Bps_2}GC&@PZgE3~Vem$YMD5 z@sT)pn2dWh2SmVB<67*0+e>rd5pKi+hAl>C;Xq5`4DuG!#1k-rH3w7|z}}gDdYl^= zGgCN$QD$`Ke&+yZ5{$4D9QznwEz(8++f)7YI)8BaNM7Uk4~TFs6{Uf~t8XKPk~q^~ zVI==Eq%2Mb_L}8rQ@9kmzY_Fk z1Qr3E=@{KEmZb17Z?%44Qi9{p1mzl2NQ~nK$uB^j z;Z%yW;y~dzAG8>EOYBoT$EgU3&@~&Sn{M|};xFx+hqxv46VvwBZcB8cYB-LN2uyX@ zkv>MRRt(5KaWKJ2Sm^t!6ZUsNjIL6jxVY_fVO_C(5)nqzQRv%WSxGyE$9e)J>A?S9t3YM0 lkOC=?Y!YjNG(oZi{Q|yTz-RUc-k<;g002ovPDHLkV1hHg!0iA4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_font_add.png b/app/src/main/res/drawable-xxhdpi/ic_font_add.png deleted file mode 100644 index bf25018282703afd0aab1fe27a8637496e0ea5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1559 zcmV+y2I%>TP)Px)(Md!>RCodHTFq}8MHJszJGgElN+puCLaO*kBvjg-xPbU-IUsSVgc<>Hth$$^ zq_I>3qFkUZAfTZoh~lO-sB+tEC6GXHfI}sq6$i>60EfCzsj5^*ltPt2fXR!U~y+nM*?{QTQDU#n^AQV1vn6aoqXg@8gpA)pXY2q**;0t$gnBY&iVO&jv}Nz1-7r~y1wu9>C88>{dCHnF53}+GoxwdkZGE?!{4S#1%Hu9Ox!Qq zPp9lj1t=EV^CW;nm}9xjNU2mlU{M6>Rw_WIiPQYvqa8bU?spR04=lU5ngxU zRnyDm%Imyme%DC@NYn8C`kf6Xi=+TV*aIwiv>re~Wswws8ncH&7d#eu2B;bKP&D_*S6iV{9j(Iqo5d;F>iMxl z95=zvmxF`r4mAZ(EVlbRFF89MdecB)SkuCr-OR3GHmqN~SojG%Kj_W7vo-vXlMP?7 zk&%ffIspy|uR5ZYxYGz{_*G3lf1Ml#NC&5C9VHq9gmEQZt=y^q?sgr!y7bz*Pkw~v zVqJg;d*F9{T)tzmMZzLCCm^}phk1B4zZP5c@&rxQUCq~F&yNt)?_OM6+L8_bZi@`J zRTiB*nfckS=Szcw{m)#wG&=!yAW0)fl7aKvwDzkB4mCwGc*0U zFi8{kU|jy5Z45@Qb#<+~*Se*_)^Q`pV&m_?f#a)e8}Rd)VH|sw)wd##jEs+w6}+=8 zy6?=HX&8mYm+%!6v8UNtv)HBmNq2WtuT+9{c(pIPJpNX(wHf>0&gx`6`t~r41kvd!X?_a?T|(B1_*c78yq7 z91H|!?Q!b+v)QqdUFVc)0M%m;oRS`QHkGd-ECQ<;*0R?T4ZtzCZ{PYflyUfG@_?r4 z+YICABh!mcx}VrXffBI@o+CFaeQM83sheiy z6`lduzMSmD$i?$bboE#ik5AkqYA0I{ubAohG8GbHp}#-ES^dg(FSb{YMX>sRSlm+X z695SP$}!oIc@M|0O(kZL$&1<6R+gY66iUIYvUVg4>^Tb?P>$8LEQfCF5EemfWAJC0 z(4kLY+Ht{+9WQm4=0WlJ%iRbq+yzUMg%c+-R{^AkYZNa|-L@Sa-M40L?$7m+$eO=$ zx%Ucg+pGEt0fm4hQA_z#5}Xp#GTnd|@n002ov JPDHLkV1l6^=Y{|P diff --git a/app/src/main/res/drawable-xxhdpi/ic_font_min.png b/app/src/main/res/drawable-xxhdpi/ic_font_min.png deleted file mode 100644 index 4374218bc899892fba055a054bdb290cc6583877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_hot.png b/app/src/main/res/drawable-xxhdpi/ic_hot.png index fc502e5b40556eac63aa3abd62a53f52d7a92e11..0b697f9e438aa3ee90875f78b1bd8bae93432b7e 100644 GIT binary patch literal 2232 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 B1?~U< diff --git a/app/src/main/res/drawable-xxhdpi/ic_hot_search.png b/app/src/main/res/drawable-xxhdpi/ic_hot_search.png new file mode 100644 index 0000000000000000000000000000000000000000..98ce3c424d23deb2d05e414b1f600e629f9ceaa9 GIT binary patch literal 2326 zcmV+x3F-EUP)^7oA$K{#1Yx^-fS2Hb<&P+dnHm^$n$gf1?pZ*DLBPryatsSJX1b=- z3hNIW)6p7KIPbV;2c^`;X&{m^Qp^d%ur4@uw{Y|_lV8U^&pz*Fj}DGwpM8Gp-tAr8 z{`>uWKHtyhwV&_j`}2W}{z?+SD4)^azs;+H)Z;YG+J7m^1=+SJ!F7#M&fFSTr0wPLS93WdOvOh=n={*qOemG zcWBdB{dOpU4JsfmZH(F0saxrAnTUME4-hXIh-5{iRfE0>=Ak#ev0D_R$k9LVkrJ+F&_-o?V3}^_u9{ zu=#IqSGv!N0kRgwuMuQ3QxQP9Wc*H$8%c@y?zm8V zg};N~07W`M`IiWeQ8-N?_mCXp*H(Wy2p-U8u3A^ALS7ai8ck7)M;{j9Nc$dQG zl!`nPiC*{uHt#!LOwVeLZ=mqoer&qbr{}e3?Gm(hz8}^`pI&G{Tz1I>yC=7eOAG;C|g>Tb>OF0i7i`2IMqwus~y1KwHh@GTMi%bl67kj42UFbBk?qa zHEcBF6dE#FTt5Fk4lU*b4?$~7H< z9za%V9htUsz!*(+Hs4<>kh@5!3*%_HI)J)cH`Ct@YR5MqE}D9&?O1;#S?e-$IDooI z>q!5+f4h}zm@9PJNKOpuTqWiIyYil=o7rCnvFjU&Q^a0rGX- z%x?7CpC_QgtYsw=e-g5(sL{fDV{GKA{RZ#1EGc#9nY_%iu*l@`X-+m}{N3T7Cn{y*4g0|dzO^zeLFT> z1eN+pv?G06C_p(Q_M}h>*EQ$;R3x%c+j@9gzxs0`>=9`-Sq)sKxFkby7cC?95-GEb zk6kqrZR!2J^=J9?@z#lB-PH^0XV6fnF~SKGu zt2x$9k@3YdNXEm=7S5X`*Bt+n2p=lP$!hBAW5(5$+PIb&VzIPP;zgZTs#UMO;0`%; zDrPzM(?U+EW{_d~hTxQ*$`m~S?6X;_2JLq};t1=}aMOdNqh_`tTn#F*iyv-rhV=(> z?t(YaG@mo#n}qb-%!PGsIOqZLoNi`s2$?~N^`vwEa0p}&eRwRI%6>i+AlqoT-eLaP zL3FO_rWMq3%}j3&1&B)tmfDrihMF)zav8& zcs*)nKI-Lc=@Z2gJ9;m}!@V8A4|OxM*2~Y*XVN!MX|QwFp^J{$Uc4*pMy}fIf zmxhm9jo407=6V?#QSHDVqGrbBDEZt-JOTYL&SpwfQcI;xKYywxpn{Q{5qnK2SNJhF z>}7yXea5P3e(uByvG@XHFG}3tK|Tfd3rRs4nwc*87JSG64Gg^SQJ$#dm*yQO zCS<*%P%jRs6uK$SI~vg~TJ76t`%77Gk9}&NmT}gPMHeWv|1t w|C8RWt5KNW0scKW_YYXATM07*qoM6N<$f}3@9W&i*H literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_human.png b/app/src/main/res/drawable-xxhdpi/ic_human.png deleted file mode 100644 index 9cc67cec5b1bd972d06f55807f4e7a03f07d4e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1380 zcmV-q1)KVbP)Px)9!W$&RA>e5S#4-mRUH5Q_sqShZLNG+uF{o_X;~qWYhW&HZdSUAEEBA-(lQA~ zed$BBPZdEk2x=M;^q~}?K&)vL4Wvnu)Pf3BFs%%&Hkv}&p6&Fz*FD$!JolV)&%HD1 z!*j;NJ?Hm-Ip_C3Z~uD-6iYDz#RwE5@Lxti(sZuc@BkFH(DoMye+pk9gI%}`du1y| z()dhkla4?;Hed`rnoduU(2FQRkM!bJ2q-Lx?OCDBTV^EjP^|6*6cX0O0mQR3<@?xit& z!ejX@wF;FXednq(0Y8FSyur=sY?C(%g(vgcUgIxZ?_&z-1sz+UVdfPNhAkpt?}X<+C=|9)DI7 z`+y{>3UFgHmVjD@Mn>j!qlY8{h1r36KhqIlX3)-66dFk49i_P297-$!y7AV1nS-x* z6+xY+q;5wI{k~*0Q0PD#o-)cq0xJQo*$xiAC8R&mYAKga3Gb1&>36!-nc!LWf00#( zLMs8vpNMmiP@X|QUgO|9V(k?7foM*y0z>0E<1}Bv#P~4vjXDLs{*C4l`IzId6!Q#> z;8xlt8~ofkmabBX>ix^pVrnJ;EVkHbMC7_=C2-#zz?8`vc}i#u%{EIj0l~F4!-#Bh z1$PwP&EsXdi6>;^l@XOxz*xcMSK!1<05PXTfg?<-Ifqn|%<2_Ddkc`soWs-91hqCZ z8v)Z>m)@Ul{WmeyS+|NyYKq>*4Gl#mYG5Of?47ouKI+{=>KMRBSMwcinqD4qjF<2(S_859yh!wH(kq#}lWLB<|-?n`BQ2J~wx6OC-tN91&vnM1z(2T+C0e4dC5rnD5evn^?+l<#IbGiBS+D%gi! z{>2n40oj4mTt?4Ce9ULMP&5A4Co%vL>qd*%=YSc8yHfaZGJ}mGOuS=?m4Ig}d-(DJ zY|HaAiOP2!+(Mn7 zbRB82KZf&R!FE*R!Fhm?7(sE>!Uvtlp&F>U^+-*0Oe(ih{xX{ zV_e=RgKWk72Js3%$gknP(@u+thBE=51ZRTNdoMeC9PjTL#HrJRg^p$6%g52w&D*Wy zF)}<^C=c3)nIU9-?#Fl=wbJj?<41R(;!;UOAm@;s^&mUkfOmI3pTojW5mD0Iy#-~} zOi@cZN#xtG+^_E+@cup3$tBasFV~+&P=Wp?eDxAqjC+u3f17dLj%~o>p;@w mGT}iK9TX!_jKKdd0{;NRkp(Y}{>9Az0000n{UR#{zspT>t<7|B#t^s3S)6&vif_ zIh6$Y1v4;kx}}usF8lI-i3(%=@1J$7%ULELj*w>a%KF80&GX2N$g|>77hZh$`)*3M z(>aHKv!)9?y2ta!aU<6W5n;j8LRa& z|AxliT?=;Yoy>O6oMrtn=Htt%p0KaoAo?TgX3C9YG4DlYm+zW!OKP#4TloB2N3V2q z{GP$~A)fh6?IFcB_cq37iVrys3m=yFZ2VAy*_gv{zrem}do(%Jckr#TRj=`%zwp)J zj)GNo#+S{43%zEnxMFIhBIGo)YtQyViRXJoS6 zsAQ+T_Rns!X`5%8P_#H#*?(F7Zta}ywz9rIPW?Cgt2Z;cVZQCHe+)}GZU)L2TQm#& cbvy8pUt3h7PR*h^2N=){p00i_>zopr08j+*8~^|S diff --git a/app/src/main/res/drawable-xxhdpi/ic_item_category_download.png b/app/src/main/res/drawable-xxhdpi/ic_item_category_download.png deleted file mode 100644 index bb61a3cf6fd79a49c2ad91061330bc5f1431e598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{URW&u7SuK)l4&)+RVD*AKlxh>EH zp^_lKU%$85t1(c2Tba4#PIDhwoBVU68k4xYZ)?161 zzVBbt8Q7VrT6p^Yz7(;?cS>~En^YYT5ZKddcrmg|>Tjxx4wtcQYU>R_(RH%h1>5R3 xUl0`Gy1(u8cTSnJzrAwTihbU9@S|`E!v=Yl5RG>qwSX2ec)I$ztaD0e0syflU`hZ0 diff --git a/app/src/main/res/drawable-xxhdpi/ic_item_category_normal.png b/app/src/main/res/drawable-xxhdpi/ic_item_category_normal.png deleted file mode 100644 index b4e9b49ec30e70cd2e1f7c17ca6580ee220bd36d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{URW&u7SuK)l4KSMe=_odNj5y v6ydtR?eup}nX|vWa@UG|-goe$a0$Z(d6p23cOSKY7BP6b`njxgN@xNAI{tI) diff --git a/app/src/main/res/drawable-xxhdpi/ic_label.png b/app/src/main/res/drawable-xxhdpi/ic_label.png deleted file mode 100644 index c56fbbd51271cbb9682fa624952431eaafc1824f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_love_look.png b/app/src/main/res/drawable-xxhdpi/ic_love_look.png deleted file mode 100644 index 5d34cf8e4773b707770c0055aeb8f8cf2373bbd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 931 zcmV;U16=%xP)Px&T}ebiRA>e5Sxrb4Q4~J+y|J<)h>WN}f@fg-Au1Z%*HgT^XKp-<#1hv}i62_s*Gf z&-uP{?#%reqPWBnh$9e3;9o{SNjqm|MWd&V5ZQ-`sm8Uh=oL|7faGvgO01~Zzi-2-`zt^x-FsU|^mG zcrm|XhBQ!&6xD>sC-TNv@ zBe3^AY0?9lY}9i@c3zC=EhwxGKHR03A5b@OepD+7-ti%t0S)@h1Gb*#sSht7 ze)hRu`f{C=mO2mBej=}NywcUw!G1#n002ovPDHLk FV1mb0tY82D diff --git a/app/src/main/res/drawable-xxhdpi/ic_lovely.png b/app/src/main/res/drawable-xxhdpi/ic_lovely.png deleted file mode 100644 index 38e9db6eaec97f74ea42b067a837dee7b26b11b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_more_n.png b/app/src/main/res/drawable-xxhdpi/ic_more_n.png deleted file mode 100644 index 61085bb879a05910d2ce6627303fd76d16df9c4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-HD>U`qFNaSW+o ze0zPr_iRTA_7A&*7jsCmE_BxX#m^ze<7zP5d7<+`+Y1LZo9&q{Zamfy+U~>WWMPji;LJNMe<%jfUwZF{!dc;?Zhm0woxSDWUu``rWCD|y?)a}#e} zy#9K&|D^Y?zn<-%lv&;E;C8AqdPdooufLv6e)7Aj_VePDTlW+um@LcW4(^Y#-%*ux za!WQpQ|8jT8;7`f(3pST z{<8h^^AH*4ccoX4Ps+S5S97LVFgI*&h*mhu*L!BIZd`wM?cM*s@txA!)!h)M?`SYz zm6mS);z^S|JO8SOw*>gUAD?tHHoM?(t@v*J=~4L?zexR0e#iDOj+K${DlD(Z}!@qsnnTy_zkZuQBewx^Ms5>aozWg VyV4)5J`YTP44$rjF6*2UngG`ZHkJSY diff --git a/app/src/main/res/drawable-xxhdpi/ic_more_p.png b/app/src/main/res/drawable-xxhdpi/ic_more_p.png deleted file mode 100644 index b184dbacee2998e3d5267ab2a6affbbbbaa7cc4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-HD>U<&kfaSW+o ze0zPrw~V6*`-k_@qOA%MY)Tz7%mg|nDX}D}Gb##f2;1PXxa|*X(>AXpg(Vyrsp=e@ z2QMkDT=Q0B;|7D!3&-Tk&G%W#6sD%-O>-`Iu>0)2y|wSFjpe^3h(B;-L)kvwa=T$^W|H&q_gaO z(X<2Y3mn^D9B98^yy@xgcdMUHn8~t4dS=iZ`L5s}X0NiOt_3W~bd4(Adckt~nQ0D> z=b!aB`#_&(m(y(BtE|)KHig^UpYmH-_u5-;X4%P$)`!fl@J^dl_@=?hEd9;%0~5WM z#nye{tJ%c9G_@a!tmtldnhol$phQHMmZ}M0(Zs$(6R!>_T&v{b^h8&Nb)9t6$5{DI2qTd@b8M z+ebsJwcc#H&-SA)WKI6a)NlDXKiki?`@xT+#wjWp|yu7gSC>wz$sc#j)$jv$tK( z>3_S`c;meoqxIiKZhQTV`uucLqyI0zZ_l2+jEdJ4NsC@Nef6FdyPmYqTUouj&S%}M zdH}!Y2jz{3CA5Qav#iNUB@7pp-|r8J>@$vr7?KA`njxg HN@xNAFcc(r diff --git a/app/src/main/res/drawable-xxhdpi/ic_no_select.png b/app/src/main/res/drawable-xxhdpi/ic_no_select.png deleted file mode 100644 index 9034e13b25d573d9c8074064f25381b77bcbef65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1214 zcmV;v1VQ_WP)Px(cu7P-RA>d|o6k!WVHn3<3lBm+4k1D(Gm-9|lx&Lx4}oVXzt*MDC4@CS(*B}kU2P=_TrDTqV(xUeQP~vztPb+{?kW9 z)-2w> z&+pwZ9ihO^sJ$kDzCaYg1bqqU{UEWOK_{H@honV;m1Jp^=H$lJ)dE#i3tY&2r!}2=46%+0(6(yzR;qto{q8?A(7VV>sRwM z&?BDB<_jzFh`tday!L46p3--GN5YQ6Eo78gfHniPRhrS!uEIC`s5xO# z8U?E>{0hC7Lo^?7?lc3oV@5^`RZ(H@N5E?l}tV{QN#J%f2y=Gv$ zDQ#uL%^ftYsiu_Y@5?K_v}0x?k3bB#t{K)-`Eyw7p&nM60kPO zZLoI3igC~u;4ENkzT2`>q*{cujT`gfT>`6TtZ3gh|7;S^9 zv|}|6>PzLj0*?EUbgdp(dD@@Fn}N<67MYbj-NSLsw=Q4TJ`fo1?v;w?g9N2`gEfx(7Ex1p1wdf<8kd zKj^$+#j+vbMI9xyq|i3N3UN`ua|vNh^(g2*DhkvVSm~Y<@R*L8v^dZWdr%!Nqu(Tt zcumTzH5(IftB;4F&@Q%y!;E38kB3zeblmC&Kw{{OVd<{2S{rdPw^Y)i#fGMzET^%- znsx*0b)z)iz=?#;307?0*PkfRt3hd4AT+`AxUynesa;)jKw+92@eR;9!V0*y5ntVx zc0sRkeBR_+O!ZUck`v=5=~#>Lnr;4$2b@6QGEv_&8`;u!`o*HQLU+1Fa^fxdWp`P@ zkC)xBV)0CA6)@iq*AL>1h<-8GewAJuD5^>Oq{HH2@JwlQhKgEnW=+0;>8!($Oghus z=C|+kapPwTVU!K`u)8wR^z(#P?O}Jh#mDc_c9E;QAEeQDN}I|~!wK?w!_9V+#)&Z4 z*Z{iHxXsgB+B6%}HG&?F*N5H12K3>1LEL}?eR%!?V4#%(UdCJ9Eg?i~Q(tAbhFp#j zp+`$SPp7eoKp2nN^EaOQ(M6_qPPAR5D-ricI;u99+A4-(d3P%6J587m{o;`@mZv&G ct^6zAf2GN0?{Qk*F(~@ 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_read_menu_moring.png b/app/src/main/res/drawable-xxhdpi/ic_read_menu_moring.png deleted file mode 100644 index 3847e088dc8d00b48bc6e8a4050637b11c63a2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2608 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_read_setting.png b/app/src/main/res/drawable-xxhdpi/ic_read_setting.png deleted file mode 100644 index 9ccd45b1da8ea333eeb57e7553533359b90ae19b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1919 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 FV1m(|piuw- diff --git a/app/src/main/res/drawable-xxhdpi/ic_recent_update.png b/app/src/main/res/drawable-xxhdpi/ic_recent_update.png deleted file mode 100644 index 7363b3e8ebfc6bb45974fdc63810f11b9ae03076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmV+#1LgdQP)Px%)Ja4^RA>e5S-)!(Q4pTlB>uptjZw4}wD3<*^bA@ENvV|x5>c@b5k-qLg!3AU zhzcnbgOE}?4G1FV3H}QyB3O%_AVx(|@5Y%;j@{LJ%e=Rf(_&wfxASJc@0*$TmfIJA za+DP)Q~@j$?FgoaN7uk&s|G+PmR)cTc8^Tru}41~A;IRs;K;l{5l?g_apC!5OCGN# zHk(;w1M??JxAJLwFI##&Y;LxN=Qw117Ul#32IH(_9K9=7a!g=g;lboh9g z3nxG`m0|dZ=YTqwfM7(){vM)e8rBZY;N@pul`%ct3MD}G(Q%;mtcUQd2!s~kzywws zPqGX8r=T-HG!;?pz-{QX9|wyUjnXm35G=ve%T7GKI}j7qUp!#)l~-f}R%nJW2i1co z5vMvnIR07JU*0koFN&ogg6%oHIzZPeWBh&(-mfZch~s#zIj{0%Cv^gJ=g21b^zAh# zuuTgd=btWV;`Li->HFDL7cYvXK*FUQss!TSHq^PG#4PT{TrsBtNtFQq zj@i$LY`X%_#znYbqN6OwNJk9lYAQ|z zrsLElK(s-{Y3Zco)Fogk%owXoz__5^aAgO)OJ*EUcEGrx-f(3Hyh~;rPTxE^!6EkuM+uRP})ywM&!i3yNe{i!q6pKSBEpcb|ZJr zi3odDP?)r1Oovv+I@3EvP_X9Ox=E)XQ|P*hZ)!XK`un_q#OBb-DZ%xbOGw zc|P|%&)xklL9jn5382jg zfI#@=o#K-AN3bKFUdnuK%e7dmR=Z{#;vWKm_xe<@r%-^#*F4GvzBJ9NEd?kv(6Hd| z(cyDIR54>p2+>kU`MQw1W88e&>`qGo3TnQ+MD(mt_=vbi5|tfBy4l!n89*Tl30Hc% zE)&5bhQuaHi(NN`syqK;(55A^44{_2I&Ul<`;I*uN0aQ09Anp;Q(6X4K=U^P>HAsJ zK!k&ms5Z0e&FZWKXcv(F5^Ev|ct-Ln^{jfcI?DhGMt%DTXbWp1i14E%s;gM_W_8v9 zr1_2$(L=0>Ai{XqqZA?{v3ktttOV$LB3jFn#PVWS;g;&oF&+=E))Ih%gZGxu#nImZ zAde>jEGu$J<)?;uJiJ;<0NSScn{?9Kd4qSl3Ks5JdHPRYACKM=fPzuqF#>v+C-8)} z^yY;np~{mZygnX%)&Xsg)~$|1ydQuZJb?q^6J`WSnN0e+{zkcGF_e%@7V2D zdeYeki+9cdwNsPho4%oDUDss*C}IgNl?DOc2gJ!sJQ7@c+#sN<--Z7kL5P45;SvCx zbqd0_yWNrVtjEtdpw_eXizi|e>p_Q>bXtlvAtN0k=m@Z{Vo~|dtyLYPhI%8x)iZyo zLDy-SfOI`jM4bfsA$(i+=hGh?gPQ*?0(t|1))9eVbey@~j)-4Xd)D}$#sd=ul{)k0 z1e~vX2Tv10tx*Dq@PQ<%k4@?q|+hRAOxqQA?%KPme9`! zK$8RB;C3M;pl!Xrjk-?E_ZsLB9+YnHJ~^KN2?%?`qPo>o1?2)Dqjzi>tDvA(bASk* zVr|cC=}>^@C6C%R=M^+x08O8p$p?9gQwkv!L+VoQQsi~+GKQwvbLRJK<79h;{l!1 zfC_~C^4C3G7mX@7CtHklK<8`)A>v1psH``to*V`QyChM4C98k}n(r_WZDa{zt~CPU z{b5mIT5HeP46-sH)&ZT-7PBrO{8jcUOIfQn_bLeSV_8%hZ9p?F5ehHLV)x5g2Ncw5 zju63r9f(@_z2M+R*`$(A?(h9s|A#tJ8+S1~JA5F)lq zqVlK>Xr>iJC)P`D<;<)B3PgR61JHZSJ4E!$qM{`90nPs|kp2X-H`7AK1+xE#k#b14 z^w-`Ui^WyO*e9^0XzA1%uay8HV4rJ&P!n1a`GYZ+Ycj*1;IX|S#W(`BN?tWQwP!XT zZ@7H=#9yY6@JLB zQ|l;i& QR{#J207*qoM6N<$g3T|x;{X5v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_recommend_n.png b/app/src/main/res/drawable-xxhdpi/ic_recommend_n.png deleted file mode 100644 index ed66b4113513746b69b412c207270f240fe18f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1134 zcmV-!1d;oRP)Px(C`m*?RCodHnoVdEK@`V#c5Bl#q*83aA`0!rg9uiHf`|x0Z{DO7Pl8CG_?c2$ zl6Y$(HGUNFAYKIzsh}s%9xVup;3W}ETCGvhVvMED$E`eihv@Z2q*%IfDHj=)8N7gxi3;FGC&5<#-(8<`TOY!)();@~YIz`YL=QkkkCOB3u z;Hcp$=g+d)tU-}mYfKVAT+>dpCer*GrrOb^d_LLSMs-gD2n0%RGlrTC` z8WKR6bb1(Ufm(b6oPQKmJZ4-HKpN-gFv-DQY577t{vD+iB=Q{)9F&Ei@G)dPFOWK6 zGT8O|d$C&WGVGAU$f$d6rBXMMT4xyqWV-&|FwKQ4iG+1fhrVE~^yjj^Qx)_1Yj7eq z0}*|9?naf2J?=4#@#ysQ&yBV=H^LosHJkbFlK`29F?v9eNJLr(!Ff~x^KkxK2kD&CJ1CdSN$Vg;j2;li!c-dA zMbiW7?d_G;L1r+h)*vT$!c(inVzD1i{mtz{7wJ-|B&&l^)5`)S6i_%EmJ$$rb&>;6 zvsGofhXuNT%}1z%R#sM|bPyc*DhIW52=*i18bhdqLZOhH4r(-%gW5T$tFyDvuD`iY zsDsMovUCoD>9sySIr*g-Lc4pRfV#W8r2_=Vz>5G0eMl}8P`f8X*oR(!tQ>^`>Z(+v zbC8!kkZ?eRE^!X+VGkr6(C=VSItM|~@=P)3$4J+%2!tgcGuAoy9h;N|fMU8Gk7 z0oedm`v(U^a97yqW<0Cbx;}g@TAIt zjt=X;NuDm0gJ5&@+0&?h#cPtRK>()$g`T}QHMQ)u4iq5GFvcLrYZ$!lH2|?b4|zY* z4Pz*lOg<&fMTJ)c6ahs*5l{pa0YyL&*iHog0P{WhCK4HxS^xk507*qoM6N<$f*X7N AApigX diff --git a/app/src/main/res/drawable-xxhdpi/ic_recommend_p.png b/app/src/main/res/drawable-xxhdpi/ic_recommend_p.png deleted file mode 100644 index 7ca4fa23aecc1bcfa22a9862d4ab5caf27fd5b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1089 zcmV-H1it%;P)Px&`$>G$g?VQdXK>kl=lwhL zJiqrpGw;s3M6Ngjj({WJ2si?cfFs}tI088caE>}(s+#Ys+EkJ{&{?A*szD&%iRt0? zN{V&0@{%t>2s$wWsO6rjN+f9jV5+lYWTyT|kecI{_(%3R6UPA)odV9STyVTtl%fWl zf7a5if+k|i?$Zb$#dIh;kj!Ji+n*Sv>zQ??J{tjqalJ*5@QtG}wM(GWDlq~G!{}3? zte^>|mg#&Uo$m8S0AaQ2lO%?rcvzy-sWAcwL+q&}Da=K6rYCD7fcmcRJ1pnJ1tBR4 zCnrVoRl%m#Dlh`*U$Ac^K_};^N}|)HF$w64D5(%_73nmIi~+*@fzrwa1Q0;VoF-{(4H|QR6z!43%K;jf=yYj}0BVY<2G~M0`Gx~D zqAPhxyG8)5jUcU0?JuW1ETTW0D0<(iu*Y)^Yf>i?_uaW^C`kB8 zBtmWRR{oW)TkT!DgO1%*H4BOw6C>0CFuPX^#*cG|;nd75?Nmw~WX2#aP(*-W^L>~w zAE33pZ~&b8e|dQoUq5q{IYnbRs?Am@I&dWRcdx0dP#{vPcYAxq`QYU11Xn31w0wF$ z>v6GD9rGS)d{?QI-#i(|DV&OfIc0h@Uoesht zgB?T6F5hHCV+)}9DLWk$65b?gA7UBT%&L!goINBBNb4%LsnS9RF)h4kqiGl5lg%mmsUX0goO?& z;%kO>K)yOd+L=ubS}eEEK|!`?4qBSE3lNt0#flmlm6~nc4KX~)7>u9blr?~sY#U-s zuZw}Rz8u8#I~<};J%E_L7Td6=-%w`B9E3gSV1Ul_UgV;GiX*xY!ed(RH-&HUN_vTx zN8(ve00000NkvXX Hu0mjfI1lNm diff --git a/app/src/main/res/drawable-xxhdpi/ic_search.png b/app/src/main/res/drawable-xxhdpi/ic_search.png deleted file mode 100644 index 7eee4f132c1e34bf6b08a9e1b9d411a5fca1af92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 zcmV+}1kwA6P)Px&=t)FDRCodHna^rdK@`SotrfR+rBqwGP|#(?rDUP2f^X2*&~5q%K7-Ot-DnVX zQ;X;eD7ezJMJT!ug(4za>-U3%hA?L`xp!_dxtRkW_vXyZ`SWG|-#nSsneW*{?= z8ORJ|1~LPg0S5!89J*MlGcwc=)`S(|Vh0O)eiIHlXzTe**b)8+wU=AUa8vjp91j8N z(~kDFlB@9D~RTn$htA)%diwDAyU?p5ck3H;Se`1CCWLqdgKxiB6<7eXJsv`a* zgeF?19)7M&5<~o>A>5l6oHHmv>{=5y@gyT0Jgu`8 zt521Jeb*mDJj9iR+))&+Albi!F6BiN!9IRm{)wwnnGLkQX4HEj{V$^|mKysn4P#bZ zM)l#)mmvI3pu$BHXj2xSR6h!%<8kmaXx zg8X5fl>XMMYm%HlsZ!}1eq8>Et5ON=LEIs`WWlAZKxg@3k5s9I5;X2EZVjccm9it_ zWeK`gb$}iFmY*+G`wu0kZ3J@H(8pF=e%{A+RMcLoJL%g+6N=rAGmmu^yBFJ8pFQg= z_EYuF_SGHh&rNxEEw$r1&2NpB4Ttm8?t^YPVjR1wr3hTT2wgLBbl9_eJ&)`wnmO)* ztvl&|Dr*X5Zx(5f9gCd5D!VBpE93sE(M*<^PGEC-ZVT2wjGl>`)h+Zgje4wB*7a)F z*BjM2EhI0Tjrh{p4cvMjst&8oy09v^zN}JCJPx)?MXyIRA>d|n_FlcRT#&=GqcIshFBGqLVXhnz83_GZ4iZYNl_~m>WfAYm11jR zjlNi`J}6QfD~JkWp$}FRVl;8vw`xnoLVcD{FQ65J2o_3O8@fCG|HnO>-PyUE*~`qN zJuheXT>roQ&YatPtE5L^+lSuT$|cz(o^13)h7b>llJ)3rPn_nca)CE zAx+CxF3L>aVF`#KzKL3?xou!QjL}e319{3LG&M(Q3bimNgSwHu`EC8X+N(-7P|C0-7k0gHz%z_nmeeBHx(8fVnruGmy!4(Jw6YyOKX$B|G}o$@P6jxdWCw5>}Qh+urrIH0C#*Yn2R4Vd15;vQSx`k^;yi`s-rt>6m0BpUwaw4pZ zlN{Mh;W{w($S;`0yv0$l)QX|I!Vw@I*57NAbwS=#pwfs*%u^f(tF=~R_V^g?WMo+l zy!@}8sG6SVJV4vPZk_Vpgaz-5(Ob}0PX-v)-5ygR^=unhJezM|Jillqj`wT`O5ZLn z$v=RO+;m$t+NDCauwGSOvh5N(tYvpVZghB+dbPvyM6ej|_?ED6EN zwO7CA;rFNjVKe1%^<+btPe%`VKU6Dn0z+j(L%Q|HRAK*DHRzZZTX8C#fc@&+9(A@* zlwnNyf5g@I=Vt&bWR2W|Hj1oz!TZ&(cB!8Tjp1^xv3%6$EMScur}oOyd=HPS@_1M# zp^L5^be6DWrGj172BM{(}lA69T?xB6K_i~Jr|CQI0wCIItgv}M31{gpUq%;Ljn zt_3;=uv~~2xhySM^6Fx7&|i2<_1>t0vOb12$3|z zLG#{;_fNh%sFrSc#7lDOX=xxy0$4jf9>RjJVneb&Nx!CSny~fbq4t(ha@vSU8pl~W zti3d0wFWrJkd@04Mzu_b3A0I03Y|JEA>a|jNCWp@2cHR%D@c zWjKLd6@e^%ue~Nsk=+Ucbi;F{P1OvIXR z#N_J4)v70h{5zP_G)wydO9#D=G5L)7)ARftK!?i{>WMIoffhD}>CT4+zBAwR9#bnd zN9l|NrtczNKs|tGVm_*oJmgU$wZ{2dMgkLrzKa7JSf{^Ws4XCJq~MnlrLBVf}Rj(*q1-*^nLiRl_dk05MTw&SGK=^wRD!y41PjWLIJ l(@!UHS1cSPAg_PL`w#UVk-0bw=G*`P002ovPDHLkV1kua`NRMK diff --git a/app/src/main/res/drawable-xxhdpi/ic_stack_n.png b/app/src/main/res/drawable-xxhdpi/ic_stack_n.png deleted file mode 100644 index ee07bd2a9081080b73f4910e2b63d43d74452ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D%z|9HAMhEy=V zy=~}s*g>H6p@iZ)2gjM(OP`2ohzPQJHSb_eT{mS?lXXDCp1JY&)}=2}6>74dnx2-P zRKG1%byB#t9fv{#0~3S@VQKR^7u0_E;j_OLHFDvre;3N+=N_C=apUc(%|?5-R(kJD zl(1W-U%fke{d}|8XVY`vzOJ)>yRP17@8@-|D=*yAvxtAZBlqg`Pqus4?tH4^>%M<( z+H}?awWVAC?A#l^RdM;wqNj77Z7TH7{~~LKB*JS36i3@pJjN znbBu5Oc^IsMX*emn8Bp*bpwZj@50}&oybgmzx{UH$_C&f0qZ+-{Z2E UN*>kr1||vyPgg&ebxsLQ01UYDu>b%7 diff --git a/app/src/main/res/drawable-xxhdpi/ic_stack_p.png b/app/src/main/res/drawable-xxhdpi/ic_stack_p.png deleted file mode 100644 index f44619f9042c83c9ded5106a08e7479c049d4469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D%zzj(ShhEy=V zy}i-*NC3~VkK!#WA{Yz>nH?&fFUW|pG8?d{@*HsKU|o^nq_ug2@GKmGXj-4C(1zdfsz$^JR%MeO&v>zUubmrU2GUVrb@_brsBqtK}-&XXM+5GcaigaGZ*91Q}=fRc~6Q(A-~{LN)xF|F0Pq zcXO`wWk|7AVe;_EVN!UlDCppnB+L-W-^m~(G@Ic>l?Tg&2{%|At~o0;v>Z`m*d!;! zsG?%VIN|FA4h6-HoDFN*T^Kk!i8Er6%!N%ofwO`;=iSR-x7|E>ujPWw+KiGly;c7C z$!}s_&7Awn_wVOJi67q-)~?vS;`(nj+r9VBd_5FXF1>z3jOFL1gnZ#oum}RiQVWy) YLqT6RF^wrrz{J4d>FVdQ&MBb@05)vqLjV8( diff --git a/app/src/main/res/drawable-xxhdpi/ic_star.png b/app/src/main/res/drawable-xxhdpi/ic_star.png deleted file mode 100644 index a541518683d5ca487aab4f4aa7f780bf7e432359..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1004 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 SU#M>Y0000-9X|v3HTid?zlQIB?(q9~@?2ao_+C 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

Ofb@Sk76QjZe50_$SRGTs#g9^jYq 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

4nY$N0H zV4?K_LcI3}4Dq2RoJcn&eypD3E5HsKvo*35tpaeSTyKe7GcKc~(g|j|PoKQlvFd{4 zSLy8!=}~$lgdE_R3_O#3M{P*aU;lBNrGL--vSMKVbUi8nIs9r6z%)$onI%WVVaeR!++IoJBGgkmF6g zDwN&Ieu@sBI@S%E=NGibcYS>Dnl?22{^yWr7#R$)BG;}uc;S0K;A-ewq%Do~l&C8s z{j@2!{|!hi0j!P6Bc;r*`E9Lg$9)m1r=~8f?6i*Nqdp7xm3D3|aGfISj}iw`Dg;U8 zBN$_gHPC?t&0A>4th*EDA@-+;7~lTFiKh~6A9yh^?;C5z`4aksXFVffwEr)jiln2% zVc6;A7b3i@2*|BD4k*r34VNGdcZQM=KOOlf(WdH|~=pk^Bkl8~5A#D|fO!za+jvV>-bz=9pM4B0&BtW?AdInA#LZ$f(9Yy~^3B zMVV>-yf(K(@0a{sR`RWzkO#ymw@5$Mcww2QY5T7hrMo*ZEMc^tUzd}eD&9~y(8V~K zMn9SVEUJ8S{^V||O~BO4CuXxaF?M&|y;=sxR)5F3Hl@fN z+3t^vw9iNy=dZyEer>Fq$+HjV6wDanlk-Q*5kP{Y%r!ri_EZfX z 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

VX0me*_)`j-Y@6_7v2O$^sR50t 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 kuDle_mgnW;gY+SCPRI?1{!8l>DC5;!2o#v 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
  • %amh1~(d91Q5?b5KFwee_?iib(V}?R<_cITs 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

    ^zMtIq-r0 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 -HIlf%&T3lZ{&K_?%IXV-w4DW`Jp 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

    3$GD&n>H< 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

    RA>4zOHe=Zfp97IGgZTR zNc@;HC9=2XIjh$vQtxDrF&7T3Lcvba*`v_;uv|*risBxeg`%|6kW)de-)3Q@Or5ji zB>r3K%UV+(0@a5owNy@GwiGxG2_w0#L|#)KTLx5Q!YQo2cvs|g;T8`pRszCo$C4$F zx~H*RDGxU`skx7LBJ#BQ89z@+F|<2ahs8S2tU7lr=CpI$gXOT`rgQn7Fqthz&spC0 zG#k_a2`iez`Rvs>d=_z-uT;%1tytJuXl_+c+1ngvS`_8vvCPRKie z85?D+NVfbeiOr!wxyHO?TO9iR$ty=~$+@$tCcy}ixu+z=fLxXZ71ITgC!79QXzo=k zNI5ibt6^C@B?cQOCM?71y-k#)y%Xna5~@{I+}AT`zPw3p-ANMqex%lDOT7u$aZ%N+ z1b}Ofqs{R(s?Nv)ds?YF)qq>82L`@ea5S}ve(XCrPV#~1Tu?R|*w4rsEGhSGjUL!x zjRrv_soe!|+1|)Zj1T8^$aE}J*TiGHQc*K?B24(q_1BrR&_^~KLvu*eoJB*y$5}A= zoKP*z>nf|_q^F6GSL9Sjmq7jvxa0$L@BOUkKq@<^k`mUN2IAc~*jFQPt)t3{4q75f zaB$QL&q&){oC9FUs%^3$-bp4 zh5?g#=(gAf{j|qF|LjHghX1+Og!Fmu77hFEs#~EQp;Z5bz3py$Y7_p`qKK=7!Mpdj zlYkJ+^AFbI@BOd5GjAgpC&3W;vs8|Ovs9-qXUGFrZc8p$1b5_}UMJLU%eLU>yG5Or z!zK!rX0jfqXwS2fC)<{N2Q?ZmEqVKyshOqg4TT$TtyOQ7h^J^{?Nb>>bipY6HM2^A zE^+ZHhiyH@zD{kuKe=o_L>C>hLe<&0wQ!7sgZy?nWN5XfOQUMw_vS!Fb1mHXBwLHr zgP{1eqH!hSm30JbfJ~-vv}uD8D$FT;#)t7eA7$WTnKj{Izsn3x;I}8oX+y>3N+AQe z^-g13)htRY>nc!Pj@Ab2)X1}*=b?0EM@s01)@C(nIiFpZT%Gd?ci@&Kqy2JtRHu|f zLVBsb_Q%Khb!?8fn1p`zoT%go8XU%hf90H+*OuTE+tK#o`iC)3Gn6MgtjwJs!u(~| z8F!9!Daos!p<^-AhxA z66e@w=EP<)ZcG6HnV5Pb2ZX+}9K0w@=YOn9yge0~Bv8Ntjl}z36noZT+n*X$Bv^tO zgU8x6D`l2pzHPbiu-?v^je29&aB*KBIdE3){#~M~Y`Umvq%%w0M_48GkD_gP&V?QK z6I>a>(N$)A`^L{;Q3imqvXX5r8xx$0ayHDl>5tvOrQl->4?a31&;XyLVOiP#Tic@n zre^lLnh4zh4VB1Gk;%%62{|ya1#p8!%{wr(!m@;MR4o;nIxfuFHwH7Tk|V3P2{L=o zn^}|MtHX)op^mLhuyCOGy>DY=G1US1T#t;%lX?zp%nTewB9pIR%BRGqllV!0@8>j< zMzk)XDw@LvO`9hZ8q&(abeJc+IkG|kK!IREmAJiuEg_ZhT19)BL5wQBuALMnD^80H z;bTpaMAxE8R>@W>-pH}96c>>UC)+q~@Lwvn%sGo|?vU}LRO7>Rb@B#7>IH#FDb$K2 zHcQ>b-jw+TXJ^78rw1IB-*scZ-LDxu{-;#8lc+rd6U~p_ zRnjWY2)-|>;dp1qp}RQN-23s6$o+}Kd@O)t31TM4FX$nYFWJgw8HZK+z}A`_YT;lR z+Lua>_3PTmglA4l28=C}9|{Ka^2-ZumDwTb=D9gNy8KTtILZ;C%a({MK&*glKfk^E zK9pQ7`ZCM125X9OkJjTGcsXc3OmR{Pntdk9lfn!|Ri5#vCDosK81-yM4se}kJ6A*p zf(CnUAC7omj6(VbJ@yO;nO9DFdOb@U?CXh>kGV+-c)oqf(>&%zb*IZZIOamPaE+>K z_NZ5Mwldv=u4P;5wP}XPBta=O#t`zv;m8ndJ#!`Bo1NA3zk52zYR0=ThQ&vJ2_vqu zrEDiJHK`fZkW8$Dv1?nwb7q3>W_l8{3vVN35K?<5m0OL;$C~>845GqNY?Z{HkQInt z>U|)%uGe+h%KBJ z04!8#ZYFAkNl~ehP>vO(E_)r_RPOpyK9nfc_jb)X@h*|PNp90~yWZ+<1zRKEB{iAgnb#Enl!-K|VPfw~($o`F;1i9Y$OWJ^7 zL^cxbtiENCO|9bZzjo0paEi`x50(-utnU4!Z;WM_9dS)xOU%)F|83is*hY0s5A#|B zbX?xGw6%3a2RzBXB>&24|4l{FG*+=yOJ&hKdU3HpWg8qf^}ws5wNt5s-BvCUT&L;& zU9*&DjXtmWprs;a8f1Oi8|xvQW{vh!TMorqr+aOY0EvY^-_Vsx)Fb}Ga{SLeW(DhB z$4Nai#_=ZHUm^#5%~q10X?|Kc^}Q$-h>9ABJ3`r2Mu|Sj5k|Uxjz?7_kQ?`5}$h=%Y zu?-D0RQTLdw7A8Ua?E7=8R>Z_Q*^tsV8cDhg)9tV zx)_yY3L1&{EYKB{#Mg=HI<>{zX?CISATUEL<(O6poAONHLlM| z3s(7kTGyAJ2y(<}%K{}M3a?mNm)A@D>vY2p&Nx6b?RVuq3(B1&$v?(2Ibpx6DmEf3 zBeLath`i;x22Yb#ELzsQUq`$iHa2beG%cZRn~4K_dHOdr~2SgZ?Sj)m$e+`$+j*@FTnLL zGcS;p=1+2CT(o4aLCHyjXd~1VxQBFr7x<4?=wO9;F01kAX;cd-#AJ>>Q@E7X>05wZ zDER`M+{BTXG?kX{rQLxr9rc_+h|!Hg&XV4_HFFNepNJ5fa>INn+ndj0R6#J>qc&p8 z$!NC8&wuAcMIe%WL-KsG@?GaLSaS6AN8;>g0UhkLwUMYS_%6cB8WcmcJMMyig~IJk64XP@kM392a7Br5TM5fE$h_;AU`SY?NwIg9 zo8kWGljES&lNyb~+I8=_=g;}s|6KiA{r)|Z7Hn_66RYn8X0CNrjk)q$WZ#@(ii*Y7 zlDkJHk%_nHY)MWeEhQ`yzj2A)NnDrqsWv#$V&d4qLEF zNKwIfQ1TVF`U>9D)4p=K1k+!+cYCo5L$!iZwngjF5c`jcJf!!3gr5JPR;PrfSN313*Yioct?U^j!I+u*cfnKinvqS zy>&hKH3!&`(KPSD!f&!Ec*0SDV!g(@{GHi*%Dkn`d@JsRc~%~Azn8?hI&(!N&x zaHf7UhcfVMgL)uRPLM)G)A5538>#ZfTqvj?I~Gd+rjZ2Fdupd7GHJr+C3WGDC-jq^_ z%dpU;N#Y7IQkQ!>?b2hUAV)J@FKKM!#5>IygsQ>w4r1#4F=^`lyF(Cil12kWA{SZ1 ziEtK;XY3PHuCcg}x4C%`^boOR-_nI{X8Gh$H%wtx;jxS>?X42^RpEWdEE2nBU z`-t~00M7H5aXQS2Q@MHdVnb;jsQ37#D z7EB56D%9JI&W{+ZbpT<9TA*j|kVNmoKlgB}f@;Rt_~Wow(!~#OJ}l!zjpj+m_I1^B z6B($#vIjUXxyG2?Duy-F8MGA(H*IUxZOnX?`QW@rM$LNH!pk7AAYHv>dj8R_8_-#s zfg7jzXXm&i666}jsV zB0_0~X*16z?FE*q)v*nclNMNmn96faqYF05%D+r#P4l6M)C=^!mkZnKf6wXCu}%YK zl&`>6cDCzHfr$9?ZTF_EZk@*8wywN-%szPk*yq92=KX{C`TSP&v9%j2u;GH|d&wVc zMuxR6F$4L%<3cd<`xx#z(-!*I&gWILm|`f+2X1$Ad-^j!R~OdBfu}v}a$_*PO8sC@0aMozI>JQ_#kVvHKT;4V3SfB_^)JR$KBt*|O zt_oKd^AE-|vjn|hPj9)|E1p}~=udCFkPbtMva?{w? z7iKwPM1^^A>uh+FoXtdq+XS$!oK1T6HnU`@8_L=iEzU@b*5w}iIezAm5IL1;UPGV+ z1i8~S^;T7U5qzQiheF`09-q?S`MYLf`sqQsx$$jEn;z9n@oxRvhLE*jb{S8wL4$PI zM>g8^HinjVhTX_BRtv=Vnvs9>R+@atM}%d30+vO=>!II3`taZ^KR$EvLQ&t5wlk}! z7g0_MqvlBYad!cNEf~)ggXQAP&6+K}=z$a*jR%G2==Y=4#_;99rnwuA>~A)a7ebm! zePHv@-;W_EV99o%{q#YQ`DGc%H#yn7#*oT-MkGKv^bI~Orpvx_E8({+7BB!QiDaef&WsVfr<1G=&Dc&Za+pb%b;{o$tY>G|raOlrFN>>Oa5aMY{V z?yn39ue4MqUG&{NQvl>U7Dd#;X}&pRKFI%e1pOW)=a5h647AqZ*>M0Nh*KY*mXUYs zr=?C-mq`ouGH=+ixe&|Kb z60Z#pgSh_CSK+ac`A#1XyUTHKX3VnTWyp&fA<16MOHzcscu2;bC}|2aXSPMvtI}kW zF`wK&LZ5X;U0U(=XHv}PLo3ck;tl$$a zszxp%p&+RAL6{^0j8Alz@gA0pZvPbVUhl33A9A9$4&OP-0w44tU+sFAzly3aisjIb z98Fi_<>~3HVkYMx}~sK7I?oak+8?}o3xIJH760J6!& zjOx+&lYHuW1$!^S7bn=6$}D}FjeMZD6oKBZ4lgOASvdZ9^uM%u_d))R@!>}8c*pk& zSjo`nsJ&`?+rba(ilcEzI~vQ(V$P{9fH=*9J)YoKFwNLgYetpH0jjidkUkETSo_Al zpIQX`FpS-9Mmzu#jG_?8l`#gRGC4K z@dXU2tYIT7*2${Kq$V#W?G9|vUBY43S|A8>Il|`5wIO*U4%G(kV+?|oL9^OhVcv-b zyedZ#@wKm5i!lSm^gny)Kt7D8`j57myoL5!X&W}IaWBXpkI#0n*@dTq%RuU z(gB=fo&K>j|M`d+waZ6hnKv?6(#;7zP23D-Mw(DIEc{E-{>+`^uP&rBII?f4>-gR} zV2()xndX*CB9cn)*gZM+>Jy`T%4mA(5Y#E@s&AKkQKo_b5~;=NF+W}arO5oxX~|?B zIlhl*pMx{O0KdVHIl7tZ$BPowKv$OxX@ibfJH{iTXpad%a!ztlnXN2=YS>aXOqtY8iiKkL_*n>b0+vY*P#aX37QKi zNK1b>mVQvs9`RNIl5(`QWIR;2K#%1}W5R*AC>n5JLwnX~NISE{bvymttXhbz{ARL; zPIVIKeYR@QU(A~^g=-f>>6o}z^Xqg^zr=XodXGA^5V^lEALSlFB0~)L(Xk2NrtN0k zZ!FoZ6$1NUq=_ijfid<5{^Yx^d?9)9$$n{Rx|Dk6tIoQsSno4W0!(I!rtIbQ~4z4rdxcb3e`MfRGB z+*qrV`s02Q;*~zY+H45jq#{#qWZNg39)ECGKXoX1&*xW5NmnU!$T=O9-u3Tiw$^SX z;RRXUce7oY*=uve%H>wXt>4FZc`Wb-LL;bL~hRv^Trj7mhm|` zd2oWGlQN&f-}fcT+zxgGxf`y^?AL6tLu!$+zL3|AjMK!xm3J4>xWTU8Q22V7sOYDs zUZe~Wy}skaiu-4{2}}=xFmm`dSxlMbzWp^?g08tg@j{jOULV{?FPe}1y>eiK3>;yINR@=#Ea6`QOsV{zyf*%bBc7Poix4k$4@F^Boz zADTe~{)Yji@0g|s@cax5FlgK!`fXDzftkYKIzXF_d_~B&cAXuu~ilG-Mh6vlMP7BsbMoPCuM9~5~tYCWIVOLbM~H%9L7rN@%j?c z`XcQ9f)CP8$~E)9<5%LaR*V-Lwx1OnGFHXYR{xX8K*dort@8y7RMyp9OJLv7{VHTy z$Eq~Z0<#0-C#v}tKNW{ug{Ow_;Jw+2_Yu+iGSWpssw(NSDXf*IoAlx!;zOU=hr<=H z`4c6t`E$=n>2IK*UDVeGm+GaN)afMznd2oDG~s*jbwix~z2>n<=dCI4%lDuwOJUlw z8)`47|0+*{CCVK54-Z|bsSf>XSVrnKoSB{FM1mrsW%m%#rb~Na%xQlQyBg0NH{C7A z1ZD!p4mM7G%(^%0vr(4F@Lu&TL_PYv?QE~?xM&AU%nRzCqDH?Ra4@O`%@s5C8Cr^W zwoo3){%H6wXe=L;-#UAS@8 z_tDY3DYQ;^yF~0yF$q_jY{K06sK|~0Sz)kUDSnwb*X!b;&vo|ui!x+nywR<77jA_w zD9`TKR=3(W*o$_pp&^1uZhiWpQe;SOiw1%DB@%AKI+29tw^^+pM)=Xsa;UMCW}}?v z%nte7rc;;-E0wPDrTtKuzn*E_@U^V?kbrfRHj0Oxc-h^EcMuoKtLuH0XbIzTPCymF z*0O9^2FI#&9gbR~T#gcdl1tPu4kus4s0oW?cK0vm+U2gdF30}768;fGiY?#-O}UiwxJw9`0`B**fVE{N+hLfPz47-DpSe1AgL*~Db8W(F?5}B&o*M} zgQZ=4a}nIynTyJ1v~QL};z3-<_z(&6zvl4SaaKLeBYOka@7CTJplX`}=LwfwD|l>J z5VImBvuIray6$K#MaxePXG5*^TnxRQx%3OpA@9G~-i5q~UNrOH<5DA1!kG#e=Zl8( zcb%MR6f((F*Z^(B!MLK;Pzh`YT`)A61xG#f=G7<3>qw+};frv?)aEi)Zm!=VlFRQL`FH5;5- zNl?AbpFyAt%Wjz#Jy#r-Y1pq5|9p380kMJ8U#3ftDa4udmhxJ?De~DtmtEjP`1Qc) zPNU~3;h*NyojuRf6D8l^mtW_6K7V}wYiAbne~GI__f5G&@=O-DfTl3R|cU1fuHRH=dXQy z&bc1hxAY(RkEj=u&yai)E&BKfoNl&`yPn*^XQ_{Zw>F&y0>8?uv2ILHl8S0?CMwx) zDtiWQ(c0TC@qH4nKRsXZ0AG6I_3EWuDZNK{`Rwy^f4c7cFe~ePlQ5U~Fe{;S4ANUfJhHv`gp2m@v` zzP#UnjlbzCc5gmow|S{uTyiVF{McsB8$kVr4@YE(zKn5~zrnCcT6o^RkXIyoIlBtI>Oe-t+O_W zl3c~pa56Z(0tr?PF-OPD=Hd}JQz1T z2+LV&{UzV!ZRo5W{|hxRjzzZP6X`iS#YLT1>4g}Zof4syJiA4HdAXGI-VxfxwH>wiK+hh^IJbX| zH|Eo_-4;Ry3^#vp*!5>3?w`IB`b~W@xa-eM>>3Z z_>0@x4M->J_3ULyV{>}Xa2sAoYL%T6-|~yb9(*QfVeof5H4&E*;6vxQ1pSgPa5vUO z;xZ(3Y6{&jb#vz`omRKGuWNCd!71R5ZgCnObLicI@pB7lw6*U)@|>WrP^VLz?AVc7 zHc9+gqNvsW#nD>6jo3LUbM1t$$eN zvrwgq!KUwHw+*ioZ1z7Ro>wwA2-I55@iu7j~qrH z8AOL749^zQG8V#inRc)L*u~5(%7Q~(F%r{N$@*^Q{I~do`%Fo2fi8J2VIEr!IGZ{CcQt!f&5Axfmv#|cI7VyKT;5s{mYS0jEmsgz5z@jlx;?e=NlAmBHOTxrQCpQuC1ztv0+H zHoX$MiI;*it&>U*l^;*Rr2Z?>M!|KYjavA#u1)x*e(~Sm#)UZ;C5kfX>I+LS~6*{Dy2`!xw|t%YE7^le<)D zMy7B!-S}0H`fyZx3)i4tKmISOx&cg<3>~+F$;=b49|KQHE%}XmGQUB@WhKexxJPeI zyQ37>x#am6PLY^X2HDUvRn5csnzlutSs6)^`6rS`Ak=ca?Bw&Z%>zk$;jEu;;uAkP zkxb`Ae6L#%EJjK%$ZgOdkj`4dZC)pEhbhQy&RDwHjO@;>%R;(2|8S1#FrBnLatE1Z zHE7w%t@eU*`Iz?;sLglGgT%1j0oz}$fis20qS-WBMU7wf+ZJPD7xq;8kYzdJoOm5J z*(c2%W|7un6qjL9&JO}5XLuR&x*xks@nqhntA&5kN-y-slH9jw%owOKF+R2(w{3<7 z#kt+{+LhC*1tduakcnw$Sjz>1@;lDYy#|LmNt`FD=Y&*a_;vEq%jB4rVq|s8#Bu99 zEZKyFLkm~#u%8z`(6(KK{j`Hwit_2NIGUk`TQt7*e02`HTWxzeUqtGw+WFWW7ZxG5 zCk>LuMMa24hX|B5u)0|c)L25?me4Q%Ob3CaPWHwX`*}aDIKRrzI%!Z~0?_8N%`}~m zH5+@<0e;2UEj67a7d>p3;s!aH(B|%%#~GN}nf3simzFQl3GNAw?6mi&^Xn6ysunP1 zEVSrb5Q9MHc=VT^suIuEJx&8Ts-uQ-{!hp084ije>J}9@$%n}W{7KG(EEnwrK1ub+ z!b9^B!tFI!Sa^SX13sCZ67D^m?ht!A81^eawycsq_BY;`KTD1KZYzzn2l(DTE1iu9 zJ>f5Zo{P$+{)407=JoLn!h=P2#p(e(BImqz99`{JxGMK}IU8|1w>NVZk>GkZP!n@H zFgQX}bgaqOd^XV1daM3y@L2bqhy3$w7&7`z-|4FqA67d;^1fULDmKLf2mXVnWMM@4 zgzzV!K_q2c<7lF!c<`(1^{gI1O`-@8Yd$Bh_r_{&x8-?fw0GpEO= zdY@?D(`lB|nB|90&nsY`0N=Z%oa1y+uvd7^j= znbGlVa^QdkiMbc)-Pf$dO&JT(CIEqK$%YPAH}@Yig^`CbbTL2wX(Vkb;6MlK1F7-) zJ3a48At+!)-=kbYVP-}kEBwBA<8o${D{`0ww)%xK=WP-WG>y4n6iJg^JPCV4psdrT zf8NCnXm~`GtW7lyj+5CZ@+qiM6^%3{xIh4A+Y65s*N1KB6H#KuL@o@+_1>#icsV@| zy5D3QqTR!GFF2ZyznHh8`lI=w305K}4NejWjI)>RDNK+`+%8a|P;XY1i#1Vec5jR0 zqO#sD5RA4;uglGh013iWWXL5^nP4VIi+Ls)+C_ihWs6L+rTP zv#P-))Af3>#1^B13D~$>@yuRP zck)q%XYQfA6EiXnhMTdmlXhy+(2hBab;{f~vwn(Gl$g}c!ma3etYDGv;691J)co@F z-;OicfxkkcuJfZ z9jZZ$a+K$dSe1LU&cm*uX{0&_5;J<}Xz*(L#uus-(ORN5_Q1-6?9=Dv;MGzidx^PK zuIvxJn?u<0izERTa3aPT$uY76aUeHfTz`u9q(m&d87W_T-d)E5J{2hM%Cw)iAbwoA z37JDs{mKQQH;)ea+@kK(JGc1~NzLg|8+=&^!^Pd|(>eay>4h!}QJ7o~$KhXI*Y=P8 z3kI=Z)ny#eCtRpoSB43|0PFn3KKE)Q1^zMx{WCxR!$lJt$qbYFgOg( z1eY_Z&)OAtiddRCq19)285ncAPb$b$nBf*#%u;Rwi z_Qq|&9#NY$f7lx)GlyVcG!&m-=Bv7bK2yXq;{lQP2AVNSp=@ zNVX6L!64DZKMe({r`L7y&@g9hOk26>vXS_^nkW-vrA%=UH3FN(no=buT}0hk6htaD zdsb&6WQe7SokCkYdRUHQF?U#;voe)OE+`4 z<(_dG6bXmzSdic7->41A2aN7HX!VPyo-6PfS*GHI-dPb_C>z#3Sr$D{qsZyH<%1b@Z zGp>)vBXEE8z(7b&IGBG#dT3TOQW~(>>pnUC`tJHBZ!LZs*RAq9osZKR=y9%J^K?Lt zVqKG%VnRqL`^Y!QaQi5(MlbrhxqX*3)-;CT1Wp~)d}hCec_Z;7{hXup7qxKdMb|ZS`p;*&{LnInhkrrDbL3%lq~2IyJ8; zS7LDUL}m2_&NVa#LV>9bKg#p0sD8%490?0uPgq)7v@%3_{lGW)bRgPi)|jYi2q?O$7>8dSQ)GBihMO2B5uO=tRN7Oz7|1Gt0Jp z-a0W5aG?%kCIoSP;v;^G+;OOz;7U8x!-SpVoCl0CE!Vv{_ zWmmdM4>Xq*+*lWXZ2cLIT4wd{AwQzl0dqXuteh?fGdqwlTRbVwHBv~Jc%h$f%7-T* zVRUROaJeiemN^^;VHD?51YBJEM{{QjXuI&5KFbB`yckH=JufvZH0|@&$3vScRCl@; z;vbZD$_*z>KBFd=csIM>d#i~_qGmGPa8n-OrFJPML-~WX8mYRr5VBy&WT>oUBcXX} zV9Jld_2{_-yLXH=&SSZGE|XQq?$lJ#Mq_yqTrN>~`}3c=TgdFh!ocJVlh;>IyFhsR ztd0JUgGxGpPmW6195k#nFA#f_cSQkVOD@ zARbG_kZTqXhw9DSXvAz?6-2coP=Gheq(e%PY=ruTfT4^)bPefwh!J`(D>qxzSwAb; zgj@wuGV5lvQHLPQdf7;$^kDW3zSv*S_fO<0QU{I+paF0aAhaMb;HpMfoHIg(C~s=K z#iqyXJ<#4{$`szuQ($~|OL@qehnadm{a6$c|nL4c6tI5>}ts1u=Pf zG$O0J@A}TvGL4&%rZQ>O6s9tn)k2OX=9%-iF!e;eGgQW{rKay$D<+X%T!AwO)j`>n z(fW1<3V39QEz%Yv)6D(rJ<-1#uJyR$_k@d>(pPnqLA*yc2zRWZi!rY zoMs^^Qh_beNs#bvL79Clx~fnS?|$LihkfyFXF|pM)Kil=%9e%XsF``@H6f2XpKNMe zPkqc;(?a;nrEvp7CrA*2kK=$?KSsH6$q#E5&Z`0cdzv4sqTk>G+8iV^OW&DZGpO+~ zj0tFmFo0oJFMN|=j)fjm@G-&KLKeI<2lP2nVeLy zvwOqBEp6JnOXK6yte_Qrs9dvGi%EYsx<+=<;Y2i}z)2rGqE5a=ASGJ!UiD1pfxczV zP3>*}POVf$`5E4@v%%Nv?*y_IV6JGDN&W%x*~&g+K17_N3?p;LxAiZQv2=!?uL)>A zpW|nYTGdoH6x(yOfRcdRCRm&?>T4YjYaG7hUygZDShEax8474+*%Y|wU<0K(!WEy~ zY?P>1V)M0cEyu+EmitK~OYStS=}=_uEJUo<3*DCU?KuesUKi3fmEjjuoHaQE>1<2A zD(dyK5;IZho@GJP=(GX{wI6CA21Ri$Z`K{=rA zUaG;aXjM}_iKGzOMS7!rxH||59h`_WKwnR0noo7a&6oPM2Shn#^Pp<~s}A@fCW5nX zGqyhnMWTZx*e!rit}9a@!59O*Ihj;ZCSmEqCI8fUsDB{`1Wer2^*6UJokC&e8z{}~ zn?h^rUB_)%0k@`OuO72jS)bW&P>#Rw2L0V3ga6GPWB;?Vnwi!8e-xc%Skr$S#s8up z-JMbbGP)U|bjXmB1`&{u8jR5((lrF>?$O;TE!{O5BnFI-27zbK`(4-G{I2g^=W|Yc z(y*58(`ml>w&s;|gtCxK&bCyvpD*u);bYOE_*Fe)zy27+H}8&<-B_?y z)+p@KaN5CRx3~;>)^?~%eKCmCcu_U+>F=HJ>&lS*lPL#`lLotHQMu}h z_n#cPqqzG zI1KW!pMJ%7kZq2P@zT4TZGYt5XL{3Xa{>ORE*z<`i}42@@6Q22$NT1Zrg2?@lLe-N zUg%+{aigh+5=@o+bvgG1EM9b-ihbRm6JR>Je-3<25K+yrT-frO*wE&;NRjg$Ry1S* zD8%nG@@W?<^h+hj2J+Dk0oqS{<`~f9J z2VevI(~#6Dl&x76kO{=TSyR|e%Tn;NCnH~e(q6q~9h>EakG0cJAIbpH<_XDsb6HAH zNLO%$-`eWyL-K1*6nSg)Ouwlh$+aK9di_aM>mGVJ%)nqey2`D#cqXm8piJeCA5ckM zS1yG6Zqmj&GVAN-GKc$TlY8G)eXndYXmXH&lX}r%&Qq~}=&FNhKynFcGQbPNepcxn3)hwI~4J;h_ z=}Qord;WpP;Gh2Pn;Bc4$yuU*@E~`mpozg}-|lydpA2h1`-0z78&h}RO!EUq84z*O4OU=-+rsZTi zI+w+S^ZC;AuX}Pn36l{7;u_4~ZL|xr_4Bri4Jb^4b?L9aQZ);_onbxo`x=P4!}dDb8_exJ`YU_)7e(@_idnp>D#I_j8=ys{B5abq{!z7kw{)1IAu!09a7 zUKKH8=c+@WDnFtnhJ~MWUu11zJ4R`Za0E4Zq+IpJ`3??#{ULWhQmdOU&S*XOIr<*L z&D0fLTO$ksQRWOKzOHrhZ6xm9#J~q6ZPxCP!-$yrCqUA{0oCUdXD7T}kzqcX8(hYc zS@pZbEuM(9Fq?=yKnu$uHLTQUz?)`bsqQq7hpuYs;!xhsGyf2 zw4rN*D;UO`Kl?HKjZMvmWB$AygTBNYT<82nb52*#i_9upyb!ajK@tzOZzY_fNtWp@ zb0$G!33^IY&i~)mp}wH+V$r-u)P5PU*NyH{?dyWGUL#s3WyENta7ONg`XWQK$-=Xe zDj)BmnrCWnH+vI+wVqwDz3Q9y{2lZT~psGY=cDdZld+7uDITj^6 z`X#xDHsV4EJv)S65k%^lN7mVuf!iclXKYyKw75JPVy> z^3JRwa*vmAq#e&PncX@`k$yyiecJ$?;b=E97Fu(aNr;$v!=T~44kNY+6rO(l6}i+q&M zUAd62t%+81bIdb%wTvLN8ePKo_UoP;2;hTReL@ZBDvz?0(sRR&)n^=JwN^fTJN0a3 z&~K4~{#VucHJ+3|6JCpW7eFf5oPwc$;+$x6PojP0o&2KdT7>M<6X|33eOF)C@;$j3 z-*Q+GYwDu<-mT&}iSLXXZP>n4m%T*fLkH5cYd3}5%(K%)EQ@<3O4+TmuSy8Ik&Fbo z1RPUM+pIodwh3Qth-E|?HNTAgbJAl;8#`Sa`^P^d%#MzzKOg1)^Ooj#e=*eIM z?6mC_yL;RpB+*vrdQ`<*(`*@WU4wt3dH+P19Dp2Ebp^9(B!erMwI6`p?M#J9>5-f6*7K(U`*mgLrg3(tjR^MjFnNYLnF|2xlletYhd|t~ z2F7o0V?=|cL|1eFIdBV)Kg?HP@^{kz+Rr2EJ!iyMK%Ub!=6lSCK8DK|h3&3T8=eje z;`*fx&Rs0Vn>X4RUiQ`=_ljro3AOf2xz|@H0{yCH8j;?R(6A{{=~s5Y8UjIgSqJ>+ z>J5hf$)wfq0S&c|pE3mlaexDWqtPu;vg^DAJeQf zdS{)7id7Zlg7;pF8m6}f93ZGms#~c$loq^n<^@nE0|oBuQ%VcW82QLyPxSR!J)pD zOnxTW{NN;Bc%yvf$a-$QrK)}SbOlQGBcfz`58M!KHm4gQDWZG0uaywZJAaI6I$2Y% z<0!dOG(z;6IdY3_S26sQz%nIR!_b3at%a`XQne^JhIjiIol^#^qC>0ZcULnl8PW@rVI}E*3-_%x+ zB+#t>L##6uWw*ZV4wkL=@;D+4=YqKBzKk{kVl}?<8)qAcCgT*Nj*y|m^a$(M`d#^l zeG4H~@Ux>*n~ZE{c9dv8gI^LH>Bd1}t{?4>ED{%SCsQ@vdEE6Sq1m(O5(6NsrN-ow zyyuZ#kY&exHw6FDWw)dV!HDh)RvENBa>Sc5niDuk-^xG&S?b-d*U0asd_RdwNxUMw z7j8AJ+rL)kC&r#}q3!6zfp~Z9U$jhZHsr5GKn=A_@c$J%2E_J}Lnlfn zp;L=kZN(E4YXC&Q8b$xRm(=%W$V!{vqYecQ&=kVWLoiryAG)H{$JBBl>tMp~FRf$4c1uhas8)wt< z_=S90kX>k%Gv*@i)k;i!|GNa9t9;Li&{ee+Jx!thzV7xT!kw>a$M4+eqpmc|Jfe> znE0WCQe+zg%_DSHsf}%Q{u&4@>a2SOaikWi&pvH<_udrMJ={MXQ<*M#PRB>U%S}vJ^gYLug7(T&ak6M8ez|QUJ*@%Hs|etm zV{7E?>I+HMzv1r6F3sEY<5wnccU4|TGGK08=qFiZbQ&FuE7$N5DJs;+GO|Oq3f=b{j!9SS~vGq$-BnMP#R>?oT=g~NvooSb(bQbpKu!CEgDJ8W<)mtVMZ|AO6 z{xQW!j(a^ixVo{&IYfJ*4CHU0*9xN;KJV)VsJsEJa87e&w%a@IZRUWpSgP zN`h%-*)%b9TsvV2Z(n?*(5QkLg{$@F_q#Z5{mQR#Lgv8?I!Ae5Ped!ZW8LVY+Ky^Q zgWD~^@ZKq?T`vue7kt{fr3x5|r{_|T84rCE2`gOPgz1P+f(4mT@eytL9eYk>9;DLB zs8Q7PI589lykHp)G=l~V+8sGa1!~$8ZEqtiZ<;q>$ZY*?3q>mnA$Hea9t7H_T=1Pm zvS3u%lfkB|U@09(G>_y}d&iblEEzcX2DWK&XXaUblM~){k4J>da%8YU!AR<_=kno( zfai${tx8e{=~alMC0u`>Jx;;ax3c}tuo+vMpZj=EpQ&!E`ho`iil0bfQw?j&U@Y@l zri6)w!Atll+VEQHXB*wbpOfwxOdrK|@VZOa*e&k$o`1;tpA*t|*Po`$kZmxp@ByYB z6`)ZVcbiOBm;PP6j=Ym)?)3*=%YxrBKkf^o-DtU$_rXk%Ya2i2doOWkK1SXR_h?5M zwZSuk%>~caqa5;N&&csuy!ZU=L^4X0L7I~?S!`w%;=!5-?V397=h;mrzx2nbTyliS z%s*!K#x*)vMSslin+t4>cm{E?LbOx$j>s5@7V&p7{@O3qtgh7j)vx8$6~%n95alxE zJ26M>s}J8agP%31-c$wigU3{Y2uxysdGMtD3XoO`h$=>T8_ZiG2mU(xPN`@yWQyJ8 z(1p_|vU+CR=g-_1Y(shf>xN9g^1ptG-mn#8Z2FK+A#FkD&06mi-6*z4nF=qUC-O3i z(_O51A6{SQG3FJ}UJ?-QYxtqR$*&$*-=& zniSC#!C}fnM>l@Vpq=b0eb|5hJzc0OywlBod~mF<^^BP5*$VkE1F(*dkj%8I-MP=1 zf67f^C(ds~>&ik^7PC4xnsDyq*HfDn1HN@>6x1KMbU{WpMk`*luTXAH!*s62Lo{>j zKuDeGO0mGW*JZ((YOx~YNT|g1U}QlXUF$cp2>HQ$H@MgP+WY)`S-d8amG^P0Rzky| zg4fPsH0wGDF4cuU9ck20vQhOyQRoBk+2zukL*3cTxbX~P=*6g@+Wh5Ihov`sf2k91 zMK)8e3TtEw7Qz_73$YWUzx^1@(5nTde|Y^l(oBIs;){Z6O+6V>o-bdmHkBsABt|}a zhRtQT;v$Z!voi#RXmY)5EKQF#{IiO~UJikjxQi8hf0OyroGHmAKR|h!H?`R^o*_W+ zCWCxvT>jWHerHacuh)+pu~&&#Iw8lt-N?$kP;c#ClFL_y{^OBDS34l`4{REujc*A5 zP&+O*@z+TQz2K_LY*+u?;)%W&^Bx?BEbpuqeNzuj%YMHo(CVVIzcmIxj4pg=D7!S6 zMeZ+8sX9y~$dp-Ss-0NdarEhg=mj(20Z&Lzl0(6x7<@E$4Hh?Rw|kYZ-Y(Cl=J;{y z((%F367#)Hat2M?9m+5Bo$CB;k8R5-W)B~e$O5U7p}v3tX~bPLx5eP!@r~EbvOrdi zq)yg?|N8P2CQ4L*S?KjFVE<04ZXc|XzaY)p%d7lh-%Ybekm8#gf@ttP@qEcECBJw0 zK63jWqj}4ua>?#V;eBC%{V$VaB<{RxyMViPfs5u;>^q4as4HQw4vA_6>I`f0s5)=X zS{}Zx6d-$aA=dMbZ^_938P??HM{0Q?@8e*RL9G$qdZtKgP7AXPmprr&kegpxc*$lI z12&`KZ&sSo5Bs$9xFw3kFE>J1L72xnAJb?+mBwOf`|6-)wK!rj_Qp20+u`M#ARf-M zh5SW*j$XL{2G>=Q=A+`bMRlZJD>8GTkt#%`pZ$uXuks*8WSF^xcY)z+P zivC;>`AY7<^YLLgUZ{r<9Eg}%qRfG?_Bpt2MSIa zZlxg?%F=Zc=pKl-+5M ze2F03pi!sIs<%QbfHBAbN8xbCR8K@!piMc_6M96N#iZIB^-$v3at<(qAKtwiQT1Jd zV%-C^e@tfwM#njjOGX#-k~o1$2IFCcrV+CGoaZ}vE9rbHrQEr=s=94zAGUcD-_$mY zlLq$dvX4mS4eJHkbA8r=(K?5GP@Z5_E*Bt}9T)Z<4t{L}4{W@aFEq`}Zd704l1|!$ znogdHH~+jwH+pXiQ$4yW2Er=m9}A zXZHHF*oD2ne$f2g08Ys1OAB*ty|RB|QOj(>h)r(Zm+4b2;5?UhrJ5GJ<#hd%JDC;b z+xp~{1o#tes&r)=`in(#`inAeRI|=s5Opq?B{8W@JSzh4#kKq(SEbs9Kx@wSZ%Kx^ zqCRw)MvonG695$GI;&?$=6gRwLmj8o;*g%Q=H_{*j(5Cq8S+NVSBea zVCmU*_F~ORCiMrjYLuw*jxtev=@XkD)~z$Bhr1ugb$ty3=(FeOy9Y(W&Mf9E+EbcdqWi-jeKn%(+xQ?) zmHFS`EqjkCN5 z?Xk>*^`nxj(Zz^g22o|22Lk>^qn8X3AZ8+0CUjpBNMN5i%z6sYUYnbquG} zLcUAIL{F_a^Iv<&Qfw|J(VZnI!f3mzDhZRRJZgob+?-{5W#s4g01-C7If2JZ&(;G( zfP)kB!pSEDuJK#QIZ1U&c7v1N4Z9)VId4m+27$3icptsSm&a6 z>lfrrk*#c?lehA*Tt}Bq@wq!T;D|cOg9QbF1agpS{{IU4HTyQR`{HD302xKwTCBrq zVMFQR5!Kjc^Q?~G?oKw?N?XMdIK{VW&hNZ9**I!M&45P2YJ>NL_S^ zl^3T*$|CE9)Pcv@>UaCoEU}WdX~50o@8qsAjkuB`s{)GGoDtZFNJH%s(R0^j3$p;S z&RsxzwD97ezo0Jt-Fwz+&LN=&>(1X2tOq}k;c)9WPCwlveG;H=;@>Aj31s9~MDAiR z@K+X=iD(3y%qJ>R*wa(3SWfSAMw+cS?choJ_ad;^DuGqLmicsfcRp$g3%ELv{Rn+2 zOl5DDiDh4#-=81rWS+CJ6CeHiUbR^xwYNuo02wlyF<&Y~-$}Y>q<#Dv?Ny|T;Tk;I12zD}$A($-9K__ysQh5|S%RHff zofua8-j~yE0N}mr^h==XPc$i5?W2PlUP$~`T&HCaf@`)`4Zt;&K&;5(Q12yRPi33h z_ak>_Yfe^iv7fa}7m~==NJ1q(@FRqd1XP!Iu2dxn`!D|T1TXl9?GG>!xBb-*H@ju%Ib3(L zfTAdi^qpDiU7vSbx5_{!ZVklemb&9oi|%_TTGggRS)>VWZvTjWwWSc{Wf5q@(pyRz zbVMUcAimF5EYZwQ_yRGT5yW>LWVQ|Bll;QpTf6-i;SZ;Z9GkeBpB;L_n28>2uRs>R z=@hE`Nac???;>RMUr3`pQsbcWA6TYgQN|a|z57s2b))jg>O+^-Ne2e`vXSq{ICM%Z zW{XL$3uWm>;>{l|ClU{oc6o%yN!;_5?hdy&0VAyO7~Hi^*8IGOSZwj2?l||A-Bx>r zd2n#rC4yh6q{F#}s$vRS@)x1P_n7g;h{?iRVR0_lhrJXQrKSrK&g(M{`K-xqFQ>6@ zMDy#EfIGBmc?vD)4&i(hv@1dTDS8Xcr07=NDpe29*Ci_s~^0OF16lQvE3RrmgaPEftT2eCtlCZGEiG4iVmmC5@?@qsw=r zlQRFf9bKy2KOa;LT0Heq4}Y<*soM$G{qe7O8z5sR5rtvi5f0>))Ka-0%_vs(&Y?8? zsll1kIGyVB$0zN>fphZXgPM&GcuJ3B3YzU5}IMPeDO`&3KXTvQYS4iED z#^H|I{sWo@JtDR5{ItK-+-lFlvfnm6kv?b)=dTkr+p{MD#WM6PyEAQtB=Max z)tU`d(Ly&P;?6zor5H40ZPbj8&Kv1j@FoyjJ>%Xud@&|HBhO1bOSbXNoTMTbz7km| zZwt`xOT`L3Ae)8b+5HM>v`j)sH~SMj|7socy-nqleKyjnHlSmR4b%?|2ZUNP=rF-S zeWr#in7Vps*Y&|T>!IM)^^p3q^y0QT-tgc_q5BBs zwTH%E``5>th~As))f2Tc7~td)L+tfIuvfB+Jm2)+G&5=bdwB? zwR>Wr`>MIITFUBKc=5`NQ}P?f`PJ4`hN-7iKsI)hGVb-J*b9<>a! zYVU8}{_X7%f*hsO_sm#_o#~;R*~HiK4<8>NoZ7KkYpn$*rhN6{OV zj{aQQ>GG|`X|wbHH9twh%60r!N`|We_=dA{KFFJWXI7nUJF<8BXz!pwjvg2*D%{Ba zJ|Z$jU8PyvyNz~XIi(SKGD&-P1rwf$Y67XB&Qlt}@f+2%_0Cf%y}cGJN-V>ZowxZO znn<-3HPV-x(z_UTIbSiv5q76T9Kk2%4z>#-j9+G!uUjR>Q|`l~5p{kor+10q*5fPp}4)a|A9)&j|FDzSBQ# zTmG;mvLv|5>^<&fuKHnF|1StfQ%2S_w8lkvMr98k3TUL=`hIv%NMriF#PY*nE^G(n zp!Cl%PhopiAlT$*woJOh*KacCXAh;@oA=|_>Z^DUh^xu#m+%PnF4)Cwk{m#IjBC4e zF|sAH_RVl!kvlR8pS?^^m?3{czvNH!9X?GqM^J7x^Md#rr)V?bRIoQvmyOK5_4iEv zF*&Oc9nNecS)9id9afw%b(BB1U8}K{O#^CO-Zif8_``NgRl;{_acL<1GZoLkyw{uhs#wvY>e7 zxuSpBYLD&Pd`(0UfGzOFSbIDrm|Ig{7w3Tx#dl@!n7CUw##d`mrT*5 z;n9&-Ixgv~?Q#o4Dl>YH5j$SZDkDyTm9e3*{nLLnNUQ+E25I0vI&Ji;eM zh(A{1)N$*R8114eNBsXm#yW(L4GrLXE<%|`h5B_HB5eFT>J#%XcqRrZOc1XsEd;#@ z$Sx$Z3np&JquNtN3@`+u@4kFWeN|K>Kzf?LVEt~{lP^sfICZ?=zdtK(sza1vK_s0l zgMj|GhW$`YbjvTJDx1QwKX~?sEwmkQ{zc%x#*Rwv{)P=P@OnzX>318WKC$#MPEV{; z6Z3(+viAqs`5@>uv67`3vdSsgznDAJlCXq)kW0km))CSTG7xCAMO$EVS|}{Wpha_y z@A>w=2A!HQ1U?}++v(2ykLJVdeDROVK8lN$SC_|HdRkLUM+MntA1cZR`{#r$Yw-A#6%L>qZ>25JKEe#()iLjtsn#GKslDpz|vIYR4uMWr8cOR45E5l$bCAcHW{Kekzo-EAXZIIP`m#-Qp7x zTIYW5#8a#{Kb}C(nj;tUIaaODB_J`)u7F-l@yPECzc~asZpCR`rgg$%CF{qS*bU*3d{Zxd(slGr?lEyd)KaRA)KWz4?n_PC2~g;#(! z@<^2x`{uU3HKYxE#h0)ti{AuGUXwwNIjoFDR8k$fbEjA`sJRuKawsLP*XFS9fQE0^jVY>?qb7x+^cC|u7foe9%uMhmWz!>SVzmFWIkR`yQPx(63Jl&zH%Td3;wM7t z-hCFo@m+)6SW8Z|Y}5y_j<(D0&iCu4Uq$2YLklb|hVD1&Em;*)s?@h62l9`o<3hj& zjA>|8#tW{z%w@2`{wI@1p9NLRbNjo7@|Bx79gRGFU~)*tlmoK2y2lunWQ!-6+@`p@ zH`z*s)ncGn>QecHF@9BuYvVn!4bj8}xo7v{BzdmdkR{sC$nS$?p`pQ+79O=v^gM1L zt5qbUVx+_2d$h&NN#4#q-{!0fC5&YK!lZ|ahwG;Jk!`I67*ET{KU{Oz z@;{2Uui;x@5Q_w<1T(0&{X|dKeIG6Ky{KcS#NkacCf?XYluW;#E8d6PpI>h_g-H3o z4ZYqw8Fa?&><$VEJH_U?*X;5lecIX(x`~CGC4MKW(q$MJtk^r#Q%+OJ1e0LF8t=;= z0nphRtAg#qZU2tQ&Ow9DM1~$A_As_un2s*f@M_S@^Q(n^iYPddfoJ>N0bjlTL<%(RxZI-cj#7&ohD#^1tC6wLg zRAp%aqJaPun(|eB)%N4 z;gPpwaagX}4f=lCng*1K%J#?!7z&Y*L%o8|Wgm_$rxu|ecJL2= zizRjq8HPQns&5V;HE>mlx@Mt#zLDx?om#~gYNRE3lY8vxPx8cI@;pnNRR!aHNu!{J zUwmFW}1$LPPHz9R##}otDxCfb~v2o5$qOE11r3yV_z{;dZgPJR*psVl^vzEqKZ!4$^^;(3SR%=BKsl<+D^2_ zbdo$3@_+Pvy5t_hS6z)>1PJU-7>li5XO)~NOtS}P;+RgS!kcj0WGm~1`c{joEwOB> zXt!X6v?KM48qd9-*`VQ($wJfGTeUR-w1iI!+0t7lwsqQ^>Z$OGi8T)JT~k15FFu;5 z2L?+nOpna4L|;{urkA(2?F~cXp`-hvJs{P06o$41%+7z;)euM$ry*iPsxUYiDTobU zvuZt*1gB6{#7riR(Kg;gfK^akRZ{8XxkfUSB}ur&Qo(ErJi1Oy!j4Qvw@}3ZO4(=< zup(euT&Rn;x;p*y?tF-^nrMxhsS!>8IeAAJQH{UOoHnv?r{rtO`JEmsd1YfOi~99JXFv&sm@G-I?%SEK2Wt zfFhd@>#^)4<<2Q5cP{c54twAJ3S+E#9+UKJHpV?~S@sQsUhIIau^SZKB_w#rp9{zO z|2Ui;uN5Xd94;nLtF9pIu95r?4JXEf6f!@@U}j;C6L6Q8QQmdSMy}nys~^0Zq({Az zN6QTc!*3a9`7ZLj{Qo1^WK6hE|FBiA7}JGmI%O6yN@vdW&E4^vnS%l8Rd?$w-u?7{ z^dmvlEP?!1}{!Y2&Tu0i6 zV}f1}YjPRNSpCo!@@to@)oU@o5*g91!JWYA??p?Zx?yb!uuKoJ4XF;R3|BFnJ!Hy+ z4;^^kFh1CZ5C8JU|-Z*5rJtZ-ZKAuL7M~ZB?x)sxoJg7t(8i{ z{5tL1m(xRImvw&77Au^6rV@l7{Mac=M7ehPQ|O>L^QrhNUl~g+!7$Rs3%7^U?0fs) zl8xWdoq_d5WsrQoo=MJ&A!g1F%U3-McUYjU_NPOhT%A{<;q}`pKwcGQMb>h6aqE&n zF5~Bfu?w3Uo;-xna~t0plyKGQ!Sm`b7~oxu(D{uYy+5EV$6I!Fg8&h6`;xx6Gtvxj z0_&{kEpXsN!A?5oJVgEbJc+jm9&4s2U{>5|1uQ2ZJteyO(O%nh>al)2jH(M zzo6`EKa*OtHM^Lg@;Z*XrAzq-px^xc7oaUrDZmTYbXef7-Rk@V{eYr5n8HkK$*<4; z0x*BmjF1^7JLg&toc|Duj}cTBIKY^*#h%OWnTX4gXqJM~AoJ;Cl40i$RB_WD@5C3< zBkQF1z(vc%9vJ#DG5PAi=d8mZmP26+k5(Xsjra5)38|%Y*!Dv*dw)X6YBH+irui0s z%~?FggKjI2cicFGaM@Rq`G^`;z5G6EuE11^9nCQIQiPF889=d#5?l*b-;sD;@1PQg zYc)S+p}kQ~`urq(V$PzgPM>bJ!2gzmCbs#;+atp2WT-5z-)+;VQaqH0*s68wkCh0n zOu1k&&CZ-npS5dw(DTjI(hCfh6rsJL&5L#>-9gWa^%4VBr^57XEX&deNJ^Z&Eh;(u3XL-NuWfD)1FHUH;z-hQg2;` z0TX*N*I9gsFtIY2g|a#>^wRpXjR!5%-6Wo~t%{Cs%gRUejR}g{_{?JKBR-i}UP?P@ zNPr{dS|W{S5?TO&+ucB)*QNLK!Yef%8+z>ey>RuW{mjFI&Hgvwf`n=gCw%W?@@t7fa7l+gz%TjdoS1NzuVCfdg5JI<&R$tFz zY|8n|XdcRmg?CBt%Z0UjOP;!fDfx=yTIPpkO)PcRBq+W*Ff@cA|4v1x=M~92&iwxWaj3x_xxlUW4&Rw5DZak0%#9y5=r| zv5g$RU5%#-(+}Vd=ZH0OEe^lvDRhXsKorn203m8CjlLM@AyStis)Hov(Y&bHGj`*J z(W~k4aHF<#^g7;6mYn^iI~cAq|7F(+y^LQ#eLz!k-DyqEkL~Q!rW6+dF0@@tQ))g6 zk`TU3SXZs%z=5LP7RoPJb>9@VqZ$PKN%)5#Jg*%J&J1q~E^kA(JW*{viBRKUh7MtF z!=xWy>MN{PG!R_i!8qUiw0fQM+1f95aKzlByCM3Zp~@#x*tUjKSKhWDgM?TNI^Y7? zEk!r7)&akBtWx70)bh|>It%X!xC)3+xgM(I=DORZ5bZ=aZ~Y;rcNHzToS-rePXx7e6paK|_GQ zB|RLh@c>8dc-#pwz-SEbliOu@{tdL^VP&@pTG2lSHJWU{gRcBU)(LK8hJTk7IvKdxe7|@uE{oKQF zKDjqcuq><&qzm<>jDCrH`Sjw!;Ods`0H))p%wb8LZIpDe{A`^~lHo!gAs9-yM}7Ak z8a>`@5pk=40Mo*>99Rf7-0T7Hj?+m_IScZfYF^|0kQI!*H_Fq|-3>AblJ24D}$iI{aQRDyX?W-?G+>iP&zTYXv5!UWARq zI_&hGavsyCP%a)+bH)k=d?M$Pkc?Oj5r)NkVCs7tiDiQ>MvY9x@7iTc)5{#ds#Oo zKKqlGuk*em@y0<)^R5yhn-PM62)NUguKh>A8GEJjEE=K0q{gxQL2&8~CKs-)lACK@U$6UoJRyF@a3jGu>wM(6x^rBP46+cney|#N9gVs5Lw($lO`jm9S$)k z5R|4MHHGBv(H}eyxgcHU)Pk;ss5P_prx=wKoUDF^ASUug5?Qo78V#QL4JPIa{fO+o z#P$7n`OF`Dj3Z@q%k_A9n|$g#z23czvN>~DP?TCuilhQ+pDC@gw@)X2-!s>N z4Q1hND1K*UG#KhC=}^~{w#H;sxELLjZ@3VB@(h&91dCC*w55bfp$zKO3k{O)q-Pjd z?sXM1TN%{`z~rVZ1p4w_(9zX`Oj^y?$IZhISt6Rp?lRrmm>-P>%)&pT%doPW!U~1q zUoBhix0UQvXe#bSqV|ZEN6B-l;PZzPbj|%^l3aOS{E4fv_qwq3jYwi<$_=a|jRS%$rR-u72N z$3^E+LcLGv-{7fO(|)uzfF`z?8wkh)1)I`W0`B*yWV^HB{(wViGw6$_gUPZR zJxlKRvnu$t4VbvrV#5p(BvOwC$ahj&{wc6C&a85AmR=idkw2o8o*9B8)5lA-4>(y| z4@!Bv20b+iK6x&&uN2=jzg6tivi_(cB$%CKEigEJoJ&fZ)G$PK@i5&VBw+3hppzknzJ>}AAEOffQ@tLIVB2$JNZA)99>1G%C z$gAG;Av&&nHSvqCbIkO>rm9MxmOrsXx`1+wnNJ$5Qowuqji~t;oUi;tKe5s z%YMrCG%Pl7LK7Ad8#dlDyZ*Z8FNd_yS?5s^0S!E~H1qyHONj-FyUcJ&#=pXNWR$jJ z7o`3i$FI+hMP*ZqEjp4cL&}w}Z8UWSQzT$=&Db4IAcYAVodL ztw&pq21({B^Iw?DU8MG9rX_hb4TVW3cK3~N((J(~mHkyA1>y~jxhkvd~F*GSHC{{H`fIW9$9 z5z9Df-_B3wYkbxI6zc?1D2^@KB&Pc|hKJK`kkf82<_)-s#?gjc)F3Q-T$aBn3G#c& zHxQGxln?3Bt+K4Q#Y=;35y%YkEDd(gg^3941{YLR-_y7<6DH+=k;QDO^e-!V?|&RB zE>n6@W$)%1ftZ}eZO)+g{LQ{Pf3ju%pj@Y3>gDR;0Hs?&grHT5(AU>DnJsCH|UNJVeo^?PI;8qd>sR??X>h6yfYN(9fHjGf~01FjP*iLUYvk( zi!WwFjdQ{E=L3{4)>rZh_W$~coE}RLoQZnB9tj$Z$=9mEO^2 zuzLOb=6@rdIO4rC!l=P-eE+F)hMs+Tk8214X4=+G6WJ|u-r1SMZdEq= ze_!qas(sJhRdBmtJ)gveLH$%zIK#L#w+T1cLb(}D#erho%Uxxmtns9WOP^ZASVG?1 z?Y$)HfpPa9^i=v+zD(SNl4I^G_L|1jzI|@gv$}6cFSp)9>}~l#o$nZ1e(@Pn@-it= zCgN!Op{BZSQq*7(+?Q$TCC+>l{dk3MCk8E~;;GXs{!5uV86VS_id7F|@k$TVtky7lnP4j6%S@BFSFlK^Um!KqHN?^1ZZs@5MsKLj8eyxU&+v~7O z#?}6WrA;+YhSj)(NEp}APF&gTC1{j=ale1%1ckjuA9jC7Z7)ZFuG^vd+=QQE^IzOQ zpS#J~rtduH2(MdvW0GdCKw{b(??P28u~uOi>TAhzyO>Uj zIZOQ5I^bBXII{0%rn>%<0=x2KHw9PDo=8a6rm*;)+J+ft?n%w(=+N4Y`$~qF=^mS! zop)|h=9lb`N7KeP+1FChUBB<>HAP(%Ru$W4eF>`?v%0_Xz)$72N!k&<a5X@26eLWu<~2M#?hn#ltzG5+c-*L+h=O5TOd`m-8&H_YA^_M zeS?qB4;J?KYICaR`AyV0)7I1NZT?NR>>bbJOhi*bYztKx;WiI~3a?F5l2_$o35M3a z+6^LW&=JWPv8<;C!nG?t4ad}G#S+mrWrV8c;8@oJQ+m@y)$Zu#@@@YcYQ|&?S_6!bkIDDXokl0j&7fYT=KR8fvo8 z`8ib*sCMC>5lD-lj6SfVzk1aCe6#4Tl{Z$pIrp-DWR7-(k!fccV+SMfTLj~z2SU`T~eeh z2?W*5gpa&-)l}acE3OQ9^PGwqguv%WBPhLmtKPAKcOspTX`TV z=(K;j!{VEh&>p4kNUJTFmY#57?QQ}XAf<~cJpnQvjGPImz4(bAgr!<2!XdzJjhQ@afU z$3gxNFYfSD&}EVvoeZyr9(bF$jvhUykD*>3BHcyJZQ%4~p%HQR{}=tfl%D+{UP4FB zq1NDPR)Yb7YZeriO(k|~v(R00+e^DaZO1P>TIKH)i@?HkR2GvuTI@YBFmq*drDXfk zF_Zssbk=cAzHJo$8CaBbgLHQ@Lb`_tNOw1bZG?n?Gz?HWrKP(=dMHS2l%qkK5z-*~ zKE8j!fAE24&wXFlIp=$(-dLvLWJ&%47kI|$5_vkbeQAHId?XBJB<5Q-G!-&SPIy?M zeUlm&#|>T*c^DT~GFobdo^#Z9yhW|a(xKnnb9(WCkABL*ZRK5SSsahzufd3v7M(O% zjsIefV^!tcFCfErnf3aDg?k?~L5f}e%-m0<@8=d3k5V%w7M=VSRQ&cksi2)fCZgWF zNIT)wTjPnckdyjb{8IbJ^nXMEJrcwYzZ2pVcR#S{<}Uj@gW=nN)Lk z7mRW8FgXJ|#!Kd%7(Vvn`nEXUK00Hy)fm3loyo-emPYdmRu=V2$W9)cgyfx;68vOe zY5lrD+mv`)K?(;O?u?Q?GCaoWEl~|3Mze*(ig?>oGq7j*qI^f#82y0mb$`ef;PF z-&p|dPMztLkQkdtB7VVyBd|ihH}{*Aw*EgJUGclsi(W84VT&a5_aTkjEkqsJqI^qG z@`W;T)wrIj%H$zfS(Gx;hnGMbBtEP>|D)ZqeTeZ)<#v*2qmYEwdM;wCoxX|Zq5x7r z(L4p#A8TP+di{PqCO`y2_TyT%X$)Qn>v$m3#CNGF-hk5K7w={|kYF13v46N+Io#tO zcQ-6pg%{HVY!pQ)&FOk~QiG?p(x~XriH?PDd$b45b(+lIzbLDT?J9Ejso+svpz?PA z@9;dB$S*C`A~{f|=}T57+zdX$IP@l*REK2T-^44;LV-neRxj!l!DZ%cP-It%Q>}SN zS?1cG4A0x=kxanup**&RIZ8beGz$pQ;HtO6$8LRmfl31pNJQr)bHZzHP^|r|u)=!= z+(je!&CDScI71?K5JTA|Dhl5-Ath2RF-Fe@<5&Z;tlhy(E8OMJpt$s%lBT6LegDGu0(8-g(j7=_%xdr9?;gm zzDnm(p4a9z=p`O2+`g7pDHB>N+3ocvyFX>q*3SyH%t~^VOw2#LX3ZN3PPFKkOYdp< z^L3dWVtL5dHJcNb?gCU=1=NR>@BL>{&RB7|mU|OEKjro0Rtl^Rn>16s7yFbi;ML(b zz^KN%K0Xk%Q2(AAtQ51v-QlGXUDm0D*}cz8bD8-{u2CuX+GW zx2BT3$+IovdbZT4u)>IIOBqKnbtG|PHsuxQ@m@9resf^T+CTm_x98(d*>AdExx3;fzrG^Gu+9KzUFzZ@rldV4P_fX^mm0_VU56sMD=vlf0sa#lqz zUbt^ELA-tJuus)B1*Da;s+cX@r5ORqt}}fvfr)gncBxUcY#ntd0gSn9*iH#b8?ub0lTr9OVu7ZS^!ntf5&ZDmZ* zw8n3P)3HA~-2q9GL`k9QzMRk!%;c*EgfL1uMhcvC z3Y7N5y-<7KlT8w~GQ4veNbphI_Q_&=zp9^y%4!c$sNQ+t-A z1HJJUv#rP+dZ)bF;>ht_7P_KA{Gw6uJ0mK<3O?>W=P}%+O(&W6RJN@0smXmBh02id zw05TTP@IRFb-ZB+3?*wdse>f@DDl=NF}C&VqX(?mGg4z#EM;@v2jAC};jJVLvHCy# zq4BiIWu@nvc5;mL772ti&_FdLe}s5bK@~%n`hsY2Zt<{?-dD6ONyE6W@~Z~5r4Z2& zkRQMeeOkU<6g1`Y^}c#Kd~t>Pqt^V%uV=voXWPm$`Fj$ncpI_xU)6yOcdE*SK`2fR zF$@5vowjak+&5naK6FjCP-n+Qh6k|jnP%|IOOpbn>VQX-tiW)58C0CB5iZ(V*<^e! zIVmX1444?FN^-~5evSio-+siTay9};k*<3(aRyWA}B$tBC>b4 z64-iYu$n5gOi3=rHR8c<4p$ujM9`gA9f=6Q)l*t6;e1)t`TVr&uikCSHBS3`~Bd;5s5wbz9b_+ z$!h>JE$#RjPqKz@*Xy6YPj6iXTaBHr;E;>^hLz+zkv9>e(xBY?1^y~+2~|cU56!|A z)7-tk@8l@OPX#bBIBpYHw z$t>c9`NM!4S!7donU5){`gU&iLKuH(?}+2uMTId$YgKmQMtRf$34BK+}$D8 zF+M)#hPrqGUIxUJ2zG&z4;MYf`Y=-xLvC)mZ1F-W>M6$4D_9q!yff8Rp78rNsMNFbdOAXlsl;y&V=dUTMGE5*= z4g}l!2Jtrc6JS)++IZV^}e8v%$gLyM6PjW<<%9y>mJMm(e0eiD{UD&bbF0! zKe@BG&N3iirFtQVST=`&m3H-`diJ!^k(7T3vj-yj(>VcrifA3;KIkc z7I{@AstZ2hdnni;5fD@9X_Ovh?Uj&|#BF;knR1*L+02Ic(g@qO)!H59>%vkKOS4)X_XAZAYC2oA;o6XPRVl zP)FX^w9OJn?kcf!&*9}gY{_s6GXvC-nSC2R-RK=K>#D(p4Z@$hdw|#TD%($ zpNkT_1JNwD@;DXPYSfbh@T|lWt)bup%CX+yw@)wPx76i)k!~d%#kQ-{bL&6Aqz_GX zi3%u~I>tBq2vWe!PjY%pNhy3)RpOFW=VFu>5QsRxD2o=$PwBQbs4EvVXW(SEyjj0$ zclwFCvIpGc8|@_RiN1{A#=#(hMs%KsOkPvJ#|;wA1QjNQ(}usOcXK}zL9?zeE;v} z0mxg{Q!JTA`SS48|G0A)*p z5397;ZcKgW=bWxJ&uLv+{3B7`U6I0fp#b309%a~}YPd0Yk7aK4#CJee12~rr2|et? zR+~E=?LChS`gW8jqv7K>C`8e2L!>aPXv@5d(qg%YahkvM-(Sb}F>SWa>9Q@HSUv(vQs;Cb zCne010p^?%hZFHEvI;csLx0;bZmV-^9H<<~GGm>%(LMZ8r9Ni1(XSHAv;1jopVx7H zw~oE#8E8HAMj|0Q)fNUUf@^rNd8@%#jfB1W#Ai{*YJI`K*<8hgVY|XHpKtS*uW|k? zn})<#mUJavW=*Vhr#1Rz$7wX>4BS>f;yGyhZ;0K!990H{0}yQ=8BgR*WAz(1Z38pM zx36!C1_h;u6c9tSxDsLikkU^DDJXn3=4C9DM+KW`fyC2c9#^6!$YUcIyB@)=G*;il zEi_0+kqv~c_gJ#{_^|rtM)cd~#t&r;I~ZyW>4uQnoKQ0GExZV{6!c z$R5=SPAVcNJ)d;8HR<&uZd*2j-6dJmD*H7wJbzz?It~FVumYOKj6Y)cj{^R?qZOr0 zhv%+Y$29Ec&?tV_7ynh&+$QlVK4tm-P1R5IHnYy_1f9#xjo)5RQPl<`1se{K%a39K z^^PXHI2NkSzLU6ZneY|Z+N}oYR2m`jn*Z`wSglgV@Y2IP`h?b{-*!ZA7n-xxTfXzE zLFvpN6T!3V>hyrkFDQ)&V3FLP0QB2BTRz%-cB5eE)Fz4n ze+7XvXV9i(G0*B~6Uv(RiD1vn+uVsf&!{lZLYBuC0nPj7k_*cMGa!LGw3iBuN<|oB zBnxxk9aNlUiQH#c5BA4&)+Xr@*~IXsc={5yb?$FWiOjPtQR#w>nGMwGUM3>hREAJ( zrbg1mQcX!RPF7t@9+(y-XR+a@oA&@qFw0HnBb3Vp%q}qDrXhux)F7oW5-V(>%&fg3 zi32K(cp_7Zg_#cg0t~Dm#Y{z|PFZVD%9T>|?N}LCjQHFm>@f{I!bHZHw68nATC@h! zl)D7Gcy;_ZLotb26U5_V4xRP9RI!V~?_Urazx>vYmi*fM32rf=woq(awhJn#iRxgJ z>iYAOHg`itfXI~e{uIs?^J$p46yar+jV?_h34--lY3rc{GTKdeFo$v957SGtIU8mBPNLg3$ts12|zaWB|Bsx7@U{HAcL~dU{eevFp@Ef8E=cjG~P@hdM2SK#v0moJGDtyd?X{Da~eEfNFV=QVyAQR*<;nSYH+Wj zTo>6^jj&CQa57Tx!I*ihL8)~fUDQ2b!NWrr&&<0^Q*WhW@1zmA;Sn2MYv+;9{^SP5v zBD|r1-XRvFSqK1jp702)!A-mNh-m=Qik$7H#Y=kv)pGGusf>6vX9d3PxH8V31EP5M2QGrT)RzOi5a-r5GayY5FA+2q(oPn_C4Y<3${K z$3fIy%V@4-_;#1J+KI@E83X3R3abkF@m5#+m*Wv7Y^taAq)oMiYApGGsVNR9U+$#g zG=^-FJI|?aXNns{ZF_&|-MF?~@2=6Og&VGZ>c-25nfFte?@H`e{a4oQ-DG}fSE*mm zo4c#@L!^5VXIGhTIx@E0Aw@?lrmeDYKSOi0Sf_bC@Du&^ef%qjs{f9>2eo{umkZPX z%Q(yj{Ezf1Eeq z$sfXnTE!384Jq3DPu5i~Au&7A%J=r^!I3n==WaXMc2rC$x$?iw3$w6N8GjDulqT*A zY9N@@33yfC2>P;*^~b2Q9h~()?@-f>2~%&S+rl1uBS$kxi0UoD3$n`1kp zLQDrwde~VH6-XOD#SNg9dG^-5>~e|B9iMatnj%QkMp_)0=WITqtTf#spxBBjrTkWJ z#~39bOEOA5KD=4L!x*k-Z;VMOTU+13F{4ypif`JNixLi6ECYaX9-4_*!B}0|(lthE z`h%Vq4IaKoQO*HN;n?Z4&Iv=}mza>-?{QaOx~?pbk1oGN zr|Dl|*d#mkuEPpC_;3S!tXsUOjzJNpZ>nuup8xN4ggBSd} zwDaX;dnoo1F?DYd%_ye!EyZ@m8GP9bnhE{3=ZjXWERt zpcJZ^O!AKTv+tA>)rCh$m4|Fd)N^0?sndyJ852@Xb&jUdW`la z&uU62u7vImD33H6poB5eX|E`5Y>Ft&ThJ>UxHk@}lY&2@*nHXd4yr#FenHN_Z{8k# z`r>-XC!#&MvLSHi{?nz>6>y7Y_U@?s$Gjg5RpCAJ^?Wk($0Ma3qf`v}=F*(bJ@{*d zHw|vO7Q8}Qk)Q`|m#U)L9YEYB#SPqjOYKYu5}>u8qo!2@$}nJyWlJyTxeR`m{FS;f zw=q2#=sBRU-ZpvqqE0aNIhMqj9uARGKpB}v8@R>hcyD*0l#pgdo3 z=hme_GJkQgw|bO>E13Qz3|YXlyq62p*6PT*pSFHE%7CCt{8e?Ek+YrH-7%WhJeHGa zc<~}9qo$Jz7BXhwUhak6`OhA96mHzV#I|&JpJ5=k z*u2qK@zp=^1{O2})4w!b!e!kB3J~`4cJA|00S7m6K0kWf9t6OP4=svwsZJXnplO~$ zcj2`tj~7r_T%F$jN@WuoZ6j$81NEf=XqcAFpFlN`R84$^&i;aa{~_GDmCC?Tty5IO zVa@|+R`}e^V&eeOu+Y72 zt@DynD|HGJKo(Bje~RbddQbhWd2HDi)T@~8>i+R0;7VfqBUR1WP6Uw4$O(<1?hSU) z{M2k8Awbb1Ow|ak(L}A<;{HrhrMdii&n!d9)NG!0vY5I^v-RQ0>9k;NIvz}$`1m?5 z#dJPxmlff$!6A--+d{90!#q=nsC?& z1g%z{{61kFU`=n05mVjyKF&++oj7i5BlRdG=|bnBf;BMhc(W;-7Cu2iB5W8X*oP-& zUMJS9J@Qkqh2{o&>6k`jZmI|5-JNv>uzvH%3Z|Su5nk^ahzE_kd8rNqbF76QxwIEV z-)vB2g<->M+<4WvX#l|P3m7^zP8Sr`(tbZfS;hQd(eQxIh82_(88O2pws)g^r>&zq zGCr0rd5yV~!MQdgKeMCKCw1BGVEM*3XBeuP7N|cVQWS#$ZN1&WDSfaspf5wA8ujdbc)0&n2S09S2S0lBxBWrsbp!aw{$Q_NY1DE3r{6t*{xd?L zuPFzowNDrJLj*^qpc+vc{BQA@4g$GFiPg8Wg}H_!-&E{?UN8h9NY#_^s|}djEFS+2 zlniQ}e$ln8z#k2jajf+Ep5;tP+)Z-avKNhOJowf zLaK`I5SsFNfxsehh>5=v5mj{P*CmHx3-hq~&ib(Smgw62d9s`qqaPagh>ZL0u)63n z;ZXoZxngP~<>o~o5&S$D^TqS@rhLD^E{99Wy2qoVuCmzu-{$TgtRf8typy%^Qp*yi zjY_|nM_&AJFseaJ`WldEtVeJ@+oc+(nNS`7tm}VaQM^^YdU@bfYhlkOF|;@^AP>XWkMp9}@Q2JmR3lZKYc&dg8fFYQ%F zyB5;I#Iq(wAP|#-#vJ;Em$!38J5WhLFb*8i^}CTKf@d`eGxsB22_ZIVPp#H!2HTRp zkPuQ(&RA0+dN=;;=kZ>v+|+Gw)iX@z4yS9E&!Yp0I$iYY%GhvJ7lZ(Ex>DhcMmIjk zsc7Mco?F)k)l68a(%UH+5Fkds=yoKeM2*j}Hq`hvkxK^IkL++UX?V4Fl1kpCp1Fxm zIu_DkryzLMw*tY!4@aw=@oN01gg{K|2wX)0jfzx%Q{|D9SMSZu*46)dg~Ii9;04|d zB&neUimOBE{3Tzs<3GU6{$pZ1kUqQYQ``>#5u<9tnGe>1rTMGRPV$Fu6C-kMSzkz` z@A~#(SlDWHY%hET#{wxLw!g7NZddJO(SP6o0m05V-Dz$3#xEzF*SB$A4cw2Boehu* zah-=t^~+|od*l7d%d~*HKO8zfDlwVI_**HagCVSVj2LNP@joK z)-Az3-3IV03jr8i2T2T~oXw^{(BG8gna zqubl6^bB551NPdk&<$ze|8FL1n0cCN* zMKYcuJ=Jb|$C$O49{gzV%~xb$8Z%F-o&K+Jp5Zf*Sx^CPi=8*$4=Jha-HNa6cWpfk zJR9dun8B_q|H|7^CLNMXQN;C4CNSuO#x4(TKO6|NPWn`almg~4D}To{F9&t;VKRqy zlv`j{`V=$v%sI_nqpLpNRzDx^V2#wR98{cg-se=bng1>1|V$JYg#}}x}>9yHAtsQBpFr4rY>xnw4i*EKh!82*FMYh z@NJQ&Z|K6}qInwXim*e4Pa>EzvNBnjM8I-J%(xkN%6Mz4r)&!7jGWwIXgtE_TcY*t zf7EZe1=rn?(_wVN+#U}p%rkO)r<$_!`1xg8=>x!k(@u*=ipZ#`Pu#QMRHOpg(e8cF zW%}C2-I_ZnKfzjB=)NYDasVCV#cNzrTb`B7MG7PPG&J=d5+LZsBLx8G5Rph{e;T(_ z0*Q1d&_i4)aDu%$```lATm$3b;wZsYI#QrrD89EMG{l|MqW?32YiQ8Yqf2c<9vU%q zclReP1-zKJ3nK=X(%m83QnG}~2cInuNf-^p(9t5UvZ!6wcIO`4bDl}2>ZZWQkJ{!3 zZ$9h8H=(Z)pEiJZY>cSV(tq(>&5?DsU4{wMdNkEQ*#&dc_&CdKZFJR zFiyl(swkr>{{vS~-27J0gGB}5b7XmtssHFv;0KV*1)Gd9EgOHXA8oxAY?}{1Ilm`S z17zC-pDdWj1+JhpQ6>yh6dhA_(+PTMf$B&9fHsKR3dlFZxRi3XK$#DTt(6EH-y?gw z_wfoO_NPIw{g~z~`KREbP;jbzfc1t;7gX9FNQU84dolPaqp=(;zZ~&?wbiM#DJGp{ zirGb(6w681yvu%fk*|);Yyy*GnL!xVpGs0mdzFRPFreF|-`vnzn3~k1NkLg5xxuKs{ho)@%M5e)~0UrvPnfWCpkxcg&GVb(dI zbaX_T+)LV$0@_tYbs8ud%-?_LG2N~)b?B@Sh}5z;XS%t4PX1?~N1;{1z~lKjSc<>| zkqk9zmL1g%t0l6;g}M7J2HyFN%+*Qfb&M(IZKccu?N5m{Kx?7#yr4hA%+9nCfCiSB z%LWntjCWuPVWEkzZFed=x(_Zo%07~>Z+=46y*tA2z37BErsd=Ge0|(gV3{6xZ#(ie zBrT773mU=&CNeV%)3au!YuUb!fR<@|f!%iSM_1i8Z8j;*b{oEZ=s7o4cTzke6;rbT zo!=7ntG*VoC|%RkE<0fwNQP;by*F&Dl~4fCqMwEB==gme)lTR43j^yEyRX5VFHRKB zpGsT$6DLy8_dhUx3kezK`z^g``y0)lH@Ncll;SEe%3=VNuzeh?S)ueTCdXAW9Kg~r zpdDjxe{4Vw2LN^o07lD)nrR*D-r^7i(^g-2f7k6&t5XXsSd+-Bk%>nFcdXq#X1|_1 zM1+;#rO}UID(`PRxSi~y@jZvduib_irS<#)6nkEJbW>%qeTC5>-KX;l%}xz}1HkLI z^Z*A0^sg8jTInYmD083!nn>Gie3imMPJ-@(K*xZIn? z-G6*k;R*2~mhlx)V4yQ5^%Q3~BDY2kZYl{mv#*0mpkLLvNJRkDTe&}Q7Oi`D#adj6 zwwJ1Yb`{!N`>6~?O|4*==V zL@3}{r)yyZU6ykN9}=$^*3{klGGbHegn>S^{T%@NBDJOVQn;1j@{K+zwp#-P^Catd zr#bAPv;VR8=+({z15C&B$K8Xg_A7$@193v2KmdYE*pDxA;F(#feRliY}QEbUw9! z^*4iUt>y3ter8X_x=HGiE#;CoMUfrKc=#bsDi_<5J-=)Yw8YMGTC)S5@C^rMl_t6Z zKq}zd2kumSHfkVhHWGM86Yii><~$EpTw{)(XJA!9A7#Vrs>yT!L>Nfoh=>3=Jnoq; z#zTUdop^wU?(e~GX@{*X0d3@ShkDfoduMUFr_7|K6teh8Th?jr#fI1M zN+>U$B$d!!YWj56`LM1AR~cch4I}Yp@tn6!TYDR=!}nwHi@0rHGqwn$n8|EF+m9!k zrQ=(!gQp`GbiYi7e=~Y)A{JSa-}*7gd8Cf45LQl+P%kEe#7qg!A$lVCIHmfWi)q(} ziJ-4p(=hR}2Vy0;jE8_vdjIv8XtDj_490n`cQ{mo%b?HzH^kg12w;lKY*%Ie)Gi82*$JTQ?M9VoEEJy&Aan&&)sMqP@3*0 z1IIT(2l?AcjRB~RHV2#2udi~0c<5AV_)H;BKeq_Z$&VU+`Imj;ct7W^CDcXC|uVp3mN-f zBPxf%e1^Rs!+6FCWxNjl7j;H}djDD%9#M3{^}GY6FyT*@LxbHh_UP;MXINW1t=(8k zv-N8Q;rw0S@wqbIQoTZ-dam_U(OtO-;MdO4_Zu#4dwmwiL3V%{(H~gve;&+=<9bVf zcfl=Mi2b0}iACAMeiXktHIkjt)_)@UM~Fy2p>J=2C6~&)E)zH~zm<#8ol1-T0j6s+ zwZa)a{uN#XD{jsxIWt@xB-6T*nvZ`p4xMBREB{MlJP@A%`N$>Oi$iLS?=IsAV zDGCo$y7bohbPD$yl3gd{(|9!tu_;ZXbfd)9$SIin*>3_KsHUCA0u)!HdT4}d{XUsL zv3t5;g(}9J)Y{i!RT_L*7F}iA*8A|%wCtId7j)^*_~}*FRn<(A6(|e5aX0)C_!V|9 zG2^S<7b$-AF=zm=K3-oZY)cMza7KFNBY5^LYCth_)Dx>;KZIXhMG+mYWs!K>HXEC6(O>9*+r0aR|P1x^Og zA2pY%1>9A_kSBpN)>4s*em#+_OM*ncw9d#GTjNO?)3O<@mpQt6Xy z9e#{-8Tpg)8!}K>aFoHNz??62gy4 z^rVL17CZwv_$(L4Z^E~F{8AQ-N4`D=2*Sf$$@aC11)Ws(J@6O{TVumbPcmym8Yk5U z&7#^U-&_6G7brwjpKO71LsSng=9OEe>ar8ruSdXRSD|#_#VQo}4O0Gvw!E8FZI^dA zGmj~NZ-1)Zi2|~HT}k;UZRs-%R@k=?9zYmW+lg;&xN(%k=$Xwu_De*yp*|iRg%8-l zzh@~xc^+y?89XoKm9~p+J{FL2RDHj^BN4!4yAx+5D6!qkardac>V~xgF_fzxSF-X% z>~I_Iem}30@yc_o--r3(Tr;OcjW%i<$#?t8z~@*lly&hkBCgQQet+9l4?~sDXb@uzY{Li9RESC8 z5Q;Gce#WD9=XyDPO#SCh3gWQ2)7rWifpdRg%khNE&m|mV#C_mT?#dtcGvT%7aE`{Y>;Q4wa>Az+WqMRGU?;}VIJMLpM=Y!o@1TBoNAaZngF z6le^N0(py3N&NaWzB_2Q-cS{@vo0{0K)=N;rpUw65zkav;nxE%6Lra_<x<$Cdg@SIE!?JJ81Zr(grp7)=NNf7jk0A4WT+-J-o zFj|0PA~FH}#5=3V|Kb5E(OmJpg|v;ilgS|k1i4#R&irEpl3u`vik!U$oAf+bij(;; z{4Lc&vLk`J&D+vD=h-L`3<%$7Q~}jAm%|)w-n?0VzI!YhoGm^C}cohWW7b|n1X8md}%3xx?vk&iY*@I2ztlIMkf zgb&~s0?Cl<@(aEeV zs?rVg*JS0LJ_}_&tP;N7@h!7~GKI_1kbU3-)xT01p!O@Y&oFaMagy2B5O!;Q#NvHe zwjv$YN=>+i&1<|eEVJk>Y6cjgi#o^bWtRP}yvSpRQ^A;)g$2l?$5P-8lo8vvE>@04 ziciy7n*75NpU=tBnkU^9g=%csDONU&L&-3vJvQ!$(pTEAb1CRMzFW7J|r{{d^R(#%<;>39x}A^zG;*=28rVHls0{D&Pw-oR9~i}znZvY6!j&S z`Bl_u@{jD8#d>Ko`c59s24~xJFKY>2B6Ht{qb{WxI)=9Bq6f|r^XY6eR+sQRH+zIZl)dc>Wh{`el%RyoWy-mJhcaM!aD*0j%PL zrbd%g>*K2_02#D;_DH_;H!{exXMfFELK-e(~#j~tUu?ZlnmVIE{{gJqA zOhes$);g#eqUvN(T{fWR44VpGaz|NEd-sGkMx%Dd>XB%9XJHtiVrZI^b7hA5qn zQjUTp(&%U$el@P#sIalYh+G=OpWNlOv;N^zJXPt&St=tHa&U1PB@ zOU@(r@TkR0+D3y#ZM3vGVD(tAvl&nF3$Qa+m^~5l0j|ny+YUQs15bEW1iD}HjH84} zKR)SfpOGB&Yok?m;|%jBhlzM58=2${{QA}v-8sL=!&FbD_6_O9CyPA3MVKsZDdM4K#gZ z3~cT97jj0EU}1#I%7k5~X3&0*C!m_=G$+qxsW1+7XSogqD{Qt*heiO2Zpq2+`Nov) z4VbR?c>BQIDrUC1aV9lQAyO@-qo|cF@T)K4y1W6_>3)Uo@6gJY4(AavGnxHq2V!68 zn&RBsy*4Gx`H)dhbAhOh(osFBoAHj)sSW7YqH>!6lq$6VxDNRirNvn&U2Rr9rxGu4W0;_pG zs@+1}wtKZ^2*R77#s#Hgu*{9UtwdtwTEzghGFkX&QTh3oT^0C$b zQvF(xUL!FooD2Nz2UkQJARp?U^ttfMSbuczmQnTR%bwqc& zCa27ompr=Rt0~*=23tY4O{<8za5tF_RoEIQk2;>*YSoaIJmE7$`M#kF$~RPRqANoO zq`3%ER}LS$aBHw@K>pU39eZDUbYbAYLw-a1ckS0(zqYj(e}uM4ey8Jlu3>>S^QX;X z{hh@H_%p}Hd{dhC$)t1~%|C~3Ex0wfuts+pg3~MbT=>&D+sUw%_Q6pt(DF zIDkDHl2V<}vl2=ESQlHPa%jcZ@VGHaFe?y*+vQNEQ7M0vkq+Lv{bYUbR3!k6+3yf4X2)-sjzD?o#3J0<#U^I8?-;b&|_ zq_+P1+%Ws4eIODQIHN0_(MXa=evk?w_x~L`X|HW+69@=JNWt-6>8C9HoLT_}9EF=@Epat3O{6jU!Um z!kRVyoP5}DR|)=vf4xjjdUM@bN0O?y#B{*L-tp?twd^SDO^QSo%lD?i*=QzHnOL6l z4>!gV7E$*#d4CO8*pH0Xecn(Ljzmf-H(SN0m&=RsrYqYSRY07(o>2@}CQH4E_!y)t zF`p62j8FACiRm~B$InyA$~5!k%2?Z(=o~q<(!Tx|{Q&nf-=a{byq(mFTC7OocBS?9 zm_SE=5wZLnP2;4GyRzKf-BEty6SMQ#cgWPbMn!{YgMXV3WGXP$qK!<$t;O@_GLX~ z6Lqrnj;Ul!$F{3gK)7A`9L^UjxQ$QrBlr(ffA$|FPQXz$0}~OF&=&f1W2qBABnvMI zg>T0v%}8UWjO!j0kkOIix!0B(@gL#L*-IxM+0kc2k75{GktI0zk`b?})907Zc=5E* z4F%aM%8OT$ms6rUxtNqRjrF?8YgrWd;o{HX%P@O7wEA3BZE{ECmg|SA@9`hRTufp> zVC+vHbz0xw{+=fms*R3%StnQBlRtYpB9v~)?_J(a>6w50Hyd*p&q>RVa_b_6L=nWr zcygzKi7@B1e?v2HIRBfDH{s4@0x<>3g`iXJ-e1}sLL+Ex&VLTFK^S~G z)08a7Xk;wtWA+F8MZ>SFKOk7CNK#I!nZU{eyFhySr#X`XAJ}UXLzij%C1$so=1H~1 z%IoS>WW-QqhDGsaT8%aQ`i70$5Qp4@XPL>>kjQ)+LJnCBjTa8pD^KRXmCYotDITK=*K&p?~X5LwJ6L3s}DH_;6<wq@7w=WDbtLCZQ&|G?tZ=o>VfrPCh|G*x~`6QC8_>A zwRNAf2fqEHed8REfbkCq)pMj6$gnJ2Yhb*lObg`sWrPwGu6IuMwW~vJ-hC)N>jLzZR8r$RVi37r(MAqW<>!lMZ6rrs7(Ng(%#`q9Op#%WC=v+jGHjj>+f*{nGAdJMbhH!v>;Ql%9FOfk!gh=fRkc6M z-=xrBD2Ino> z?`|Cu>pZ8yU_#OPio&@sVhvi1jtiVOzIWW-|2^icmkS^K2qD(b< zgh_ZdF;c)h?gv3(E~5NF!W02?%(uX?+!V-vfAjKd*SR^f%|tfT!+Y@0M`b=|9w|Pp zMwVBmJOAA_gUURBNl06~OV{WbUT9W@%$i30YStwMs@5#K5B}@6ij-o-Nh{g~5-wiZ zRIIxhzn=yaBpgRX8I=&+r0}r`Jt0{WMlWyzX zOwd;nP$v-E$8VLYcH|kjol?R^B#bSEazsF_{s$d>bh_ zXdKES44KQd-EVWX&O;~mj-5<*d{MO6E=F=EYYO(!_H^p{t)yrM(4JT!z1X_qQ1H}z zq+F~AzIA;g#Do2yjE2x?wo7Z0H>e6Hf$})fJo}`-rM>OUTh4_V+|reoW12RcKw%T% zmB`uKipigqC70C>P_%FFiy-zhr4C(eRo|v;4Rrt&&_()7=7SVe{bwy8FVSOl(wRu! zcIW|Bnq>K{`AEc@!v}{v%dXN1t<+$RV(PMFZ+ip9*<7OfA#ZSE-rMp#%pRUaB`92c zZ+!jyrWyrSt`!V0IY8S#K5-k8SJw$*x#a%6dt!K^^Cgh-uOITRjej$U)2h)|fC7+( zllqDBVI@yJ(Kkn}dBPC3d#X6!>cz__bzwXtt~%=_Cd>_p2*yMoP(Fp~&54MnVrtE; z{;oK&@uk8!Q8J9y;8On&eKPDaH;C|y#Kj}}&f}*R{8H}{E5Pd?_t01IR}F{%0|Y_) zz8rQpUBJ$U^VrpxD)6*E&V?hm+AB}ZV0#B(OMbijMN}&v`U7VBbB&3Tp{o{ z&*yatXx%~wOTGq_&^SxItkFtb8ZJXBac;O2r-zDha-a|?BNaH%l!1L!7g6f&#Ms&d z#+Ll_H!w&{O8;`hOHTUxZ4=4Hk#YU>x12@W-~vJI1N^sN8}f3!;W6p2Zb0PRIITC1 zK1qY+=sNn{5ToA)1TR0l;MlAXyBbKq5q8dNAvz|%RKD$@eKyYw({Z*Vm(R&kgR^~w zIMtJ%h^pg0>$t##6qo49N~FT>ZoMecbu8t+XuBYi?i2cKeB8{EJ4H|e?|(RHXBKyD z-fMRx**0~QJo~Y1C+#`|w@ernb~l%$bJE0<8vk!C?aZk8D$-2fj+)lnc^#2>adDxK zD>-3cw6V}&24@Uu$KpedH*s!;v{P*?P;_ah#GQWaeu%VFf=-8JT^F5GclUwX7A?&yk zv?1-}p3r?wROzMrsh)L47iLCu;#NubebKk~Lr5;{7~}KxeWaa|bGoF{=OvA{Q;~IM zet@*o*H;B$?k4Rd!Y;avup<(YZ*jaPbQzZnUdKGma?U$BWU3+BoX$ zhM**!8J2d2xHCn*#ZgkuEbMq*B9e~#j9a~aM|5eYM4l3M90_L#J44iQDr*83ZJMyt zVPO|uT{lD;N72Rmy3@s-l558L#EKSO7Z-N(>sPV3b_ENoo6>Gm+$EQGyiM*8k42qc zoFb{Tn>V8B3~9G1>^7yHF;9I<|A|;6Rn(d@^Anyb_^jBZj$+ zd8}St5jL)_8eCb%`oAMzuM4*Egv6@kZ5c%uvB7+V;{_~NKkVYRLpeaSgi z2L${2AROx>uy2edgk5KZQ(`;OJllmPddW4?VLK$cu5F_q72!st+wXMNPDF1yexeNu61 zYd;-pAJIJDff9cu(#LX;GJFXYvvsJPZA9^8tq41gg6muvmI|v4vz;RDT4*TZj?SYi z)`^~27kcKnzdIv(kELA+_wD9y#^s4NTnKdFtgj6x-OVEIxQc9ws~(v?dI1c!p_=Z0 z<3b-D%K#dpy;6CWi$v5!Iz-%Yif+eTCkB^{D7%qGqew;fTo+nszm0S45^=}dD52x5 zh;*T7whd=&r8wuQLRzp9`^WO|M%5vF*nAqtsGY0Amdy1d!{3N3e-opHrM=z> zPK8zd*y$8Zwh8%@?LyuZ4TA=SQ_U!yYDA7T4>>~@(df>Fo%^j@seyl?R3hd=3w8AU zTSwo;we;OnOV58Tyc}(}R3}9#tg|H;oXCHDE3sM%3qB#2S;-mGLEI)CPrHo&0}>;}=EBU}q?;>q?Gag3-DqGI`LcQTx%Qb~x3GxJtZo3DAs+Vn?)|P7e(m0$ z?{khhmz>u)@6MLBWS`Ht=j<|2j_{4pu3#)T2JVdej>C3nM_|XI6gtoN9SxJNTa@dw zAlFP(H!JOYtpdBz?Gd!QI&gR7F0u!5kuj8w)Io;EX5dy|hE|2W+?$E7MRan0(2=6| z*@e~=b=1AwoP-yeZm9_CUbMkFieaxTIPt7ZGtlnY`rG(Ltp)6!tG$gE>XH=P#X~!W zo@)4M%~chF8H-Q+N%6<{{oHr(fBpQg@V|fMckxdy{zOAhzZfmnTzbz{T*8|zDO&BB zm15}tRM~)?LOSN!i^>Y)We9JQZpXkn1MCRrOh1PS>HentVk}&j^Zl&$s=`Eu!v0y| zNBI5p3;3U|KaclVbr-8RoIO&Z5bpkBt3tSYvrP)m2+?97E!tPioO6>_$SQ{k z=@it-Z~=kTST%A-Dz#`tymCj*+B;*lI$!osxyk@Mf<3my<25LhVM4pyu}aOGmpodA ztNq3Jrt1zab{62h(wlgv=o*S9niSei?XF^R--88tKOj6C-(Ha4<~fXR&S6sCAtrVf zrGH6&!YTkOpO@$VL<7?MO7*%B)?Mi;z@@He^;gk1z4^E_P=sN%k0^VKor^&GHk zPsckfY9jaJ>+*L&y(#w?0Uq6Vzmw=g{f8(KDElEY@a;+9&P;!j60OrN1K0kcI)iYQ zO#hRhol!>&+ME~r2{X`=@Fdw`n*m8?+&;}N_7m2rR%BQdzg^8Uw`@%}`$2d? z02fmfV#Gr(1sdxQG3BS)MJbo;(CaL%!D3}^TRXH`=z8CYlKcC%y^b+F{x*gq$_ z?M$%;yHm|5e%fQMHidJ9cZucRm1S&V-`X}Ede(Xg?7XtS-YtT)WB7MYqB@G|;7q%= z@YN`^v+~@X#9*JvUuSe~c~NlZ(9-Vy8MNEoJ=4ya+m14M?#`f{1?FO)D+=va!ZIw1 zLAxlBvt)DFg+eiL+;XaIshpwBm>j|Icgha!;$a+isRiuE<4(+Tk*LV@q*|i$>%6&;#=a=gpkdJyx zz8w~v@Tq(|UIh07*fK_}lRX@t9$1p$gTo!{?}rhIgktTstYdrE0(P6b9t5{N z2yD3(&@oh&BCum#Jhy)hi>?_=Ee)f&zZ#>9-B|REV0OJ1bG|ODZV$j68HRIf0IvN7 zIORopX>%S9c`;@PEZuZ0F0r(|hS`w3a0lh(JFtkUAS=4gV>&da)m>*cq|YZW(0-@N zxb4Q*r!nE5#-zNM&&bO>;T?-hEbT3;rZ!}rz%<6CkKr-QWz*{FNBv?4YUbKB#D;lo z#<%A&7#bIiVq{|kqv0WpZS_lkA11bYF}c$x9}oi?emcHAgrRUh`h$Jw_VuEDy<4Fj z3s1BJdNq$-OSnft6Z4zp&D}+sd`#0}$119Io)%O(YB6>+j`?rrwD1D+#u3_?Ja!C; zU5pH<79zcvm+jAO_gkP&)?tO}S|PIr+D-2ct5c2D9~G{x)}ur|#`CA-gL|w16`lsP zM*8qzRX)%bD-_r@$-MPm*-uBkLOX&-LOY7pWZTwT71nk5+R^Ni<(VT-<}Y`(pwQWZ z9A|3`+TC1e)4XQ{4D`3_elxUp zc%w(v<(K|IE1E-X>J;R@R(je{OU`Pm>|--Zd_7hN`(D%tl(|ey&t!oPW1Uo?rJx)o=#t;PBVVbEX!Hp*n?jj;(q) zcIq+Wx{Kk}0u7a2-)oTPv*oZ0L~7+ZS*qY}eXB~I@AX*TYQRjW5o6mOs9vwdA0+(@ ze_io0e%f&Z|FZN${I}V!$Z!gN-j{5x$C0i#%UK1?d(9!K(=_;X54OOJ_GEG;+LcT zv7sFST=_y7$`;EM*j2Ao$lq5bs+V~V@1uON7!^x$&X(l-EXlbPok6=wl^xpg9MV0< zmT=CV=gz>ocrhH7GA=tpJ38%*qmFL7cqy=xmf^8?CUO+o70u+Mcs2_2Mssn0qEJJ8 z3G5mdYZTg1oogNPEF6}<$$m7*{Y_|>KA3~#zD(TgO~=*FRD9EsjL+MW@Ue(hVHpm~ zP*MeUt;u+yB?Zs7rr^1jWObhz5!kWPs{*@bxld)jpEX)xu!MF7*gY?LsWwT$9f96Y z8bvl}$D$6;RA0f5sw_7fq1`{d_6z*)Uin@8S0DW;eo}c69}E}Zg52{jRA0jT@;C8W zf3AYX7i%u7JD2 z=qgkIN6^Ob)Uugo4NuJa;DJY()8Ni;C0kPd1=%l$vcE%VY* z*+a6N?3=bj<+5(N@ycbHa%7Fk{*PB8X`~ca`ik_p->sDUrsyKxExs=IcL(NA<=yBs zfR)1lrZ*h&o49I$Il?-5hhR%EHz~sed1ic?|D=ny1bggfONTw(cJWTTVR>gD*c+2~ z1kPvNbq3mLc?gn11zlqo6?}PB}g6RKepdIxj zaQ8GNTBluh@b(YUe;jCMh4|TFS-cE9c#?D;R}`udnz<|xrPJ1;z%4qiz)r>utRs}u z`CQTUxh;sMebMd5L%VozXSS!?ib?^8Oe3)SKG4o=FA=n}z#a3$SE7rZh zdxH0kxpxzRIwL|i6UKU$&+aIi(~gy23GGhKLArRIhjbi2FNL2rJ?TC_FJ1@JTGxZE zxvveVq_eKu^-y#YlLgwW`~LeV9@0G~-lw*EPw!c|#-{x)nfvby)SUr4%G~o$hISlI z4D1Ny%(VD<6vjni+vxhfg0*3<)f(u=*6NQs>TDvgqfD_01L@+$XIfg6Q!H#XDu%ND5OEm;=hn7P;NCgWym4-k=5~vLy0glwb}6h2 zM`A636GJ_jr_JP#OC(bS!k$ykNa5TQTFpBrtuC``t;_Utn+%J!fZZX^K;7fO&JOD+ z1JYtnI*}CyOK8V1*nJI!HO@Lp-E}gbDsrIU&baH0+b*Lp#e^XGEu+CoV6Xwca1@w6nuHYdaRO`z~m=>XYT;!gJ5oZ9zM`tIoA4 z>x+Ur0=p+cJG=YNs@}@#uD)1B*ICbcOmpi`*VBL<#SmDB&uu|Fzej-`VI9Td5l@45 z41J9sXDBS)b#&G-1U3)}s{FegU)OL|->wJYeLuF3LO6UB!O5dNJp9#xNZM~BI6B$F z{$UWidp>D55ZMo6CnEDlpI(5=#3ZT=oK1>}RtFXQ1ptq4mvmNt@yEcrNQCDCr_YheDmjUG&&OliJ2LbkcX zaj;4&E5))(?96r_W@Wn!iCx+woFlC3m1C3st^OFWvx;HRmB$=-BkBUA)2?x)7DeO5 z$m-8Q&R78+II9#O)&$$p5bj0MQZ*{vEohVDD_N>RnX?}K2NN3BOEI?{p&g4wP%Z22 za-1Ey?`&J-IICnj;g*KSF19JGyG3Bgih#+g%VK+YjSAz@x?s9WcugRym^U$)(@;I4Li5IM_rxHwXz zVX@iLf6Gy;E}Fk7{1|UGCL_qg0Hx6Iom^R_9h%XieFaIqS97b@g~H3to=73lR=%l%l5)ku>(S1RD}+?Bt@ z8u@##!jg|}xf=QHta^RghjX_9gDZs?broTCw;sNOCV4&)+EpVMX_RMWg*=0+ zuzA=j&yI39xcc7E%ed`zalj@6jbMh|!vf?uS z$>nG9*Cn6f?T%Cpll`dmHd4llaBs0vK9C8F%3@)#RdWP&mI&=kzX5hnf_8*WgmnaU zbk+`gHQGQiF#e%W|vXJFXVq}z(N@nV0C?0eO61uC6osBn~` zZ0Vkc5fj?gtPs=@*quSU3fXSOqJegn)6P17iJ=`;DeL9AG@;4mi!zU{kHdt6)-(g} zjN{G@@Qk~TE;<4`(-utRpkOKw_ht)FG8fHtH?jUI>7uWl*%n1xg`}Zwx;5R zHcJNB(P{TfnQovRVcky~WVk6=`Uv-|a99KFjMI*w@28E|!D_55=)mf%&s1BLS{V}i zKc~Nr|I>$mg8$=te~919x}f2#gmuhC_f}U1-f2z7yDiChvqAQ={yN^0efxm9?K;x& zf{dR5yOb!bv)Y%WrC8OLdG`qCv@&eXRXkI71wW~^WGcBb1eW>ge#YvsWnXJ?2!gub zOM3%Tlz%2H7t;&QF`NaHXdZ-!$hcq$3=wUg<{vw*3A*a>My|8*u-9 z82?$jD}_uG%cU5BmDoCcf$X$qx1OwgS^-MIv~F(%NiP5Ki`4! z@di{*H=}&238fPa3hfC0n2(O2E_a{|nf(t`>3#Q+)_)%vgQdtKWE-tS-gqstWxnj; z8sv!BW(`%JQ^sJqDs!kpp`8JFJRX8OhLI8iX2>>7C@Epr7fspts3sK`iZA1f>NI5b zRiJ-!0glsv{0^>SDI)JndmgNv_~1BlVSaB}ekUE6i2}SaIS<2rc@ME^gwA{EC(t9j zqx+7odb;fi?}h>s81zl(y!@x$L~thh{@{>pS~=_p?6i7pM8*%-P`5T9$5VyNEq4^C zUTn!zxcYf>rb5RrSQWM>Um@Mc9a&&i^G~{S@NrkRy6WC-O2IqwoAj34?{CX}PFQzA zL_kMa_fpL@)yuWlb)5Pg!dn$EaUA z6&<6&@lg93=TFeQaC}ZJizjFBFS>q9rjqTM%-?*w^HkNf{7_|}bC>hzoO)!RdYp1^ zXe;-C+{ZmDa*WaTG0D0JEaTO=YPk@5+>c^F&$#l;c#r!uq0DsNmn>@1zb5BBCSDWv zS*?+|kK<+C=hpq-8=KDz%X;KGQ*=-oAZtNcgEjAtlaB*_)sbU~b#AWQ_`gK0fE=D{uuWV<+e}HK^5MR9G`zXq9S}V&bp1g!*gOk=jS|xft+94=sHaf zJi<9`=|-H-KCcnMA6<9xQXnY%Xhguc5~gHdw3THy zl+@;BgYD@0Xpe+*X4dWYs34N zHuvRa{$L&3hd%5a`EhU(z|pB6Cy#s_&`s&va$ds;QzmF~a#_12hJB!Z5*ra-sl91QiMl|WL~K`=?j zT*+DovKAVUJS$pg!F6e`%{EF)HQ?q<18&XK;r4VLlBa8s?`%dzpci#p!>9`Mppw9j zRdoZMy3J-8rxX~QIFLAdbYq1u$CLbVWUOpsOn{jit z3UA0q5fik(TzdnTr^-+$`^+L1MJtUca5kcNRX$!log#*|wxZA>eap?byVj~X@R*N} zdFvPgt6J%lZ4Dyd(S_WFW(9Vovd`t~4S29pisHFDD4orfYg~@Gy=E+IH!7H0_E%%o zUxQ_D6&8J!^317)bF<#cV;8Q0bEg&y;Yv*T?xWw4i`ifqTzif3H`FA*k&W`aZmvTe^}oc+ZP)Nj!xjAV{CDwx&$@tT z`?B$~?ri*F`Iq>wzxWHh){%@iyHjwX?FPOX$wm5XG0Ik}P&!wFn(2F}pDISfq@~)K z5(Q@E%(vz!i-DvVxQoI(yNtVzaESn^MAlEhRl9cPz$45vt}?a;ve|*2!Z-pm*}if5 znaZq2@nFq>!bGZGwnPBNeKTN<@QZDo>>u}s!)z0Y%dt4e{kgk(Toi}3V8_xuJdkyj zaoq%O2JFdl4`%P-{*26LG+lxR)3U4#Q-p8EMaOk1_;bp7MCA^dwkY!~6v})>F|p7| z>5TME7sOODd0uqTl}r{!TZYQsQQe!!k4okn=X|m+ zaa6ChBW?IDzUj-tXMGv?xH}c^x8GK0-G#>Mc%$KlhMj77Uvm;(p=(IQf(6c|&q`%=RepLMpepLB2 zep-7O&s2Sb-_L#%|K#G2@qc*jU*ezLcn-g)zN~Qio%VFR)t0Pqj*g~xo0;_A(mS%w zw`E&zwxr^MOnaSbPqRQ>YZ_i{PsOWk>1SK=ieY>(lcnFHlW z>b{3tqNIL#h7Oh?onURW3YlZoDvqZOmLq+rLPdC&MMs?|Q-(8!nX6U$$7*z(!zulx zNbY-p)PXVud4za(Ch8RErS#s%t$|fZg|pc2O|&9n&A5#{zYPb|!q$C?4894(zDI7<7A*z6;u!ej{~A z+2EZSr&G=@f;@_F&WOOy3=`53(5b7?CidA~Q;&nV^NInugktzHLEWAX+Z9_!)Q!mF zPyp#XK&N9rCIUPQpq+s`qei)>s0R6)B&f4=Dlafr%l@W?(#pS{O{AMVrywH zDh|tiE9;^2&wx6Gb<)@AkbRcv-7=pA>f{y5&BV^Js6`Z|+M2>jvf8#=|>1xQpG#ak7A&+-Ew^nFw~N z?}m1kt1=O=O9bucj5F>y%K^8K2~Py$1a>wNv?36OV+YIOU94v1Jo#;!!m*p&!~*%jD3I46QK_FF)Wtpx`O;pler@1Dv$$FVjB=c3aI@6OE^ zIgG8-F8hAP?_UhqiHsx8a?M#_&J4%*+hHBYDS|!&=nR;nOkce0;7);D6wWD>V;;LW zJ!x93KMKy`!P|;=1Iz1CH=Ipo9<$8%g?0&no!x;Kd|U)~1a)@VU38YtLVK-H*z>^7 zK09zr3v5##e(b3)qF+ zat$nK=i69^FDz|T{!N#Ltp>MUs?d%b8@nEbb(Y+!ZF#BRIrboOFkMzwTaySXMuNxhGchDd& zrsH!paLLD=dvjRs`w4hEb$bfV?MVf7gmwgYj_naFZBJmHm033@F%zD`6pKHE zXY~b~BEVxc;cS>HaC$Pe5uQK1r`WVK241-;e=kBy<7PI?aOzo^=RL;Xd z$cb+MBHF!kXmL-Yc4b69q6bmw9!IHsz)+D70QU~riEInB1M7g^gRo)&{ z`+8C3>q5nPhs@uO8gD=9y#unIUX-qM$n<`+%13QocnJ4bo6)*EjONXL+;`L>eIO47 zV|Ue=*1I`?c2BG3oSO>wDwv}~&VV^WI_9QhKV{{qW7w-Dj_dTuAZB*@F}FLQz|MIz zg8BUcOz-qyV!IpN>-7rlY8>ULb6LQyd7~Q*Ay#qiLFsxA9(a0i-%W7WfeN=AlN=X| zLJ-nfYB?L$+hsJk|2fjbM{HJpQY84LBu zTW&^)rwdh~eyuD^(8(~}=AdkcdHxjES-{S~I)c##Z(nr#of^*D;O|CVpjWR=;c}Dg zM>Ucr%W-pDJ{IR|k-6G}tCMAToiL#0I^JzdQ)qYB-GaNU0PB)=trbPi26X}Qe3*h0 z%++T}K5Um+EtbHp7x~LQD0U6Va@`jAb5_ZHP>zztd=!nRpk=iXqv1;VSZ>q`uk+q2 z4TW9vH)GjXFVCDh`Fm*40u-}>3M_0?V|iDGgJtMSNjtwyZx zw8=BPUH<+X;0iV%wBLc1U?qG9Em+xW!1z`bhL2j1F`I!uNc$O{t@{eU>`KP}Snxjn zo8%Yq^Zso7xHAnuYQBj-EdBuh?Zv;sFB>l5gP}}(G>|UWrU17`vJ}b@(lt-rMa$$} zZ5w8+u+#@j4{)D=>pP%b`OMuI;G)~>4s)!H=V|^l!Y#VU=q4jXBiv)FVWA5TEa1oc zHtLX5_goa*JxTG<&bZa=A`~>BuAIjq`*Dv29i*j-qpmapMiX`#ud-RIC8WD6^KlvG zh@&{nK2GC$4ag(Fqs;a=4`H1GyD6C_Dv5$SvmLV>0bsd<;O-tuozmwhM(JV^O6R$c z1tJUF5!%_o-Tf&G&fTA|L?B1q8>8#afVwXor3GdgW;G4DrqzzZ$?ra-sRtC@&oWabI2d>|2!T)!= z2>o3I8=~NEcHny$#`=l;{+`J1^21H6A9&$C^uc%Jhgam0@wJG&J8Z9FacfzAS6AeB z)hWNL4lHcT`0lEXkNT$NJ8T3GMjPaMH{$+uvjV$}{xS{kyxvuesw+BmQe=8K+z|KHEGY|W&HW%Qt ziZr}ca0PGVeuEE+Zy>3q7$2wQTRnJ81bRlguBaHA zXy1<6k9c?&59N&1QODzWLO-FK9nSrB;(7?__H_8X&O#|UOmJt8$pVsceHiBJ*t4Xr zI}6}7FYc+D7Nt+_D+BLTbl1s!MfY8^+(QhHJqOW6b^!mR`_72q&V;#gywfRKHm=6K znA=ey>x#5dnd@i2W_Fp}aD=<|`!bf}j*{yT17!xDMOzEBS=UM7nXOf*7AL*G67(A- z0(O>c`@ngl+cEksXlJf*JhY2Jx@cZHLb~(7jv=jPoXIKoDkAaPQzTvER&ZfjAsM&H5e%xFeoGEtKt87Z+On$ad9gyPyf6lQQL*TQ4~qeLfegy@;JOTZvEX+r zh@1Dh)I~SvU5mA*UxA;@$5yMo`d6{+U$FpPfLe=o)xwLL1(m!qh^Q!n)elRE*A4$$d78?UQ-=TbPUjyYU#bBd{Z&qZYSD72FZp zEpClJ2JPs!n-0&Zn43-&V&&K=%*xC6jA&$iL|)XV?5;2UPc6Lnv7rMDcPj@)z4tu-JW3gD9LWM{-XN@+a=8Ym9{^ z2Db+^2i{y{L?N6V*m2kZyBM5{!n=6UT}NO?$DQMF6blD~nAq&ZkgpYe-ez=q8_^%` z#K3Mp+QZ$bmF<_in(@HXg8TA8ZiRz(Xh8-ZA3-ETO|{Z3fmu`r+7XZu+|gO5E;o*^ zccPBaEgBx1K3j|1(>1s?SAPcWqKb!h$+LAxnXW|cVgt(kJ*Z`YdFvet?doM(eXvi@J+BW7N8B8HfE2kWGo4MyUTsCjN;9s{RpF!FJox~+ zsUJ}(^HsPf%N5CS=PoyExa?h52lAF0)nTW3?VN2Watl{^T9po5?}dLXHBvxkx>hA`Ke)I_tBb-Ey#5+Ir1lN0>JktiqJP409VYeWzAk zc3pEBnDIT35Aa%rc5B-WV5M2lPP076TjlS+3C>_Of`@Hb4Ow~Z+`A3(cTP`rPw`*fdJfNYB;)6;@{!n`h8G&I;s0^zNBHlr{ur-yT*qgl znfSCX2`Q6#D3~fhOPuh9-w~ifkL~|h5IO3DEUrkXH}r3i>yeCB4iI{ zAZI8OIiuOg8_8BU#t=>dG`ilboN(m|`M8`3XRUjJo&@V+S}Hv!b;c2#(G^FaHeHOO z@q84F=Am%xj*7$iBe~jgTD%G;&RPP5h7yRvaX_L2Vtc&_RSo{z#7 z=Ft3E=~wv4z0dLgy7*)K-#+{k{87rQcths-uqhc|bz~uF zH#+DzuJeiL%DdfnUv;auL}jLP_*!QXF16mlSB=^Dye}F0q=-Han z@ZPseui>3K3%I?`ymNAYQXFO<^UoPDM{%6uG^5yZa{s)-Fj%>NUXpu+dO@UpwbykX z0z1zCU!dJTq7t3Ur|VE52_c<<8g^)B#-Ap$oL%pzGcw`Dy=!|>NXK?huG^WTZ9wiFbA4minXoIWcqrEGK9fQ+mlambZP;}_ z-1xlAG;4YkuJN2kTl@BnG+$!^=|1T6GZ|24R}9k0HUFW|jxwO`4A_~Ra~7CWXy-dr z86X!A?acIZii37`U`J3l7d*mT=s=4~EQI#4xN)Gc&aruf<*h??)fre959Ace?Vmnb z2ge9Tj{ZS1p{u{0EC6R$B0y(`L;Hs@nZ7fCW;y1p5LyHB=#De<7&s^U&E@xx5jrr# z=Vb?Y@xab5|8C?QunWtwo3c*3*k@Nfv{Sbo_mAte0Xw@4s3WAK7}iSJhwb3bfH`%l z#f_V=Q%a}Vpqw4B#Y49EX-3}#?VhfXENcNf=GR--W8$%JpDk!dK(`!}ms^{hfdH1G zTJ(Bt@~8;uj4W7pR+*J@2Hoeh#8##+23)cXf!vy`$Ax*{YHXZo z=B`^fmUD492FHP%0~@fjJL&8IZ)U4Mrdd{sl|F{T64(*mad>j83q78Cd55bj-jV^Xh%Rs z#llnx%;?PX$ocSe#Gu`+sp{_y?UJXfkTF-M0I|&1jdCxGQLsX6x9;;}(9VE6X`7-> zJKZ0@3kau=x9XRTrI9o$Oq(nE%Meo)pd7q;sM@nOV^Jf=CR6lx1wZo z2sy4+g?#s9`Fv-K-UEeBx&A91C|&JR-CvetmHVPdT873JEH$9SS%-q@V&n{_p<*@< zqZ_rDi!>;(TiULZ-{MNl`KuMwE%_TU>#f5~pjLj{%jLJe3{#xGQLXTf4m(zjb!=8+ zO_nFLTivS1YPeqAcHZq~ZC7^cWSaDcD&XFzfzwxs#my$nJsgm8S&M(0_bUE%#Ygz* zcpm=O?)|&g0z_eWQ=5? zbfy?p(|1unU4o|B2MX;7$;#-qo40`7)1VyzANvW7?u=wBup`(aw96dIP>5&X9pMz6 zcZ7Cy-Kq0#=?vP{JIYl*1lk#wAH}?I+y-Ht=5CX7k~1LtGn9?|kvq6EoFn71Z_>x{ z;tAR3;XLhUn>Ru*7vE+hcQ{L>Fj8d34aBo6<}{3gyOL=O+7Xx;DY&CM&wxddy6EPM zWAM&Wu>!lNK|3o1)@pgoMlt9p(+Z~xad%p_E!X<4T zgFACo_?#i66<6?n?M-~pnyQtVUunIepzf8{D6ng@s;+7-xMt?Ei{`US0PUV5oU6ZX zK{{#GeJ8&sre!~iSG?Aqp+z5lR>i8UmlWo`Ezi}L8gHt*@2?6!z<>9}UuoDWU3FJy zOYvcEmV!EkbscG{k2*8(aaX3c%rEwCYr2SSraTKW@s^0t?v1uHz1EV3*X6hg>E7+g z#yjmr?PvT`Jy_KI-jSIsWpic;Vhx_`_>2<7asv;j@+uWX)FL z{z^N_*E&$=A4K==42F(ZFna32)FU6}z71gRksq_i>sldoa?7cqpsbRrpeo{4SY^aQ zO?1<#qb}@JSf{{_%SENYZd->akJ?TZnqU_F@@xw z5?pI9RM2*#`>p~xLOKO?{iV3sbr&}}i?t)%~O9n&F9*6aSiU49*J)SSV(SDAM%PK0cBp!e8()z?(7$bJ2Cr3LFK z!aE~^JI>2x{|mJHM^>V9`E(tk!$D|s9@71`&@R#RC&4;1zrC_*JhY(ZW{nMZ+F z6uQL&n|N7OE{|j5@ym?3PgPHXcV@eGct;s%XJB2t44|{aIyPlI)Ya`xfx1MP;_Eqz~TN3r0 zVfImh!xNR67B7Wwd*?x!U3O5GNQt1=50Y+&V9ru#pW8f>y?^82@SM)~9Yy=Bey%qV z*^BkFwbp4(H?3KZUH1JUn0uNC;5PU6u(iLB?SljC93Gw%`|RR;oIf0i$hqG=bKLF7 z`nGo;lW%KB<=xy?sFg?rUX(i3f|hfQK+HffGra1TmnG4;Y2JX!a>KK=Cf9E@Chz8&Tx*wHcemUVZn-x+v6gx4 z?Aki=Vf)yN-II0fJ@nz|*CCwzW(z0ZZsFi0gdOI=lXY$FcofhDWnY4!CG5#dbVOd1 z9ZS7vX_pVdvdickEtY-jL+Eejv<5~|x!i-S!73zm zl_7V$8Fwbzkv3G1+r1S?8LmbCe5X3<9=L~a&ozLewSE+=cH@q-8@Y~l+*xWzfwLWj z%M7vXK*4gWLK_R*Ff`ICQed2EWoxY(mdVi25@$VXe4Xe$7+2WDaM-IYNvK$^!C+(v z{hK`)-0H=`!)YviJ1ZXreVV(DV9vlgJFqj*j(vo5gmu%KecBS(={(WAb|%l=NT6Nb zQO#OvK(4b%!%FEGV{SXT z-4xmpmaTW7DNYu=V`!>;gnGNxVaQ6W#%XtZ{tVJ3f_4VnrN}-|1Z#I3O$zQ9Cd(Xk z>Yh_jcOKpuXxQrOQE;d5j_yBypMpEWQ#$S{WP0{oHExZU%JJ4JjJrKsjT=){xV=<| zs|(fmaHv3G!pn`f@zvM^BJP#&v(c`Xw^Po-c_j)XC)@s@ffEW25Qz;-j1J=O5+_hbIy zIFiQl@y8E7!XLL@#h(pj;*a`L@lOli#6Qn{4WA8VxMXMLA>ayPj?Fi27(2n4W&?;{{7uh3O z$QsU65pvO;Mvz7K9>JX!uOOU@!aAy9u?+RH?Yj8~n%hqE+a(YIon72V0y|Stm99Tt ztGxbfl+D~n<7xwH9aXqHR*an9OymsEX_t?j!93&)D(=QqK3fn|*-U;6*p9&_LbP zmdkMZFKVvh`NkV~qaz&`x-;-fOS08p@iqRZYtQ0$um3^;;+2^P_*C|p6>C`$mX10C zx=*^Z@L6vTKJCfYak}l^mt%UTJp*sIXQ>G6F0`N5+g+BUj$yL|dn^?3YQ+t_Rg;8I zTXXPrQ;q_hYwg7fv95O%;fnk&(ouG?B}XAvqkkAp4OokjP?B*qUNm^pP}bZ-eG z`%VmrMjV}mU(@f~#ifxH=@=kLNJ_^5rBPbCySp}0q@@OYDT$HNqib|Cy1Tm@rNL*v z=PwxBi_d*upL3n_KDU_^al$;5dfIBe-B_3noM*7kYQ}Sl7KikF$abjPNNqz^8_e~L z1{NJGvR7G4I6i5H`0MU(vgQVvukLgm57GJ)T3G)^17t#3A+*}Hiz!l3Xh`aDatWWx zZ#uyKgS}GhP=4?Gq$8V}e(m|y>NbK43Yp=Bf6747ho(>W9TLJJ^YS0CYejPaD*O~uPYWj;XELe zTU9a67sYk^QFNy<%bwiJM}D`_4K-wwa&b-Up}Ur1AssO>#vsQ~Gm6H-j2we}YNFhl ztV6IADTED?3T@(wfxXs``!7bKYh_=%Gm_mu&8~#{$^{L4G9l-a*(t^HsuPenGUCIhssm2Np_f4s5=%z%~uwNF55q`A@7 z@sb|77A2tpBFI}d>(v?F3h$3Hos{}vf}^*)$bdkzM^!&fMEQAR;_k~=^m6P|T95Ol zU3iS8|A0rHD?*emg)iZFSHygHd%}XD*JFrhsrO=5aKHU4z=I7q0~DXW>On9)r>m+o zsQ#R5`A$I`v`p!_oET7$aiJ7)j8!UwP}UnhN6Z`t7@owHPg|jgO3Vdv#0i`73G3l!>#4$^0u3xx5ya`99F z)zyS3g&~ohD%Ufz*Yn8S)S0O0FRO^L?@ zafrjA-zX#N7t&PE8=C`BbKcEV>M*jV%7tQ_&29YWHr_uZVoSat65@pvdA^@OF{}Q4 z{23zuPMrdag?eF?(A*=VkJ)fx?S_HEP)>NK)7TPY^8(M>I(=d(C1hx6nIf&Mf9d8` zH=)f21h0qkEW!bde%9v3;Y^@=e}sK3gUb-y+yv!=qO`KsMF+PacU-j@H7ot`t#yRv zykapoov%beMQ-bh5SR4YOFbuMu3<#)Yy}p4!HrO-d57_L$5+iDm*(^B>jnn@Ss(Jo zeuso@TlqD2maBQ0vef~%1_r-s$|i{Rj>vNSxvlhO6jL{_xg7fpyAb>A>)g_emQM9t zC>vODgc1aXkY1nBYe~EeLuU`-{#cw%@-q|2eQW@-(tX`7y(~8#ksW(w#DE-w!AnFN zZs|AY1jQsvk>S#StK6xdxu>+k|D4q&u;nM1=R;+g4=RR@9A~zbOdP9mq($7T|_rns}r;cx3_<`!e9X0RgHqWSkoZ{dTHuQEOc_^UA zoYa%KX3JjA1QREmcVfFV$*&C`chi>xy{wu9*6pA3P1*9)HfJm%}b(LhY)VW@tYl2 z8Ds^X>Ml}$ZfV4D;X`O2b3WM$6aH)9#t-C;hXkr$zJAFr>F6zp6lf)ifCTo@;KR(qCRL@LPgD=qE{8Mu6%)ZtLIlfhB>&)(%)8j1>u#Ej7VX za`v74Hagsnbi~eNXm?9qf|O@2<5*F2=GM7XA3|eIFX|=F*=`g*@jc z3ImLZl;CYPpy7b=!HXC}^6q9k5gR_R<@dd<;rXq%eN)Ko&SzVl zcBS!bwobre1fKeX63P@aZanXItVVhF9lf-$;j5G81t>(ZP0zdWh0VC^4%0X$r~dnG*h!1Q7I6eaIzwnNyo4;5Mt>RGH;2tHYt;WE z7tlf8(r?#Jhr2S2DDS>3>fE*cnZJDez`Z@YRCZ?%|NIWH>Pa``8Qg^Q3LcdnTlbA| z_)le&Z;v=2?j_C!yMWL%?;=KO7my{CI0z~wMpkS)*covua#t)nChLSFVK*Z4pvigE zLrfv=ZuX?+SrwjZ#PZNcHrXf;(X}dz;SRf6>JW(#oUhtb$%qo>=SWnGG)sTZrTl|o zC1x6_QW-fa8|DyE`#GxA^Rm~Z zW&m8};+8S-yv~YM0oHv9wndQq=R&6|x`1o6V3~d#<9q`HE(Geg#muId?S(|S2(=pL*k>=wQ zq;%JE9tw&qT=vpFy+Zbb7<9zGEx-O$fNYC9czPf1B}Z0gq3|2U3$xH|fnYc5J@6+V z@3F$~T7RpQt#{A_w_?h_6(S=DnL0~c*H&IUrhGk@uOQP65Dq6gx<1PXK|;c@!9Smr zFNYWAQ*A|2R>oek>~Bp!70LwMyqvaSH!!s1v9>NR%G%ms<(504H#EFiSrMJDSyv)- zj{d#g(G>aFn{V!++w4xLdtcw><8N0-@i(C?6fyNDLRVpenuh&c(>8?~H@k4IY2PQ5 zJa<}6!Pba<_OS=07bU#5Es zOw0pMN1V7v8!8bI)kE?~xz@~RFY(TnjJ+K~io7pWdao=*wc=gfpP&jmz5w!*1@f5SF zX;)gf6@oAFG8(IOG9WKS|1l^slB%xGI=2=`O?++j^T{4%E#$SZ;KRnk2}0iz-2rPv zLnyS#m5!_tYnM@~PWi&p4y04ZSIWEL?Cj9XjJw9^2pL2~DG?4oW!R*@CN%ZUr_0Yk zE57vH3Tnif$2#9Ek2=09ZF_akZp3PMDu1QP$VZcVmi6xasNifoWz73c zY+0$t7-RS_ho%fqpe(Z9s-`KaW><8VSMyqO4f(h>uxqxyLx%pUzxnfN#9HcLNzih2 znUDrXW~UhU6qK;7#QRJE%Hi8bQVB(fX1WwgvSC-dNq6z6)FC$;!?TuL4t|c69!)p~ zdnl;=t1zmT?v;-Dq)EYqv#4gsm}BK^KFkX14UXVOYCu^%d@iey?#KAw zoh^B^`@6&!nkPFK%$K^uw=a5o*LS}^eSs9vh+H$lTMQ#d7F!fdSo>9@*E|1R%+hT^ zQz~8EKA&x;0SD6C^W!7lC0QZ&03sT}>6Ex@0d%(V-f{~vy4KwmuPaH+l@->#32G2E z2?D;Djo3F7?WM;_yY<+zBx}_aeMlfpke3{XaM!a%@rPAw%murZkOW2oNlVv}xc1`V=lhd%B~ z_ce5$O_a7p>8xtvgKj#aUd-JZrT!_?%E;FghH~?_coE_uUhXDuCkDOGb^tqX<{U#jh^TpEU438T4xmu;W=90ukK z5mz=86&oKa#U2*iShli`carP7AS{EB+aYH=1@^=v;-wETht_cNjEXX2=jI@tbeH}= z*F%+VxzaZ_tg6c$?YBHH^pB`7g?EgtnqX2B0@AJM7k>;_&#{1sv`AH74=uVumzfA7 zJ#U={uk@JOxb5>nf4V>V6A+Q3n3!XTImJmvY{^|QCsy`PiBeUB5a1r^7RkRIh-~U0 zG&@|T-`fRy>VLOEH0XR}=on?pP^4IOAAoDLyA_glE1wJVkYy&iK-}&NsS)0$+8#qh zYIX|Nu5(m3Ds~Cj+B^jrF$B#b_s{b~hq)NIE3&znQo@U4{JBua;a4Iz>`BB#bLuqK z9Vp=LJl;F?PS7Bk4|$&|Df;jBbko(mKXJL==I^jt^OKhXGVWxbsiO17i=s;FaJ zo{uY_2rU)05lS~gt2sdr2b0%zAMH#=HF#FV%8>C?2}Ea2ychM)zXA%xY{pWGII|;Y zaHZ9blCEP)u{U-3gZqkgErX}>G|fcl(EX3MDRk*Hh~{`A0Me#@&)Ww?UJr-~N*Z|` zTU6-g7f&bUGTnQvdXZ?z1%J9#)>oZRQDo@}qQ*hPXtH;C?BxF|Zuq-I?OpPOV~m7X z;Cc;u7rn!GK^_Me4)~3iUqf0|XV#M*FENc_$&U-nd&2(dSv%c~aEp#0-<$ZQ|4kHT z(`j#mU~~+R4d1Dm^!Ee5F5V&~XeH0FvG>Cq`aUDrGbf#~J(2WAtw<-z04yXb!ZT?Q zD%aN|n(zI_8o8G(diKa+BZ{wOC#vJ?gyak%lL#K2DwbF-$lH=3?f$iuk|KrWD_koq zp?~zUM;vEQk9QwVO=LY~7x-}Bv zKIv>_ZCMdhfx*tHbq<6D&)Q2aPMk&4)vWu`2q{ytWQ>-b*1@Kl;WNSf2XW7Q@h|S; zO*FZgcH5S77VDT+56TCnMpVu0Q*1S2{oaFDmyhPAPOW1b%V{UBXP*S?EY=fqSM_Lt z!~_l~EsRRT{(QL>7+&eM&f98ctKaS@h7Az9ixU5(K1lmCeVQ@H85!+gu_03c_U@r< z&hmg%=){qxDS~AL{`*=q0jU-l`m>0ij}|62ttUUY67Y)oct4MEp&hq#*VTqJTy(X6 zMaghNW++9#f{UpFTTclQMGNBMk%JQd&L)E}HVHtStYC`j&deC%A*b_m-3_j#e+z$D z;ma$l>b8y5PF+nK*1EYg2Hl+hp2<4-ayY%618)B6$B&VRf!Y_~0TQ)h^W+9Dx`knFWL3)-x}9A5R>??!+St-= zynK(&>l2DSdr}|aY(*~2gJ7~>9uMSJYfO|TGZGCnCIlS4{W{VrFehP|Vb?Gy&d!4S z%AeX@|FYZy-4+h+Jx#ISiZj{RD@0T3=pZ@F6?LSn3Zf0K@_XBTqmFIxn78^y5FEU) zglFn79C2EOl>i`YJtn50;gHwx!1Tqut~x0}^uN%j2t8KS2nEkRs|$l8s_Mjl6hM)> zN3Fp#&I!i?Ntl(~KkR2iILX4O%TTinpFzm4C92LH>yFmmTU#Ei zy-$7}JQ(9U0ikir9_ky1(l_qp&dNdz;Bvwb(M~wU#WTAqJ8<8Gx|t|dUz|(#S$w-| zA42z`y2l92nCSDG}IoZqq5sQ4keZ?hF1V!<@tQkKSqkl^B;+47a#v=wk z+q%u>S~rpXJyvpG3w`R-w;Y?JhyHM`pcKL$+0##GUy5ChR#tH5XRs_sx<39GMqsCRtI(IkoKI_n+gYOUOmx zjKBO5uO)M9IVD5t4ACm-Ip;MZ!Tk$oMLhR;Q*w>ZZTEk}T|55JZ9?K7nJo^FYSgcB z^{PQlbN{r1v;sCQ#dFVRY1s^~#wyS$$bWmp*Bm7sY+DSL9Wr4YPtx}x(6U%Gv65{0 zjL%%)GGP+yY=R-$nry2d@I%E!-~qM%K=*@WkEh_$zB|t@XNX_pmzOiEd$nXSAlv3z z$?QixDIh8kwJmv+%9|ja=ad~0-y$W^-ZF!KGre+q`PD-->vX6myWVOGA>DU(oTc-4rm8{CncW1WN*VX_2#>0MRyQxHk*&qz0L9qne%nF<;td{0Z6kYL zLKHeP>Qtuq?Pk2XX)%ynCl^tj1w`zO?z-FU(erVaXd%|p!P_yS5@3c@iu@yPBmeWArAtH0I2(JV0uxOv}}(jCCzN6NVV}+FT;2Eev}Z z$h;=n*;Xz93O;JjsCyvU7}Zq~8`cA39W))nPzN7Wyg4%3=G;r&5>Fz!|P=QlzjMCVCS@1TVPD4VMr5AWrk_rDUS&BI`l@vnZ$M*6!iSzc7n2;cC_=BS<* z)eRPl*LSY@Q_3z1cKBPkj~waPA|fpn60qtZeV`A}tP-M4@%l3CgZ-y2Cv>E!=_s!X zvTSdp0J=})=T%&Rd2`>2o6@6H0Ugb8 z9RqV7;;1um#^(E9^Jm~+Cs|EZF(=9IN!gev_WcW|tQg|0QpJP5=ScwnJUCgd&jk`N zEfsk)1^bYU=adfal z3z6Bzd)V*#)ZQoqtlcF9#;I{lVB$&IJHGGdFAUP;-%qF6xGX$kGq$_b?+WkRDAaw( zF>}A9Bns6tjoUcO{Ue^_1Lv4`ip}t1Ux;d8j!CNN%pBQI3}DD1CW5O|-B7XIWZc8? z`o04*Yj3{vs@XTSM}7wMU8@#@FxRuV(9V(8t_2oE-!VlpidRz8Iey)?Kx`_;Hiw!J zt(cZFCI_Vg!lB|eXdNfS3P@@i6lpOM0pX#JF_nN9`5Yg>3|2+@AJ#rRMXWP;-zi8; zsG7b?`(XX~RlSER2i+0Nf`mxl++`#it!)4|(MqIeTMfSb@yF(~Vqxbf)?azJY+v-fl4a%cuvoL+o~f4|;CFLB>O1<-`i^cz zvT>lGoV|+K-Oi!3qGpLLTDZ5{(2280YnBM1reUDCAvYjbY^`rEYuwH03ZB#7aFz_p zWLF}Z(YvmE+dBAXx6{9Sci|j+1e(Yv{7;i}825RopFz7P)H~E~4vyl3c|>&JvtyNg zC1;3D17qy{T7~!?s*1WGhHw6ukhw0+Ef~jX+t@_jJ7!Fg5W?x`^0@g|w5oPDJXLFk znQCG!IW8!{9QL5U<5EVqx&01ycGE*i8EyeqFk77(i^n)>z~Yb5@Tfjjljc!gBq2P- zJ}T~0wtqG3xBYAJq}IJ@(D&fI1s6Qw)R-TOVr}Us9r^bt@}WwG(M8ysqajVsZAoTG$=f{P?y!ZXYXfU3XMjl319k*b6-cMs>4#JAkzrp444y8X72 zrY_@C_TF(I&P9HMzu2-yjE(-(g*j4+Xx(Cba-NGzr~#2)gQ}sVd^E=q=`k0_4C8tC#*sv7~w5+m(W-dUTa@vCxix4MWD@S7|No zpHe=+88sPxT3o&sJ(|&zk667+6IR&=bRny}cLrL~ojl{+3=AuSKij=N{B>S2r&n>j ze?uwym4`;#Y-txY#EoOR@m4C!f9g&ktqveIbi}rH_0}`gM7hc@%xbym5{uWs65wbIq*5 zqHL;j$(-9IHOg#yV=R)ZvAGUGc={o;A^K@>)dwm!E z6{70PXC1;9L4BPEu?m2%UQpSKc_$@3SkFt_n+C?zHmwikz`6};L*4W4h zSG9jR(EQ@tM)xhuhKPlyLxvg_rce|j)@^N7P-u<7cp6Nd8REJEDpTz zbC(5vw*MviGt_jJ&@e6(j>1XLL#Yus!Nw}7Adl~;WML~0QT4#!GII?il8zwwbIQ$H zT=o}#t3vD_AA-%Tt&xI!`TD|6nM$Jc%dD6eolxQC=uw7u`yXmfOgG7MohFvoDfzdY zk}K?9jhF7HoUOV6n8(q?+W9)%}R~&%_ zU8t*}KRcvdEiGR`0aKJ-GQ{iDuH+$LNbkpCR@#NWTNY3b^aBxkE&KPje4Zs zOc5_3f&8{Mh0FW3x1R`(IiMc%<$!*iPZX~}1Ts8Dx|*2n;%5XvZZvM}ixFPXFPqNQ z;)tfxu}&yzvn}i4Z4k&h@WbODnVRuOqu~V<z^B!~Q_9*JIID(2LsjSatW|-ejbdFj|Sy_qx@5Mi~ev z{05ocyJfI)mi)So7S^qH8jKDx_UFK&br9!m;|XKof5$EJr;29n9(q$|6AgHjxmlRLs zj4*dd9pZlvcUd~=YO9x9v{^*liz2UcMxR`*+|}57kjM)cuDM*U5w8*0gI7!=nnOg@ zlSKRBvHmT4u2FfJau-zeRLsd%H<3`+#RiFdwwaw>qt zAuUpyMvY1i?j*Tx%&KeDLmMmh-AC3TPfqhge37mda^YpOMvV>2q4jOnFok3BgRTjE z5jnU1r=;nWm?i&*=k%HC9bYr*AcJ2Fbpf zPpEj5N8-V!#k?nv%JEd|rGac7?=_$xIhrD+Ae^xb_Ti7P$3BV4i|}%KQ-U1R{by20e9q* z!qQ}0z(Yt|hQVeD)hlfqLxFC*@%=GeJUzPXIqj|)h+zU^-mHZz-_<>nNu0nV8%3Qr z|8lXtb{VL{y`o`+`Q?jKRyH!(jWr92PF?ugq?0}@B}9=g+*ohKwmY`YLJMAh&6*07JUk0g$)nRF@720M{wKL1JbW`*Y*(Nf7VB)3|9Qt#Hy zBulClyp(^|Jcbtrrn}kM8h$bNUo-kaXi$4;?Zk_8T$VHqN!Snd>YRe(`M*Id?@tw} zIpjAj(d<+GCJ(bG3_YKN^zeosyYBjVkr6sc(lF5Ul)SCbS+DT7 za?`*1A)3mB*}w}rz*3smr!V@Z-9MUHVH(&q)`J9@cra>^ym^gu5sRH>3bmW;SY&`j zmb6{mZ*jV|f@GFasCQ4634*`oh1#w|%k5>MCd*r> zfKziRFlzJ1!0j99?`dRCvyuDx8OjYzod09y-2hV_#{ynyC)9_S0)_q3IU4CUb7?A9 z@>Sm=XW;Vi<+;; zxv^~fq-i(?i{5^8ZzohCBwd1Lo*_K_Ya;Tu6_jWihyT#go^EZp$}jz_YgzcTAZh8s zUfA}0ig+kq9oQqb+S{xFEv6Qo44<5YYb^t*_v`8bzIlR;!PqXCnly!5`#w{?BQ?}! z&3~RQoM1iVpq`e)e%}Qzl`M3h9T*!7R4#_udZ1k^rOEkOPS+ZxJ`KU&ArXXe{+=vA zL-$G*(d#xevY(Wy)1ve#cQvoIQ$z8J*C|!n7?!$Qu=Ig@{?fc-GO9JEa&Wl8h)b$v zRlxgp<$?}|*jWW8x~$`#SCGGmcZjh+UAR;-R_*rpHzvIV=JNHhMWpsnobb_WIn zEwJfgdupfAY~ZA0r^s|In(q7046bj}S{>q~fr=U}g3u69jU!E+f$3(LGW#D7L7bBZ z@WVvgbo9e#J{+3aJH1OA?|Ko^`Msm~x}|V-4}5sT#P10t;uVP|ugWNTtl-(JoA!5B zj8*XBFP;L#4!8=wb4Y7C{cQx3&n*MU)||nb?02|k@_JV*k}a-n*j@AQ$=o0LCaMg> z)X6f1X|!wradF9Juc=2xcxrl@0$J-amd_%tZIv2(CUmp%(|5m;@OVy6hhk-sc`?3S z`VhY@k~{5O0chM?&g1H3K2=TG{H-U#J?*6cwR;uqp5*gLvNBt7o70bsPKFPZ4m+1q zDz|gZ!1$DYZFX}G{3>b4S@mz*i>XCxk(oG~bIcEJ@i0}zwVYuWYZcdHdYmlIEyqi? za*JI0OE4p=)xmWe{IidR6+c?52&%Q3;tZ5(v0n_70`4)6#9x2bE!uF-!)!zxw$^qc zvq6d;w;LIUY=#D~uKEJ|)@3Lg-HXtLy6W4tvd6cL=^c{W{_hHf40erRuQiT2MAbuP zW95=<8u8f;%748U81j?mY+gyW1!?6>YC%N7B1ht+wl`Ws2wT8c#MA`89~L{-sV?5E z8IvLRIHP*8c9yij71%gpx7@c}q2=>w-GIC+dy0yj`e{l3c=TGQNlL(v)bQF%ozoI; zXE^$&^X7gD?WrwEgVfNEc&^e)15P5DSHm`4is;g+oJt#lF} z2&-xPejtPO^GmPKXB$Is81X&MjFLBR@k?7*fMs_zdQ9#3{-26u@kLYE_}ahK+!R;|k^d0|YtmPqe_Soy26KBlGV zuA!=IzqBc$0PUn#=f%+YNQVOhT;Ckc+Kb5cl$xYf}-$ zJk}Yb73^)(l~QZtR9Ie^wwUhGMCnd!g=C!{qRzB;U=Ot)oHA=CLxLOP*W&R8i32|a(3l>6dGepo9N#KL<4@#000}}>Aon4Dnvuv+oqQcl?l!)-O9lXw(EY~^G z{!+gg2r!BdNKd`yVMla3UmAS+g}GV4Bqu;qbltyHD!G4{~A(fI5DbNTV8J^G`wX?zUTrZHB;G&fi|DqbKd-?p&Ao}c z=sy&2QV{5JV@%Vj9<7085b5p*7W0{PS{ufRHycVRkhA0PQ-^mWW0u zks7H@uic5zG5>ND7T7wF)!3w4^zrZH#e5Fw!^p9-k)NVRP{6D|eQ?+YZ3?QNYxr1c zS50SV_GTeg1l3;i;{_2z9Ig5OADJN1-1OjDi;NzXJ%J6#1o9)$korIcg5D@|Ok{ow z**E1XkNgRZz>)M&b!7KcYJkZpBK|;ktANxXzw_+N1ef|hLKN>%56A6P5n(gk6CxGl zpGdigJhebb${E4J77`i^XjcclvN;#JUM|wWoDx??ra_TvOfcyGJ2+}#QZ34KNKElv zw}ZM`BbCGJ6J0FS8=zico-2pPfZ;_W!4Dn5?>YGI39Wn!r1TGKM&({*Sbz5%Y{$$VcP52o^2+ zjr7I&!v>D%u3^Q1IQKMVGvDOTpagqiaq)$pO5Nm?2~NCEmGS^kG*JAgg0J(8BXIRL z6vWVc&Kd^d{e(0!1GPO#M$i8AxQUj8(dY+o+Ag2S?7z@|HT(u)|?jkv5Xn?oGBO@4w!6t)j*C{1hNglv@ zYeo*W#}g=6u9%#TVg|Dx8O7TE0oxgW(uTCLESpthp`GgPAn9QYnfcD+y5_cQ1%32y zJH@4dNBuGa->f>Wp`26|it}^;Fh_juW9=FvozpWfEe3eR&*ld-0;xg{AWeXi<>n-ooUjbMNbrnO&K_$-lb2G+v#*Yh2{s zCWkg&L~n9DIl^CkLgMenMbEcVp|_XcY(8W;4fS0cHQm|SAkBb-)OR6RmASnJQKIu` z_w-zH_vSpM+FxhgQh_?G^PdRmK*oJ^zn@4tz{m1;zptsHtkw@thA0PQCT+8{Ed_k` zNwQ>nw3UCsn$PkGgvZL>RZ6Rq1EehrnCdKcb%9li$EsR=dkJ{K)>E;BnD! z7n0Y?{tNDk(O>-+vhsW@IbWaGuk^Q+H@ZnK3CSQaz#HXrn#fBwoDj%M8XmBi%FWiP z^Bi{PTSZ}lPx66+@yWOB1HQ`)%l7P$gLkdU+-xTEu>wZoRmW%eWP0elA1}-wbULW7 zeskaNps%}SLu&Hjx1UB9G!*=a>z*Vq$qVHl^QqQT9~68k^_R(if)T-^|C2l7s;jgT z-E+ofb@47wNM||D>XU^1_1XQMR!Y_~W2;@}G{)%K&~HB|qltn!E7%6kr@z49>h zdh;$j}VolH*3%2KFLk0R_!-DL1gjt69RB3VbCi>(NNGkQB z&E6p6PlFg#k!}%t*)`%AZE*RemJf@r$i;!DlsH*;PLH#*$7HalJ6?1P0qMInC2xYn zE<2?#Yve00x);ucKQToj$TWaN+#!SvW^gJWt&z2@2rbrkl&%)bKabHFTpQh4scRV@`4fr0KIb2No=AxmqITZiy^8kEeNt@w_FTWRo~l(jXVl9ska`id zQtR1LQl>KZ#kJ^NO`gmJ#Mk&mf;Cv|=;f1o$7 zNG%B-zJG1=x(sftSQ9YRLcB`X5a+PeLOl%&JkP`%$Rk6=`gQ4S;T%BCcih5O0q$-K z;hBe=%!54tjsHl0Z6z?Fg0Q0Nh`R%uhU2%^RxTg3m;$;=-M+CoCLhaxE|X=F*?Zs$ zztMu2qALa&-A}A{xwA5GUq8CK(Al}Y#;}R-Tab|G92)#Bj8H3B+nlRZBqaNE<{>V*#ST!c!9bq?CSFWgQvq5+)udV1GA{~{o0tO~4( zYc)TCPSH5M2aj#_jpl1n#|Uem7@&Ci#|u`vA{_@ z(Kkq`uW4%iDjj34u$rFxo3;#OZU&TO?-!Ns{8CT~IH(V(4Jz z{^RTu*)R-0!GrUiiFS)Nyo9_8mVbwSBgi2ejD6z0vFwSQ8K!Ha0TdLRshbjq)ZsRM zx;I7Cikq~slei(p7wp3BHk>2aP}P1Ha-2kREo{D`pCXT7^2NG=OEn2lgRgp(;wqt}gu@qdJ!;3Ym+t3sSc0A8R|e1le>pxL40_&!vhNktJ_JcUM z%6hg_na*~&vHHp>q)Hw%v8=kzl1G-5HP&Ty2N=?y6EUydO2qL?(7+SaN4-Bf@bkM= z#A!8@g7;<3_8@q}_tiS%&}fDAwc>(6`Z|khLgz#kWQ(76>FMH`)csd{UY6*~&gEb! zom$j^nK02~VRC(0CtqU`gktJLi0tChNxD zEDG|&GsYxaS{z0dk{#R}9u6lU$0})%;Fc!LmGm+#Z=2H5bRVxzd1D=Qlt}h0{Tv1s z|Ge?8uTW`g0Gm{wZh^sG8)KD$%dD9c5b0ohvu1QGhq)Ra>R~ZEHOER(CuK42zC>wz zJE~hyA2>~_kQVTxdscLZGnpZ*k2rj)?%T-~hrq=U)t|pI9nIUTos;-Z1<$RfAV=*_V)OQ+i{@WLnmn5<3W6T!NQq#=ce<&!bZZ56W<@% z4WzbaQQ5aP+qVu9eH{aVL`@L?nTq5b`+F`nvM9^-AuG5cF2%==)zpB-%lpqbFCYKv zJ)ISFbnd>8tQeH2ZS-Y2c#aeGBNuib5&j->=-xP&dAViGjWj(PueY(sVrGKKF+9;d zX*ZDd^wnAAU;1pHt{oR%y%#|) z5b4(T9*1Eu()-U=X(ym8dTs1b>%LGubiz$V`2xn^<~Pz2qJx4uil4r*cfOr_)?4$t za~s^p;gmQT?AnK619fx4nBZ}AV5?(^?@N7b6=`>H0cmzW@b|tADtY&7&M<2N1j?Koxx1?`D;g?+(JRxNaA3=y_N32_n09X z)p__FQy-gJenXlTe`;iHs(4KkO^gmdeDGTMqG&2q+murwX3xN;Au=b7TwSxG?X%*S z<11#jp1+yn90qm`jZvjgd~abX|M}6`XC2k6LR?kJIbpvO_dJ2_j4`_#IHrh2i;~~` z0{S%%`Izw7&sNDtk#gPl27)QVCfj!h;d!BgB6Yq&_uN-sG%Jas^Ib zWdc4(e^q_w4BFqex8Z8H8}CkaqD006mH$SrV70E%@#}6@oX;_rtR-#|7G%fYoGvZn z>?7-!w2+`9mGJfd+W*&VrQ9ThJz-q3w=ToGW|#EX_`thX+Qu=w-W@S2bYVTp)M|Js zU|ilFJWokw;2;Uqs$aRSfe}R;sB>!>Bce&?&9~qQY5U1X$KK^Ph1x{{<#G?~l^cCi z(cYU~LZzv6hP@Frm2{22ho7NLw>|{zDc2W3C^}G`3DuiZk*GK1{{Uk_oW8p=Xve!5m9EirLF3kR5dUFvt$=?BFgQqS+yx9lpi)Q}Gbb^xN0>U1C_NB{@$b z1G5OW2yhJKvOwLL#&`}?XRa{|-pM(Ny6p(=52^--Hx@^6ba;gosUF8g=j2yDgL)nEk6p&hJ+_OPJiyF{Q) zVO`Y0_g%+ipPopGK%8CQ1?{YY5lP5JD__Kup^jD1odLTF6efqrH2mz|r?@d+jhl=08Xl`5vd%Vjj$NN^ zR3N2b%7Cc31|-imSj83=>X51c&w_T$_m;NQf^-?qT53klQj+H*QF4Tx$PEr+ZEUi`s&cOS|J~!rJ9GWZnYZqYjvn| zRin;bit5z@6b#)!@A`c#AGTxKUj^58lLhO-4R8_QZ8j;)V@T}WejBFt+Rzi}#K)a! z_%}Ik1xLJ`edXP})``L$4sNu4ezyE!_58mPHQUOYEG8EbcJG9$4g_7u5`T@ zwV@F-Z%&|ddm4R_c?=yaVeDiDBS%gQMV8RJJ&&I74BCT}X!efE-_{T+-2EtU$TN4e zR2^+^)+Z^{U?Tk&8*kzlbyuwrSyqT`zJcfKuHcympJ{Ok%~@CUu{w=D>d(U$qs3ZO zg8AoI4fZoudzJh6lkOaR)=d{(9=`0(!)G1Y3NzlTxur0U`l=;cb*VKMSKII4dS?M{ zcNHOXs7$VP4IapIgdvn28x!c=nbnG-Ly-lvdPdOb>_g4G{Jt!9$^AcsPC35rjcL`u z&I0Ub_{PF4lPK()sBakG%VJFb`C3SRa)ka8<*eu5n0DjXj&_& z64h!@fX7)w94ovSXsq2n_P91Ebcwjdn?+z5Js8S{$o(YAe=z^mw&VAyC=hzR| zp;uuWVVyeXcGlz>wW`q0f^QbIGr-QXzmD|-ugZVmga0^yz)4WS-CD%0;E&7FX~%sY z+nU25i$VCuwOGVZXbQswlX9twk%Thj4Ha|T|hw!&54X_ooue7pZC-k1CK_Gkf;$BXbqTN2)^xQN#) zFDqbU<=7XiEOD5!Lpwq`7RGwM>`JW94)F}Qd$mg12bb{5gNt~z^b+2vxQh2=KMCh< zjoe4ZRF%AUbl`#f=G|XuM~R~qMe@G#J6&tXpq>Qp?7+_Mz%z=6QBTs7AXXw!XIK1k z|7(@~Tu@g3e;#OOfSrMMtQ2aX9Sa07ywSi717+eJVg}%xL7K$kJa%Ar4%|hdodI zf)a#Z3aE8!z~(L08F=b`9C#bO2S zUFj2fA}3(sg0<~^d5G^@?e-y-w`5(LdsqzbVPPYJ`Oq%rRC}1&*u!*i|D4SJP0O}t zH;(1S@>pJ2Peey>Y#zzF_H}(Mmax3Nr`uZDiO9a}$v*9A-nHQF9yX+(l|{q52ik5% ztkB7=Jqzq4ZjZ3B{}92wN3x!W@bNgekM+2j^NmhJLNZq0wJNg8J>`Fh5&t92mB;F@ zqrTHv5r{-GdF%|Nix<~vWGcT>+@@Uy))CYhShpB{22(KKMf;u_g@WClI4<9PL+B=RQa)VR&5DdSmO4gJ$ew7%sJUauN&4H9##s+%{hE;jZ=^d@37&i{G}{#?us$ zd(3E0?yIM1|3J>CU55tFJzgxrh{YmUG=c>tSZG3X*hO{xa37}+_i%c;6Vu7bHjajK~xc$E;4ozvb<5WBnQwX+j=Oj}z%twc(3+zhkdKFy3%o15O4;`_tlb%a801cNU4gDdb7 z)&&}rJH($Wr(P1yVhdy`@XG7{t=?9PIh%sM&2x zPjcMFw9~I`B4}qqV+rjhw)@Z@?ndouJ!<@IsNU?wrI7+WUv&|0w#f(l3d3KS6Rl1| zUs+h;b~FT(K#Bk=Wwr&$vrP)@81k7mXBB2hm-!Xs$^3*v>GD#X>1aWYvsDXE5ZYzT zRBK3Vk+T7pJLF@x{wA`<@1Z`}jh@{B`3Py#bFz9o3CHd*WTL7 zyHU(Z|LorQKMJ&?xE$9rDf`1B9RquPXxr*RnWqt1GY^pGsMZi!y6rLu?c^L~5ZLiN z%{Ir*)2-=7(RpZ>I$e)^`6z$j?n1ez9aS#*`1Q1Ch-{sw3HAO?RIIn6%GZSwx17Vd z8ijTQadggoC$y9KlSG7ec5r8fGF#VCLu#34Pu6D&Q$UaqiEU3uv+B`yCS=Y7kT3nU((rgXBnXSY(a-A*J;-YMam17C*2y<_bm*eI@ z5z+?pkv))$JN=nxa+G29WJrFSJKzd3gtZatJ8f|7cE~$Wle`Z#U_4Zhp+FrvS#ZKx zrZB74S%KP>8q}@UN?U~*R|$%yQcyabj?r*69Q&>EY^YUW=h6|xQm;8N%)s(ui~$p1Bs97pT(@GhdT~#Pse1N;o2Pj;t z!Uyfw@cEE@0C!x)?|$mG9ULQ@)g{%TCB-u$6-pHaM9d%1ZZ@< z5t%ulcMyPaQBz;EwmgM%S;OThmgh#*N;jH(!xo&|oK`S5df>p+@hYZI)-bW> zK%X3A%Ss<==iAY~I)sijLZnd*eP!6{ko-Qg&_q{Y62rSo7?j`XUin?`@ya@l++*lo z8$tVuB@XwmPpGTTrj9dn#53;Zo64b%KnV+E@FH;8txhumtnz% z$&kz=nh08zS6OkD>mdN7Sap`$(NNdOS}X@0U2)#iAOfc$_)mhWb@~0LbIuiUTaw|m zBd`2+dEq*iXrUM2lxY`@7`6qBtLA#(M(NC-e2l{YQ1mv%KBckLGpx?Q%3BZ=y_|Gx@kK_rhhl zN51OK#^=3RT7<-c)EVl;{GcsU^NOu~hRB>h`p zDEFK4jC`pf1ur+I;*I7syd~3LEtmI-im!2NC?B=KE;NPvkU4P=AJsD4_7dKxyoOh+ zZsLW?n+oj+PW&sUC+|@%{f>l{wz?$Ni55?F^JN*X?XwPlI-ZbtWv9IqXce zR>Cklcp|VfVUh;c5xRXJ*`b{Qc`<0mb;){7uCoa*9ZF}SYsrLVnpUA0Lv^LKgFC`T zLNxBb9oo@RWe0ch@XqSvdd|02rCPfAp4`&uXBAgC3*(I`n#1lqurrQ20y}Hi4(%xR z8OPdGfJF)R6pRsy%`@aRe59J+kn!NbnZwS1q`-&Zj?jnTjt)D*ALk|^ko0XGU~T(Q zKJpIXiLlz}G5m)QRlb8$m3RLHo&(YTL)Gfek!pG8P{h`fQ`SS#6*j-IFCU;XeftEf zkrS-#oyw2HLy@fSNY;J)2!W$hgianIeEJZZ4dyZ1=W2i=I=Ppk4S zbH}l0$K$#3tU?~~Ew3T3385Tw&rJm%>hhelg|v*NWlH;Zr$Z zrwZ%VcD}{x_9MAA$I?-otOPFXvG~7@^TgM6{#r z(dnLQpMA${Eq50I-dS$7qnJ3(@X%N>212@nD6EUNx(q9wKB2V(J0m+ZvjaOLGY_E| zLu?h!J)z}%gmpT<90Qj%tq$7&oY|&b_UVbVv;TBxcW`+8m=2FlEXjU+7qpAe1s8>O zr;m>C@Y`c;722Kb*`Qq{3hj2IfNn=yjuYgWmi-pE+luMvNTwfdYfE@{a9{zt{r#|x z>pc6L+HczL1Llkf=e1p(#!-GH++NsMf zw4`#$%OrsvTcbq4j<8OvxP}&D(9SLc?dJTmPlR>`*wHOVK*#9>c5FGm7>a_qjRl2t z4tcS5$ji7>Ugpg>r)j^4Adb@%)=6uioVx$$ypxs=JB4=9=~{4N#{su|Sggwj7NH%1 zom*bo71YT~wt;m%c^UT|230}2?7rPW&UszjF(TbKF|2N77QWf*uWVmEjxH^|(FLgtWzW%SkqC zhjtdYqtlMSj!wIz8G<7V+GRM~khRjLRbz9U&7vlhcsh_VU51Nosrb6-wtVoHpiB03 z_+S*>@=`yw)h8clePEdC;`X4r>z4OM71%9p4L`+cXF)qVu={PGoe7O)(F;PmzKss_ zZgrtI(vQ~7ZVji)Stv*TY9n%%8x&UZ_*3Q@)qO}88^ImV*^SA1+?M_eOD(+U9G5aw`%bTts3j^M%g;uZ#{CZx{yKF+%!R4gI0nyjyWT4(|#?i zJbMP(S?;_uryZ|ngY28NuL@mdepA_&MKT!j%56Um?b=c6X;a8pDc6wm++XiTwtNs> zpRC4}@oKFyd~vP{U&o+bt?0~Y$9sv+#Os51afR-r@~`m4y$?_^nuCSyPWjt!#%iDu z?vNbCjccsSMT5D%7mjpnADhKENtaxmJSo z{>x}sE0B-)D)~F8lfT~d%zJm^K|rW`}p4g5jUv-nBl zO*}VJh-YN~UKq&3^Syca%Z6L{MPC7)>CMMah92NA`tIUyMoRIM@pAlWM-Kj`J4dG9 z!M`nh2Y;USW8}@Gp(R*_iiHByEtQ~YrNYV&w_1t2%jGC=SK^EQ6uesdIbJOP2)}pb zukpv%evFjiEEGrc#SuK+9lxXCu5_vh4<-w7f1*Ieehp)tCA7PT!s$W__{p*c_!-eD zM=1;x5v~!Qv7#)&opIX{-l^NJKNT5$lnnPIBc&@zbQ{SsoZ6RyTb;K=H*r(i+da3D zBJ*m?g>}7|B8EU?y(&XW~Xr8m{$Npzh1|+xVix5@FqE9m)8#)6z#>$#}mz4e#`1 zsNU{Q$Gcq?tW#juL7Vu1%C_&d$8GP86(m;vRwgl1QF^CGz)HvCyFf z7l!4xYWCQTnS(W}QYgV)WLZN(3GG^({ivSnkn2;2TzQTbINOmg&rZ5hzZfV4ljr|U z@hAAVS#RRsWL}W=4g5vX2U>jM9XW=N`*ZN=V4lK7R(U0;`=UQzLtvS!?lZYhzv|A@ zu-D7o1-Lm_f+V?@(?{fflxJ71e+WGX3m80D!tjw3W2dW_c;v#w!!-;aI<%r_UwB%p ziVkc{qsvRk*pDV>51N;I(Z0%J2SXU}j%(N|3qy>AXEpql^V3<^9h^{?9or7iD4JLL zP`B7E$1TsknRZl7x1n}Uo;P#dXjtq~0LZ*`42jhO5hB7j0=Hq=M*sR4de%qPZPpis zcXZtiZ_enpM`c*UUS*ihJcf@B`AnE8e{V;19kEtK7)U1`^Wm)?y47LFFxRz%b#>V( zggYU;3(I#{K>umScLKf-5aR*ZQCicLWJsM>R+3Jyv)hx{DiwMYtsQ26GvH(oGj;rsh0k zwP35jNRG7Gc(*lEb1f3mvG@p!ji|dW>a3&7l)BJ(TZ=j{B=udwJDKP8@^A1~#aH;c z^%j`3lf|y){$Abz|J{P@b1g15-NZYkUn#hIz2X{PuDFR;DsSQCvTHidio*=e{h%Qo zA2p@pla_3J+A8;Wlk9I(CO&BtN#7S8cW_Cb$2UjIkvdV0LOCb*mReA{(t+}|E=$WD zD3iaZQu*7wE5CVn<#&iGo~py$iCX;5xc6I(ty@Xv6-ca#SUFT$j?;mq;e)G(Rt~Ub zf}uThIrq@Hya!X1;z_bsrF~pcr=9aOrZ&gPIkhewKUFP`GqpNp{wK&jAJx2cBr?@+ znY-_|Q_Ir+Qx$*A@#m*|ME5zKKm>amjk+r$O~XDqjTS{yj_t&RlJ5C;fCevPi+Pd{myu%c7Orj^VLd zVKl^o7140mFr97(aBd%15H518;EwX{KYUDd;L(Xkc_XJ--?dub-b009Y}u!I)%Gkn z#_49Bz`?iJIQSL9M;1WaI6Rf%hpNq^6V=x7sa4sOZmHt~1waaePON-v`=`e$P5ghf zr-}QI9v$QO+Y{C4qZ0)m4+%n|I+giP9?EVrwj?! z(A4lL<~AP1TIQIW4L#I$KK!lrbDTK_70?Bb6wJ-*xwg)?$uVfeK5BWJZn{$))?9UR z{WzT=%mj6G2Chr%**sKvw+`Ujru)!x9$G;2R9$mccqNM!oG)AuFM>O5Wxk^XAjvL< zZtfjhxz>Jgdvu8Hy?qto7sWysc4?Jb8z?mWW_~*~jE9GG@)1m`qfY_e8B8?&T;_+0 z%Ny|+o+iRhqxe26wbptVDtp#ip|ZQG z15=RVAaSeVv(g?B9C97fa-5;B439mO*62XS+4%5Tlk+aT;lpOw zkFCuBwzq=k^Wlk17_2=sHWm)M9nf%Ewk$dk3|o2ZjQpD(&1L7=U@kj{hP~?W=5j17 zRzqXASK!)OR>ktzg)Eny2}Nais>v(27+^T;jLO~@FZR#-rWNKb`YpJp;k8i+x4dP! z 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 <)oWyTsw(^kXp#5^8*C2{5V?yGsh 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ð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 diff --git a/app/src/main/res/drawable-xxhdpi/seekbar_thumb_normal.png b/app/src/main/res/drawable-xxhdpi/seekbar_thumb_normal.png deleted file mode 100644 index d043cb9bdbe09b56c09f98018350d7153e1ee69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1607 zcmaJ>Yfuws6pezYw4eeaXsv6oR)u7D^MXVY%?pVVq$EnLuPn(zG9DZu}G~7 zh+3vpR3ueIoK_K0gyNXgB8oaiv05vRA`d|Yi&Ki};G-J^?GNkD?0(<9bI!fzK4!Nj z#4qymo$5=Y(fky#vP9~f<9WyVP~W^4HD>AvCFL4Yg{P1<#ER0ydOR5g6lNq9O+*p> z`t(LLnnv@QX;f=SjWSN4!_7>@gJIgu7K%-yMK7>h5M3Hd0?BBq5fjq?taH)l^L(rWv1!)dinwp5N#Jw0n8|g0CuwpBLsFKeJHMgx_jIp9T+&1PfT*i77-3c`FoAB0#Si^ZT23}QV-B6bEwgpEXyp@hzA zw2(#|13VFtWITfu(kZ2{N-$fL%GZH0Vz^OM%RoC~0bwQtn$4cNhR_6=h`y2WRy3hr zZ$ZICl)y8rI%*y%VIyR!ckfQ*0a9uNGF+EoMln($6VfRUQ*YD@Br*=fiDC04EGZ1b za*kLUDd)?jJQj~jIU-pjTm?pu2&O|vxW+f!sCRM&QY(s(xK)kgrjh9-7;q9N47df5 zN`W~^Mof>}h`FB54hu!C#&xJZ#)_MPq1FhDZ%NOEI1&yo3W6b+k}Bu$IWe$UDy1w| zBm_w*>94r@x0F51h5wfeQer^QT>mrY5f`;Qp6lzarHt2mk7CraTdA$ip5S26XroUn zWMZ}b*5#tRX@TO2=Oa@&g}b~3KZsN$-Qzfmt7keO7hc zb-G}~CVsx?Wyr0{hOb@T7p{c>WB2Cs4mo@;I=t73rGMQIsPlQ8-4c9emU|xC@58L7 zR$)}$r`q5kmwGz_o$LAXcSrE1g_(o&*rIMzz-{kK+VFCOuH8Ay6`+B-(q_0;Mif?I z>CL_W6o|Hj?KxC=u_JuW;eh#<;d@;0y7>mRtQa|}EuT%za2YG<}x zpLa4St#5KvvuR{pS*5)9KeT^UTiCv%*6U7ISm%<8x{|1hprrmuT_-uGLYMcKJZ)$#Z}XeN zNL}4LP;y{@IMi4o3kr*#UtPGo-tM2ii*yI_C0)~UmhxtsmhNuOXThnHMWLIT(DU`T zW3{S#Nh&%|A?-xl!6_Ck~IKj_* z;cK$w#m$>PST93A+v1#2-1YPIkb}-;POnF!Zsupzm@lt6*iziFjg`I#Ro=MrceA?P zTJJE0RwcbxH$`F`~0I*Bd#}|HkXqzafr4@czrFV(kIoFz=0lACBou}CTH>L4y zhY8KZ@QKx-zg;L3)il;g#6=gLn>Mc%_3ubti5$#dGy10|s`2i^o!@PLaIEj#v$>;^ zOvR^ZeQs@_5-%iFV_^ D91MCq diff --git a/app/src/main/res/drawable-xxhdpi/seekbar_thumb_selected.png b/app/src/main/res/drawable-xxhdpi/seekbar_thumb_selected.png deleted file mode 100644 index 16106bb32bd0a256a4a2766273d7a20139b84b82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1886 zcmaJ?X;2eq7>!u;GXp8ZlN-z+4MiL$YzRNI+1etrvn~ z5K-`;Sg_*-PDQj;Q5X?x@#HWSL5s?Gptd7mMW-7D?GM|X+5O({o9B7o=RLmJP14vX zXD3f55{cw2juyoctFQHSv?sn>-qq`fWeOex7S$N@$kDiIA+ zr|{!Mkt4B)oq(#raRZ;p%*e=KWUv`1mdXTqJRXx3$P5gm69~F7Q;#c5biL7M)Po2% zsxZWWBd8v*dQ>RUbX-6slzvD-XOKufI@TLU3PqHRX;K)NAcMu!>8yFZM;q}t_>+v! zqK&dl1I&zrjc7WiBKncyGfF0E_y2*cKtc^)gsReYupSqS1XSXLp+?kvhyw-lxRIjp zKnMiEh#+AwhZ`OOvDm>}!e9$WxnjK$SLjvnC>Qy}h5nbzhcH-yqnHdu(?+`|)u1?P z)Sw0cf&kwoh+d6m7-w56J0cXukX5ic5<_*s`_k}{&x8jf1BD>O3ISOlp*8^nAX1jtIwlH#PC?nk5fx*KF&R?Cx#s(ruqwc zbP{n{Zi+=hnaOe`p*yBn=sv9@J?VI2M@f#xqu3pcaV>U|`E@r=_o2<0koDx)#;m{S zEMMQ%N0YPToOT@k$$`$kj)|S!*d7IKadURIQX1>RQU*4xy4Sa6AA4}`8TR1aUE0>{ z)!$ssHRY0e9vJQ7?d!~vfXtBHFP`_ikMppR%yX9750RGKDov6*JKCBXST%a>r4qTv zHT!Zq?8M-*2AAJd_pd{_`wluVY@g@OYQU?;*{_S;UwHLgF0Y4N(?lzvCASLfi?OqE zoBHNc$i%d6qSHPyYf276He#!)@Pr}SxtG11wN$qUW z>}k1ieCE>rDVF{%Q8l}Heit-d=&t?G_@-LFN$2y21v@G<658qNp;L7JLdx-M@pq*s zWaSR!_p-yfb5avlBc<1-x&B@)qWluS@lJjJgfwM8*?i!~V%ur+7T$V8npoR=-60@< zCbf=YBDu!qw7PX@%GzY2mRFN|@s}$X?1CGHAN1bXGTVIr2>r?8#-;raJLf`OG5lE+ zZROUes*M%fZ|oaX8+4?y~)R-U!OKNnYCW* z)C%qaBW9y29c*_y%a-u=<(4%hJUpd5yS!qZ>#vP@WnN8Bn0Ve3neWLXPCehit)4S( z>~O+7o8K)f2z3c<`{L+c+vv>cmam_N4jbh=8t;cx9vmP!w%@2Tq5QjhdPB+SKfnzK z{JkxAs2l2cR?+Hw+_`J6hi>!#o?et}LTBGT6Q4zc0=SP(sIr5bzM87kI`-Nxm_rsc z_zsG+B_(r2UCEZmwMb6%^v5ZxsIy7rYuhUN2Bb^K>G=hE6WUz&wyqhawG26NSI(}? zY5#M$uUuL_P_}c-OUI_aZ$5L`oOkk<$U``E$K{EpQLgv eG{f9&GoDmJdCh1(u;RY;k0*|Z6&($i=luiay5iXY diff --git a/app/src/main/res/drawable-xxhdpi/theme_leather_bg.jpg b/app/src/main/res/drawable-xxhdpi/theme_leather_bg.jpg deleted file mode 100644 index 1aa04603deb2974391d108dd30cc6ac29c329fd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42402 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 - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_blue_touch.xml b/app/src/main/res/drawable/bg_blue_touch.xml deleted file mode 100644 index 4071b04..0000000 --- a/app/src/main/res/drawable/bg_blue_touch.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_category.xml b/app/src/main/res/drawable/bg_category.xml new file mode 100644 index 0000000..388dd6f --- /dev/null +++ b/app/src/main/res/drawable/bg_category.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/listen_select.xml b/app/src/main/res/drawable/bg_corner_trans.xml similarity index 52% rename from app/src/main/res/drawable/listen_select.xml rename to app/src/main/res/drawable/bg_corner_trans.xml index 18fba8a..3ccb029 100644 --- a/app/src/main/res/drawable/listen_select.xml +++ b/app/src/main/res/drawable/bg_corner_trans.xml @@ -1,7 +1,5 @@ - - - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_corner_white.xml b/app/src/main/res/drawable/bg_corner_white.xml index 7d542dc..56c3fd3 100644 --- a/app/src/main/res/drawable/bg_corner_white.xml +++ b/app/src/main/res/drawable/bg_corner_white.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_edit.xml b/app/src/main/res/drawable/bg_edit.xml new file mode 100644 index 0000000..9653cca --- /dev/null +++ b/app/src/main/res/drawable/bg_edit.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_feedback.xml b/app/src/main/res/drawable/bg_feedback.xml new file mode 100644 index 0000000..ebfc279 --- /dev/null +++ b/app/src/main/res/drawable/bg_feedback.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_coner_line.xml b/app/src/main/res/drawable/bg_google_login.xml similarity index 64% rename from app/src/main/res/drawable/bg_coner_line.xml rename to app/src/main/res/drawable/bg_google_login.xml index 856faa6..91e683c 100644 --- a/app/src/main/res/drawable/bg_coner_line.xml +++ b/app/src/main/res/drawable/bg_google_login.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_listen.xml b/app/src/main/res/drawable/bg_listen.xml deleted file mode 100644 index 14c96cc..0000000 --- a/app/src/main/res/drawable/bg_listen.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_login.xml b/app/src/main/res/drawable/bg_login.xml new file mode 100644 index 0000000..a16e689 --- /dev/null +++ b/app/src/main/res/drawable/bg_login.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_login_n.xml b/app/src/main/res/drawable/bg_login_n.xml new file mode 100644 index 0000000..39b5e82 --- /dev/null +++ b/app/src/main/res/drawable/bg_login_n.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_login_p.xml b/app/src/main/res/drawable/bg_login_p.xml new file mode 100644 index 0000000..63ec88b --- /dev/null +++ b/app/src/main/res/drawable/bg_login_p.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_mine_buy.xml b/app/src/main/res/drawable/bg_mine_buy.xml new file mode 100644 index 0000000..c539213 --- /dev/null +++ b/app/src/main/res/drawable/bg_mine_buy.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_mine_buy_n.xml b/app/src/main/res/drawable/bg_mine_buy_n.xml new file mode 100644 index 0000000..6870496 --- /dev/null +++ b/app/src/main/res/drawable/bg_mine_buy_n.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_mine_buy_p.xml b/app/src/main/res/drawable/bg_mine_buy_p.xml new file mode 100644 index 0000000..4e9b5f1 --- /dev/null +++ b/app/src/main/res/drawable/bg_mine_buy_p.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_mine_vip.xml b/app/src/main/res/drawable/bg_mine_vip.xml new file mode 100644 index 0000000..13120f6 --- /dev/null +++ b/app/src/main/res/drawable/bg_mine_vip.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_popup_menu.xml b/app/src/main/res/drawable/bg_popup_menu.xml new file mode 100644 index 0000000..b51849b --- /dev/null +++ b/app/src/main/res/drawable/bg_popup_menu.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_prefs_color.xml b/app/src/main/res/drawable/bg_prefs_color.xml new file mode 100644 index 0000000..beb057e --- /dev/null +++ b/app/src/main/res/drawable/bg_prefs_color.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_search.xml b/app/src/main/res/drawable/bg_search.xml index 99a813c..51781a0 100644 --- a/app/src/main/res/drawable/bg_search.xml +++ b/app/src/main/res/drawable/bg_search.xml @@ -1,7 +1,6 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_searchview.xml b/app/src/main/res/drawable/bg_searchview.xml new file mode 100644 index 0000000..beee4af --- /dev/null +++ b/app/src/main/res/drawable/bg_searchview.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_shadow_bottom.png b/app/src/main/res/drawable/bg_shadow_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0124b670691689ed19d44fb1498230f91cbf68 GIT binary patch literal 3127 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 - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/common_label_bg.xml b/app/src/main/res/drawable/common_label_bg.xml index e0ebcee..b3426f6 100644 --- a/app/src/main/res/drawable/common_label_bg.xml +++ b/app/src/main/res/drawable/common_label_bg.xml @@ -1,8 +1,8 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/fastscroll_bubble.xml b/app/src/main/res/drawable/fastscroll_bubble.xml new file mode 100644 index 0000000..f72b616 --- /dev/null +++ b/app/src/main/res/drawable/fastscroll_bubble.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/fastscroll_handle.xml b/app/src/main/res/drawable/fastscroll_handle.xml new file mode 100644 index 0000000..8671a01 --- /dev/null +++ b/app/src/main/res/drawable/fastscroll_handle.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/fastscroll_track.xml b/app/src/main/res/drawable/fastscroll_track.xml new file mode 100644 index 0000000..8547687 --- /dev/null +++ b/app/src/main/res/drawable/fastscroll_track.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml new file mode 100644 index 0000000..c7542ba --- /dev/null +++ b/app/src/main/res/drawable/ic_add.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrange.xml b/app/src/main/res/drawable/ic_arrange.xml new file mode 100644 index 0000000..ce2d501 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrange.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_back.xml b/app/src/main/res/drawable/ic_arrow_back.xml new file mode 100644 index 0000000..2d68f79 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_drop_down.xml b/app/src/main/res/drawable/ic_arrow_drop_down.xml new file mode 100644 index 0000000..df5ff10 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_drop_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_drop_up.xml b/app/src/main/res/drawable/ic_arrow_drop_up.xml new file mode 100644 index 0000000..ed31816 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_drop_up.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_author.xml b/app/src/main/res/drawable/ic_author.xml new file mode 100644 index 0000000..00d53f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_author.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_auto_page.xml b/app/src/main/res/drawable/ic_auto_page.xml new file mode 100644 index 0000000..bec2a48 --- /dev/null +++ b/app/src/main/res/drawable/ic_auto_page.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_auto_page_stop.xml b/app/src/main/res/drawable/ic_auto_page_stop.xml new file mode 100644 index 0000000..6a6c745 --- /dev/null +++ b/app/src/main/res/drawable/ic_auto_page_stop.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_book_last.xml b/app/src/main/res/drawable/ic_book_last.xml new file mode 100644 index 0000000..82b0842 --- /dev/null +++ b/app/src/main/res/drawable/ic_book_last.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bookmark.xml b/app/src/main/res/drawable/ic_bookmark.xml new file mode 100644 index 0000000..551bee2 --- /dev/null +++ b/app/src/main/res/drawable/ic_bookmark.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_books.xml b/app/src/main/res/drawable/ic_bottom_books.xml new file mode 100644 index 0000000..807aaaf --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_books.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_books_e.png b/app/src/main/res/drawable/ic_bottom_books_e.png new file mode 100644 index 0000000000000000000000000000000000000000..ced4b464ded8a8cc08a27be6994878b1e9b4fb46 GIT binary patch literal 1218 zcmV;z1U>tSP)b2}?{uQ9-ou3sa=BO++p%X_F8x z#FcIY!P;c%%0(dt8JGrA#__&aUa$APGiPT0_r3LhW_{+&`##UiJZI+K_nZl+wTi%m zR!7(1h=7(Sfd~)*EhEtK@LB;Ppk)MF9$qUz1PnxADzF}S1$fSh)t|rx;1l4Yv+vN% zM|lOj27Cuh%0%NYU^(z@rk^qCKB@#f1^fg|FZ9;G1G9i@h5QwBGpYnE1Wp%w%Z{TJ zz|q1!v)zp<0qcOn*>CrtgO7mCg?(nb8&v{Kct6g5y9XWY1vVA-ne9#lWJ8$eKm_FB zm)%A1(fZ*?2E?(B2l+$+LcfgP!XHT3%mSlJ>0hQT|)MqpavyZusKo$Tqeoep#<0>D<_ zyNST}cKZ@|!{ckb6Yvu7BNY96&a1%LSQ5rN0b`+QTYwKmz{3diyA8D~>JMVUinKcd ztckRBFTMYp2#Wxq%_v9&h=AD5s$-`uD2$ghpaCO^@CcrSr2*1_@Saw;kOqYDk_Jcv z!n34qp>u!(FKt0#u(Snf3kuH?Z9x?RSRx#rB@$tY@I3@1 z!V+QMb|DcC<0TQ62#05hL|7s$5$>)6T}L~142f_UEQzp0I6O-v!V+PLutYfF!vu+N zczcxyON7I-L?SE^mIzCPCBpha##Vvuf*hKuFf)iX62H~@ z43z-O$)8f4;;xf`nTZ74bP_Nlk$^w`YXn%DN?QrB8Xy8HuzIf|Qdhto;4u;4&y`k+ z0MmdcL_m84+yb5y0r>cH)5REY-}al&d_Z` zje?xd+Sgpa2RKmF?*U=3v;rD1iaCgd;SF1iDFK$0bZ7V(To(P({aP;PLoP32parVYJ1t&iuJY#I2qYL)@&8>-y`v*ytPPi&&zw57ccd;?fGnbZCOEJyU`4Nl$!Y~Su)jpU4FDe$elOLR*i zz?{zm-mi-IJR3b)$Iwo}ma+UZ;QK&dn@yJ6*;a|Ss%p2Kt)-_w6BuU!@Lu&kDFqy? zD3O(3Jmti~tpQ&DvJW7Tx&j1jAp}G~As|!Th=5e&3iT5Kg@8!0n$?KaKdeGSO5S307*qoM6N<$g3AsoCIA2c literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_bottom_books_s.png b/app/src/main/res/drawable/ic_bottom_books_s.png new file mode 100644 index 0000000000000000000000000000000000000000..6b182e6c85551eab72e05f14695c28743969c8e7 GIT binary patch literal 1516 zcmV7W^L_W; z^Ua;iT#)?4$^c@`F3Cv*hMfV++HHS zi-8UkuE2B!3a1hYbqpte`N5>^Mq-_p-la4TR*=kEn;>6U2dhIGw zgxA>~$lS5nrN0jo(=HR@S7QNuW?9zLYuy})0P8SY$v7VqbAK4}m#rbbwdmgakk40F z#uEYRu*>~jce>T;cTteP7()S%TKUq12%y1gCFATS=3^RAZ3qaXcA@k_GYC+tYcyMF z*Y5mPpqfSg%x`9GmeEE<*v&e_?DMOQCR?)|=%Zx*{7_s1Ff-i#u06#5eqwSOxi$d5 z5@XE5J#VdEPJ`mLyZ~<28D*dM1req9cZ??sr6=^T^Qe{j45c2h zbH#6TMQCXOu1if*IArHaZ-@Y^7{D64p>8HM!b}Hr$;=`~NH*i@ z4IWv7f~VCYLTqR-SF!}j5)?d2u0hBWq)(VELBU+f5+qAd@FMR=Y8c_=S$%FBz|+Er6*XfRb` zLtDv)+Mph~@n*Bb5!x;(_d>aBQiN?=?W8T+ehMCcD-e}G+TF|E^x|)HUeK@;=%%gP zi$;0MS32C8%fBzS+0Yqa+qG}Gr&!!Tqd$afROhAjSJwEnYc{^ zh)aNsGsDa`hyWo40O%+Y8u@7HE6i-`3IK&8#I)oz^jr#(%>K(JMHqy42=td;`~?(K z8xs%5QiP2usgxZ(P7msQn7d(hAl8AWl*6m)o z@-s6V9jsZm{(`EOvimS`ZgM52c6;wt%4e8qn?d*LLIKQLWbatL%`kshX!%Db+7wY9 z*Rm2lCfhSc4`gbc^wOyT28}aQB5bEY7`6+gHJ3E6-+6?6$}w{?Odf!ICbc`6FMhCA z950=Eib2PhwnjoE17W{iC>=HlVJtu`c%|RD8&!IdLA@Z_Vv?|Sh!23%fO_A`O?|#z zTYl`89@q5_5V#Knqf=G6cAPEoDS{fc^Tn^%%j0G{? + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_mail_e.png b/app/src/main/res/drawable/ic_bottom_mail_e.png new file mode 100644 index 0000000000000000000000000000000000000000..86fc01bef9f88dff77a2341ad097c403386d3d7c GIT binary patch literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VA1k)aSW-5dpppn*!{-W=_?~;gFs@RU>jjP20&H&7|a1$1^I+B7S(B>T7k;*$^V;6{)ePMd?`6 zO`c`1-`X6#{d?c{o$rfn&p)la|NrK^*T3SQ|EYhz>-=TQ@5S@wwzOJZ5RQsHD%kL# z+kt^a;YQO)?!#EHabt`N!>PT+Cq)>DUhiA$UNi{XKFZkVeIU!EC@rA6WiT0v*4VE5r(p)pbT;4xj*cr)s*CeN1;dl4HXH18Gd2hTLX(pPbTQFyF zl~}~ILYam3&c=PkC)&6i45AoOQw@$pwY%(q+=GA*oTbr~(Z|0ey;|^k-K-rPJLU>q z{+BPa;c6Ru^uz7uJM&(B*cSGy&?MsQ33^}4j!f~PQ6%xm9d=ZUK-El4G zo2Bf9PbGQ=@;_FdRnuQ{ZT63YE6>e+we?ZD`rds;X8%u23#^;8IG#zteShW~odb0Y zYna_cJ8p(nFj@qzeH*WE@!pj8vJS7`qTPAwToc$cb|0PYz-^;lh zrnzs+yTF$qZm_byFn*PO_>FeCb&PMNvSKPrr5moD>}N9zGq?U-m>^%aLHpmt)z-2C zufrI0v)vfJeQZ;^KjUS?S?1|4$`}?ts}vDu;1`$9;Ba96Y!k$K;P6p4DW(etZ2ChO zKNM_iY-2DnIIkSaU=x$GK#_s>%x4c#?8>kFXI%K{bK&jNtG1b;^O8+oJCnBwW7;X#cHVX()XY-r zMND2(C+&I8Q({GuC|oqu8HUcg+qpmb@1A?^kMHOE|M&SkU!E7qLr2p@6951mf+ya4 zqv`)d1Gd4@l4M5!fUXemhkR0kr^<*?rr}1ooXyH^fM4OYK*0InB z!rYv|@U%$)A`)=w9w%`?FOu7UD;2JseX&jH(LLN9`g_lEeU90tQ>k%E32uBMmMLD; zEn8TijZMwG6u%*>qZB(A-9MZK59sTh&;O#2izT=AFXW}iF)XHd*thlGe`t*8sHF?# zME|7Gah~Ythvt+y?~FQ@qa-60x0fS&(2|Xy5q2pmN%)tUM)Trk@-6aOflqNh<59Jt z`Vll-BdCZe%s!|)%u#(-tP&dZK)Seh>){MkDcSNJ*95UlgvQM(9gNrX5#@vo3ab^{brcHoLSbr3vh>dQvO3d@v5zOn>z&9N>rM~M zxHq|_?V{*5lP~>^*QmYWq#n&S8W{lZJ=x}M+s^IBYMj%m3*@_8Y`lV=GKAh4&O|Ml zS(2J+HT*5&&tI8%D1GmqUz?VwcSgS}v&D)M^VoCVn7@SDGjSLqI`Q`Z`4n6a!OLyT z|Jsa1K(%QwN51=U=#cANWS#7k3nuJ-xm)sSY&g(l9SbnrWqxfNSWw@d5mD_M_1>Ei z*wNGY>IdhKo0qdjsgtd1lNhtz(?<HOlv z>!8=IXy88`A3i7rtT7_SOcUgo^QM-{^kdlYnbe*cvhR0!&Y!|)#Hzw+t9Ud?_H+-L z-$i))gguh{a36vrUK}avL86-i+GjVV2y<4cZz4x+sOjMPObtI&fG6vXsG@V>1Lc#= z8R*Zq75d521W^@pIM`}B4;TEpouAc$lpfF%YMCRJVQq(4+@Md@eM*j<6D_af$AQxQ zD|f-02wE(5)nUlw;t0vYe7nErJ&e>z(^UqEeg0)|wqgDnMO6;F-;=~1%MIa%aLD@o zTg-E0T)OPZ!9~dl!3wrDxTaz|P{m16j5ozyUoe#-J%f_t8ERWBFR2f=4qlm}b$p6C za@Jl#X*A$ybzSc%0+mpdl^T;HP$p*WEfp-kN^;BXizWazsH4BK1-QVVE>+1HrZj#9 ztAm=B2ZRg)*3^B#zkbKpU1PtY1BLotO%FDE!IVgccGo;TUZuSF`%5?*qcp7}Q> CpI=7+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_bottom_person.xml b/app/src/main/res/drawable/ic_bottom_person.xml new file mode 100644 index 0000000..5005399 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_person.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bottom_person_e.png b/app/src/main/res/drawable/ic_bottom_person_e.png new file mode 100644 index 0000000000000000000000000000000000000000..f4895c03e78044bd64f6c24c22dae01f2802de76 GIT binary patch literal 1617 zcmV-X2Cn&uP)e$Xi z-Pc0EvcLntZWE0~ZPS)n$1RM$6lGP)7X9ocH*wylAcoMKY@ByIrzo&c!Y~b}h@FYO1kyAa9 zAF_QuaDm5Iya-quco$gI!|4$=wHnea&}=9wUIbhToL1D+@y4|CzHofAye+&4crQG0 zdA&*N?UfMdOY6m`?Lok1z#GPKmTIn7<0qwz$&LpBT6bSk(n*6Y#fr2qDJC8S+zret z=Aq4y_9RE!RMJ{|5b!jxOWLqI(|#1#tFzumbnHRE`@s4ooix~b71+|yKDns}0m|Pl zo;>nyI?z5q$)IB5L4fkNbBlRsGxQm-rcEWSwFd!j0h^=^yEAPi^tbP<_e#D2PXN1@ zbkbl;Nqpr9iiyVzxE(m8n1?n)*8|7fRMJ{|5TKl|suXIJgMm9s4$Ol96;5!LpdkR$+a`|Mq6lRAz|tWdsVQHB zd)d2vV9Z+84UI*L%ne?6kgMnNPoKhGFCE%5aca>TQ&SQE7nFc_#p0XGASjU9PhgP(vyf&1gs^J~>cfIQq5xCz)Iv%A`T z9|LIBQ;pO}fWXnX4hpY{brR814U#G`?n~^a6ZKjN7&xoaMO7~=M!%;am8nw0$HS{e ztDN6EK`%q6wG%MxqVmWhVfdJ;BCGnS>Uiql_adOcTJf+#3?I`(K#YIY>ofwKDQW~X z0-O=2ZU?7l6mAv~+85|_jv}Bh0dE4z2fIjV0(2m6hj8=BPQW%59MaQ_ zc@20Dcm{YjENP1n(lr4(38`vh#oPt>rWIC0i~{CgcvX-a(X`0F|03&s$r`i2?5!o2q^u+6OB;|Vh zEc#$8xTlkz$+ICB0oMX2_8IjNzNv;twM0phg8V-Q@mipgV)fQ$&>M$!Hu>^b^rkvGYpW7?a zs@IT7VhB+DT~!7#x~9QRS!3;r6$SXyGVT}yP&WXW9?nKU-Up-+kQYyLZ;b#mWO)@D0eSH>_tpq7LzY*e z5s(*8b8kfm&}KvbAg9Uv2&`t^q{b{mWmcD)7QNbQ3fL|d3lbIwmcCbK3J4G;cUi|7 zI|F1#;b>h!zoOM>&)Vx>W9cGtg`>@qLV%1(Uw446V7A;31yy0|pHM{C2c;6w4;UT2 zXaqQdKX`>W4`FtjZ!^G||3*L~z!?E&^KAw+0-OC6*Z9$4@ZJ+~ P00000NkvXXu0mjfQ2pKk literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_bottom_person_s.png b/app/src/main/res/drawable/ic_bottom_person_s.png new file mode 100644 index 0000000000000000000000000000000000000000..003fa0011ef46828cccc18ac00657ac813c7d477 GIT binary patch literal 2167 zcmV--2#EKIP)ZQ1p01RIQC4druVFwJ$mn)zIVAuh}^5qIB z0T_0`uza}!N&wj%;B6nDDpPD?(~c9_tC-Ck7b}26Ln_?!vjr0IivrFgr5`{)$%|wA zAUI0MA&>_}VLMgjd3$(dI{=!scWm`S1E4$m$^e~jAc}6L$VbK==f4pU90KIIil|57 zjgF+r%`>);0O$_R?69+r!n-J9bz=yCwg?}$tP38(@L%8VrdBU<3kRU>I;$akl$5DD z2L|wW0QXw;=2JTBc3Z130627`)!DUwVAR$UIEK2&)=%EW|~^Y0MM;o z8WQ^{yd+J-x?=$xw&bEYrd|(>0SH`Y1Ie%JHZ)5;hz!|{)_1eycAH}a09VYO6}H2@ z6i(`P03G>&9J4HY4u(e#>!_Eeh7kZk&3TLw?@!ZcuVVpOXM3#&d#&@o^^E{%yUso# z=j1)?7=*{Mz2Th_viR%SjrqBQEz9&~}|YLeACEyzUwRw%eZnY29_tRWEk{!IJ84 zDf0O|hfJyk;5pm#7blI^5tloFwp-mIl-qPPue*j)__0;@zpA@#p;kb<=G-k2AJ22h zq*_YkR;$taMbda3ak;MmE_3?BkS)ghsS5N1k$;|8aajDbw>F_^f&m z-=1oH3{M_7nRh=%RzN&t+pVqpD|A<%|J{ug0J@@L3^$N3t*PrT_02z!O%bvJhKGUpJv|>_zy@VZ)kpM-=g=c^d!` zLex^L(e(1xK2y)=3OL;C#)YbB{)2mq%W4Qm6plKctD$w`_|8w1F3sLD!f>*%v-b9)tEC;+G4o-TDh zB@s6X3Zau7-#1o4N;RJ>&3wn7#j;|4&M;l@Kw3BWL=51(>h%z8EZUZnq-Kv92YCZfYwUXSl`&%z z251A&b_eeJ*JEaAC)6I7VetkofvmOa{$n~;gBAc`ZQw^y6x}l}9nILZ5G5|3cO|G6Ud> zfoWmDT_pRnicf?*0B>2sYv8rs%`#7B071=J&xqg2B0AA>Ab8kr_?i9O}8Miv&> z@VrhM+4KOG&z=zk!CPrW&X-u*wr8e&>Q;IH@dLFP{N;QxHO-th?5p67>`jxC9>DU! ztAZf>a~hHJCDyjBxfni>>f$T`XuLW~02;_PW+_zy$l{vDoDzUW zGqaS+2Y@>`Gho=WZ5mkyFG`LL>!a`vr23GW`fX@DY}>6ig_7%|y^3P;2lkQIy`Z>( z(5p zvG_2Z)SN4ViuK_v;^RHX?u741-QVBM{-CY^jCTWz(0>WQFohC83Ba%ehULo@Py#UQ tfMNM^1(W~`J78G8TmdBj!wwjh|0kEd)qg;oq;miO002ovPDHLkV1iYl4c`C& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_brightness.xml b/app/src/main/res/drawable/ic_brightness.xml new file mode 100644 index 0000000..ac37ba7 --- /dev/null +++ b/app/src/main/res/drawable/ic_brightness.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 0000000..620bc91 --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_clear_all.xml b/app/src/main/res/drawable/ic_clear_all.xml new file mode 100644 index 0000000..dfa860c --- /dev/null +++ b/app/src/main/res/drawable/ic_clear_all.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_copy.xml b/app/src/main/res/drawable/ic_copy.xml new file mode 100644 index 0000000..cdf136c --- /dev/null +++ b/app/src/main/res/drawable/ic_copy.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_cursor_left.xml b/app/src/main/res/drawable/ic_cursor_left.xml new file mode 100644 index 0000000..1656763 --- /dev/null +++ b/app/src/main/res/drawable/ic_cursor_left.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_cursor_right.xml b/app/src/main/res/drawable/ic_cursor_right.xml new file mode 100644 index 0000000..99734ea --- /dev/null +++ b/app/src/main/res/drawable/ic_cursor_right.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_daytime.xml b/app/src/main/res/drawable/ic_daytime.xml new file mode 100644 index 0000000..60921c1 --- /dev/null +++ b/app/src/main/res/drawable/ic_daytime.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_divider.xml b/app/src/main/res/drawable/ic_divider.xml new file mode 100644 index 0000000..21a88f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_divider.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_download.xml b/app/src/main/res/drawable/ic_download.xml new file mode 100644 index 0000000..bf296ec --- /dev/null +++ b/app/src/main/res/drawable/ic_download.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_download_line.xml b/app/src/main/res/drawable/ic_download_line.xml new file mode 100644 index 0000000..25dbe36 --- /dev/null +++ b/app/src/main/res/drawable/ic_download_line.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_google.xml b/app/src/main/res/drawable/ic_google.xml new file mode 100644 index 0000000..da0354a --- /dev/null +++ b/app/src/main/res/drawable/ic_google.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml new file mode 100644 index 0000000..095e0f7 --- /dev/null +++ b/app/src/main/res/drawable/ic_history.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_interface_setting.xml b/app/src/main/res/drawable/ic_interface_setting.xml new file mode 100644 index 0000000..139b007 --- /dev/null +++ b/app/src/main/res/drawable/ic_interface_setting.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 0d025f9..07d5da9 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -5,7 +5,7 @@ android:viewportWidth="108" android:viewportHeight="108"> + + diff --git a/app/src/main/res/drawable/ic_more.xml b/app/src/main/res/drawable/ic_more.xml new file mode 100644 index 0000000..091114e --- /dev/null +++ b/app/src/main/res/drawable/ic_more.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_more_vert.xml b/app/src/main/res/drawable/ic_more_vert.xml new file mode 100644 index 0000000..7b7f195 --- /dev/null +++ b/app/src/main/res/drawable/ic_more_vert.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_outline_cloud_24.xml b/app/src/main/res/drawable/ic_outline_cloud_24.xml new file mode 100644 index 0000000..c8b092e --- /dev/null +++ b/app/src/main/res/drawable/ic_outline_cloud_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause_24dp.xml b/app/src/main/res/drawable/ic_pause_24dp.xml new file mode 100644 index 0000000..193030b --- /dev/null +++ b/app/src/main/res/drawable/ic_pause_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_play_24dp.xml b/app/src/main/res/drawable/ic_play_24dp.xml new file mode 100644 index 0000000..4250d72 --- /dev/null +++ b/app/src/main/res/drawable/ic_play_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_rank_type.xml b/app/src/main/res/drawable/ic_rank_type.xml new file mode 100644 index 0000000..1b83c4b --- /dev/null +++ b/app/src/main/res/drawable/ic_rank_type.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_read_aloud.xml b/app/src/main/res/drawable/ic_read_aloud.xml new file mode 100644 index 0000000..7978d21 --- /dev/null +++ b/app/src/main/res/drawable/ic_read_aloud.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_refresh_black_24dp.xml b/app/src/main/res/drawable/ic_refresh_black_24dp.xml new file mode 100644 index 0000000..fc7f629 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh_black_24dp.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_refresh_white_24dp.xml b/app/src/main/res/drawable/ic_refresh_white_24dp.xml new file mode 100644 index 0000000..9e4f8df --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..921e00d --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,17 @@ + + + + diff --git a/app/src/main/res/drawable/ic_search_hint.xml b/app/src/main/res/drawable/ic_search_hint.xml new file mode 100644 index 0000000..42de64c --- /dev/null +++ b/app/src/main/res/drawable/ic_search_hint.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..1d42977 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_skip_next.xml b/app/src/main/res/drawable/ic_skip_next.xml new file mode 100644 index 0000000..eae4da1 --- /dev/null +++ b/app/src/main/res/drawable/ic_skip_next.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_skip_previous.xml b/app/src/main/res/drawable/ic_skip_previous.xml new file mode 100644 index 0000000..abb9944 --- /dev/null +++ b/app/src/main/res/drawable/ic_skip_previous.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_stop_black_24dp.xml b/app/src/main/res/drawable/ic_stop_black_24dp.xml new file mode 100644 index 0000000..025a8b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_stop_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_time_add_24dp.xml b/app/src/main/res/drawable/ic_time_add_24dp.xml new file mode 100644 index 0000000..66afd8f --- /dev/null +++ b/app/src/main/res/drawable/ic_time_add_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_toc.xml b/app/src/main/res/drawable/ic_toc.xml new file mode 100644 index 0000000..c64161d --- /dev/null +++ b/app/src/main/res/drawable/ic_toc.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_tools_feedback.xml b/app/src/main/res/drawable/ic_tools_feedback.xml new file mode 100644 index 0000000..f2545f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_tools_feedback.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_tools_good.xml b/app/src/main/res/drawable/ic_tools_good.xml new file mode 100644 index 0000000..bb3c418 --- /dev/null +++ b/app/src/main/res/drawable/ic_tools_good.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_tools_history.xml b/app/src/main/res/drawable/ic_tools_history.xml new file mode 100644 index 0000000..bcc5935 --- /dev/null +++ b/app/src/main/res/drawable/ic_tools_history.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_tools_order.xml b/app/src/main/res/drawable/ic_tools_order.xml new file mode 100644 index 0000000..aa6d427 --- /dev/null +++ b/app/src/main/res/drawable/ic_tools_order.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_tools_setting.xml b/app/src/main/res/drawable/ic_tools_setting.xml new file mode 100644 index 0000000..d9b6a11 --- /dev/null +++ b/app/src/main/res/drawable/ic_tools_setting.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_tools_theme.xml b/app/src/main/res/drawable/ic_tools_theme.xml new file mode 100644 index 0000000..da8789b --- /dev/null +++ b/app/src/main/res/drawable/ic_tools_theme.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_tune.xml b/app/src/main/res/drawable/ic_tune.xml new file mode 100644 index 0000000..cdc9858 --- /dev/null +++ b/app/src/main/res/drawable/ic_tune.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2490a57 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_view_quilt.xml b/app/src/main/res/drawable/ic_view_quilt.xml new file mode 100644 index 0000000..a0fb3d3 --- /dev/null +++ b/app/src/main/res/drawable/ic_view_quilt.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_vip.xml b/app/src/main/res/drawable/ic_vip.xml new file mode 100644 index 0000000..6c6597e --- /dev/null +++ b/app/src/main/res/drawable/ic_vip.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_off.xml b/app/src/main/res/drawable/ic_visibility_off.xml new file mode 100644 index 0000000..c710615 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_volume_up.xml b/app/src/main/res/drawable/ic_volume_up.xml new file mode 100644 index 0000000..5d604f8 --- /dev/null +++ b/app/src/main/res/drawable/ic_volume_up.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/image_cover_default.png b/app/src/main/res/drawable/image_cover_default.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc61afc040a2fbcba717e115a51b6c3318f73a3 GIT binary patch literal 3155 zcmeHK`#0O!77qd|RZ5sE zRA+Q1<27v>MUiFm|O_JBZYx)4p3l^v>}gFw0_I4nR&kCaxvNeq_k&E*lbY&?(B z&FO(t-Z?G#vZ$pyX+w2$dm7V*sM3%-x)weIYUms^j2zbgX9Y}?S9SUg`(cROIc^NkT5Ty=NfR~k8tUs4 z!e@%WOeWJqy12OMxKE!v3=~4uiy^75m6cbnT!|_zE8B`&=n3={dKKUV>q>vH|E-|D zAP$@Tw)@Pd>yE+c54=3hhoqz}2f$QM^YTw`q3<%e(bV!>KbVHa5j3Qc7)~OQj#K&J z%_8yn(b3UdrCpD5!#%lcwqiF!g(j5_KU93f(UHeqxbRTSdp0>4J^kSNF@%1$pd>Hk0y_8MKRlU1cssq_Jd6P(*QvHQ@#vzw}C`p5j5FK^sV zwRyYJ*$KG>2CVbbw>GmLQMV`=N*VFV$)|&}?6ci{Pp%pE4_A9jBqz*P+&(YV{;fG_ zT>ntF(Pdn+bnKzFHQO7GU3iJFGsR@0@Pl%JVpZZIeoru`(Ur-$)mq*~c4?YmxW?&- zh)ShSGWtAQM?U}ZUft^-Brt5feC8>0GUht_6X(P($jaq|Ff5pku=wT7S%}5n{Qojs zZy;nbW48lD#pgu}y=|E6=5Rje@ppPFY;!PN{@esuz%^oun(`8(L<_ifOi{DdDyP*P zLL*3-jx<5>Y*H_p5?I`IyJ2817Xb-+m{dy>#4#{eL!HR>9(Am62o2Ha-tJtj{o_8& z%)|j20+M`yCfM~2*`Ogo7MMZy^0@X14dL^GQez6h?rP5uKvN9;>V5X)1lz!8E3TW< zPnB3h4BuD`xfmaVu@8j6!tpNo-!j9%TU1lk!X*Y;>~{z!VuJO6_3m}R2&5V!p_!i4sb0XVka0Kf)x@L^b+R8ue;>ND0oAH}0YL~=7N z_bcBUu})P)he$m+wmquv@6optUUB8ICG&4zcTe{gTZI_Qp~&svKjYZ+JW7%D2|4F@ zJ*&uD2ncO}iy$@Lr+)u6D`b4^X9gI6O$~uvGFGN$&HT9+6)QuJYa2z<(*82Lve(@= zPY$4Opj71SN~_=4F?VpZW290GYFZ*0tP10f-u;RkM4j$q)Y|>?*KMGfKPc)50jPV{@(Z!LN3voJ%#YrcXG!O_XKmc9Ocv(p zo~$^EZVmZt)1R>}qogm4HiTC%>6<1&euv*Z&vNw#YG3u3>m?;7Qb@axZHNCtrL?f` zzrwS-tl?Pjo&;T>%L}?`FvwsqwiYbDxOgr2rZA#WmASc9lCtzos3ncw_M#&tRY`x8 z)jq{*9YH;QI)^UqbhnD-3C^_(BOH{8c21P+f_A7NV!x=!KB3q>tTemhDAKzyze#HN zN|2|IOxlNWPcj6oWh5mdPF6Saqi=MwfEUn6P5PZrd{rY?a}z&EA(8LLLKQO^9GzsP zWi{!<*W=(`K0GH2q;9WLdLBz+$cQz53=<5_- zRC(-@#}RvrlpuAYXgi;B-<=p~e9GtZt2@rzci5zoxshxSpIfPRI1|y7KqxfcFisLD zruBmrXFoOiP+p?LHeWuWE>4sW#%5)4qkM%X`gxdB07%_zXR7Nz+)8Y2*g82mJ5$HR z;td^~0E1W#EckaREo?JsM&kZcnaiSDcIc@O?-XccutqYz^i{MGMdP8Np~u7Kx6}n7 W^+=AOW?I!OfN-DVvA=qqq5TCLLIIHg literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/image_loader_loading.xml b/app/src/main/res/drawable/image_loader_loading.xml new file mode 100644 index 0000000..080c38e --- /dev/null +++ b/app/src/main/res/drawable/image_loader_loading.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/line.xml b/app/src/main/res/drawable/line.xml deleted file mode 100644 index e3f2eaa..0000000 --- a/app/src/main/res/drawable/line.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/line_drawable.xml b/app/src/main/res/drawable/line_drawable.xml deleted file mode 100644 index 4f79f47..0000000 --- a/app/src/main/res/drawable/line_drawable.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/loading_anim.xml b/app/src/main/res/drawable/loading_anim.xml new file mode 100644 index 0000000..eedecda --- /dev/null +++ b/app/src/main/res/drawable/loading_anim.xml @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/seekbar_bg.xml b/app/src/main/res/drawable/seekbar_bg.xml deleted file mode 100644 index 804b450..0000000 --- a/app/src/main/res/drawable/seekbar_bg.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/seekbar_thumb.xml b/app/src/main/res/drawable/seekbar_thumb.xml deleted file mode 100644 index 4a2ce8d..0000000 --- a/app/src/main/res/drawable/seekbar_thumb.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/select_book.xml b/app/src/main/res/drawable/select_book.xml deleted file mode 100644 index 1eab0e0..0000000 --- a/app/src/main/res/drawable/select_book.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/select_book_check.xml b/app/src/main/res/drawable/select_book_check.xml deleted file mode 100644 index 35b0743..0000000 --- a/app/src/main/res/drawable/select_book_check.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/select_more.xml b/app/src/main/res/drawable/select_more.xml deleted file mode 100644 index 980222b..0000000 --- a/app/src/main/res/drawable/select_more.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/select_recommend.xml b/app/src/main/res/drawable/select_recommend.xml deleted file mode 100644 index e34d09b..0000000 --- a/app/src/main/res/drawable/select_recommend.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/select_stack.xml b/app/src/main/res/drawable/select_stack.xml deleted file mode 100644 index 572e318..0000000 --- a/app/src/main/res/drawable/select_stack.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_btn_accent_bg.xml b/app/src/main/res/drawable/selector_btn_accent_bg.xml new file mode 100644 index 0000000..d06cfe1 --- /dev/null +++ b/app/src/main/res/drawable/selector_btn_accent_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_category_load.xml b/app/src/main/res/drawable/selector_category_load.xml deleted file mode 100644 index c021f4b..0000000 --- a/app/src/main/res/drawable/selector_category_load.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_category_unload.xml b/app/src/main/res/drawable/selector_category_unload.xml deleted file mode 100644 index d4cc21a..0000000 --- a/app/src/main/res/drawable/selector_category_unload.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_common_bg.xml b/app/src/main/res/drawable/selector_common_bg.xml new file mode 100644 index 0000000..2174a73 --- /dev/null +++ b/app/src/main/res/drawable/selector_common_bg.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_fillet_btn_bg.xml b/app/src/main/res/drawable/selector_fillet_btn_bg.xml new file mode 100644 index 0000000..431a579 --- /dev/null +++ b/app/src/main/res/drawable/selector_fillet_btn_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_tab_color.xml b/app/src/main/res/drawable/selector_tab_color.xml deleted file mode 100644 index bdc5683..0000000 --- a/app/src/main/res/drawable/selector_tab_color.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_card_view.xml b/app/src/main/res/drawable/shape_card_view.xml new file mode 100644 index 0000000..d49a2d5 --- /dev/null +++ b/app/src/main/res/drawable/shape_card_view.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_fillet_btn.xml b/app/src/main/res/drawable/shape_fillet_btn.xml new file mode 100644 index 0000000..83ccf27 --- /dev/null +++ b/app/src/main/res/drawable/shape_fillet_btn.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_fillet_btn_press.xml b/app/src/main/res/drawable/shape_fillet_btn_press.xml new file mode 100644 index 0000000..b0c46f6 --- /dev/null +++ b/app/src/main/res/drawable/shape_fillet_btn_press.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_text_cursor.xml b/app/src/main/res/drawable/shape_text_cursor.xml new file mode 100644 index 0000000..71871e0 --- /dev/null +++ b/app/src/main/res/drawable/shape_text_cursor.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/text_color.xml b/app/src/main/res/drawable/text_color.xml deleted file mode 100644 index 38b4f6e..0000000 --- a/app/src/main/res/drawable/text_color.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/text_font_color.xml b/app/src/main/res/drawable/text_font_color.xml deleted file mode 100644 index b370650..0000000 --- a/app/src/main/res/drawable/text_font_color.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/thumb.xml b/app/src/main/res/drawable/thumb.xml deleted file mode 100644 index a94705b..0000000 --- a/app/src/main/res/drawable/thumb.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/thumb_drawable.xml b/app/src/main/res/drawable/thumb_drawable.xml deleted file mode 100644 index ebc1534..0000000 --- a/app/src/main/res/drawable/thumb_drawable.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..2fb3504 --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_arrange_book.xml b/app/src/main/res/layout/activity_arrange_book.xml new file mode 100644 index 0000000..38f6a84 --- /dev/null +++ b/app/src/main/res/layout/activity_arrange_book.xml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_book_detail.xml b/app/src/main/res/layout/activity_book_detail.xml deleted file mode 100644 index 71229d3..0000000 --- a/app/src/main/res/layout/activity_book_detail.xml +++ /dev/null @@ -1,287 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_book_info.xml b/app/src/main/res/layout/activity_book_info.xml new file mode 100644 index 0000000..43d80d0 --- /dev/null +++ b/app/src/main/res/layout/activity_book_info.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_book_type_list.xml b/app/src/main/res/layout/activity_book_type_list.xml deleted file mode 100644 index fe781bf..0000000 --- a/app/src/main/res/layout/activity_book_type_list.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_channel.xml b/app/src/main/res/layout/activity_channel.xml new file mode 100644 index 0000000..32293ce --- /dev/null +++ b/app/src/main/res/layout/activity_channel.xml @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_channel_info.xml b/app/src/main/res/layout/activity_channel_info.xml new file mode 100644 index 0000000..9e2bd70 --- /dev/null +++ b/app/src/main/res/layout/activity_channel_info.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_chapter_list.xml b/app/src/main/res/layout/activity_chapter_list.xml new file mode 100644 index 0000000..2ee2f3d --- /dev/null +++ b/app/src/main/res/layout/activity_chapter_list.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_daily.xml b/app/src/main/res/layout/activity_daily.xml new file mode 100644 index 0000000..462a4cc --- /dev/null +++ b/app/src/main/res/layout/activity_daily.xml @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_end.xml b/app/src/main/res/layout/activity_end.xml new file mode 100644 index 0000000..2237bd2 --- /dev/null +++ b/app/src/main/res/layout/activity_end.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_feed_back.xml b/app/src/main/res/layout/activity_feed_back.xml new file mode 100644 index 0000000..dab8dba --- /dev/null +++ b/app/src/main/res/layout/activity_feed_back.xml @@ -0,0 +1,50 @@ + + + + + + + + + +

    XT5k>Ng*E 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⩔qsuVJ~k(#e1i}^ogmxQ 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ⅇ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�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

  • yc`bNeO4u8HUN#!s;p#P6D<8LO!xVavn;`RTw16jC!mYy(+blvwu6&$TAS zzJ90HmEZeaB~Q98j=VckmM%qd=AOdzHYM)H6pt`ni$O1x@|Y*HG#&5tj|XctG{WQD zV#LN|zW8c}{Fn%^ z6AEsE8Zx0TGQ+g|vekmmF_8ZILU?#gU#5fqFFULHYr#oj(JccGRW!O33G-Q8ZbWWm zx(R`FMf{RWBMB%(`Ql%m%-dByq5tAwqj|CA)$8)@;G|V!skt~L!F`-Uo7DDswvMz0 z;T9VQ`sGXf-Sv?q%SkPEX|mY)&K&wP1OdGzD^_=^L`rwsr}DWe#xYC_Iz<7 zAI&*fyH#*GcV2HXGj%5Dd>5Y#vw)Ab_`oYM0GEOM{(eD=;#1%KEj{FTWm@DZu8jn| z1K3@bE=w)!gsP!7cDx=s<(lYDF*ljrl!y@3OTN=u7eR{5r!+7lFvxeSJp)YJs|`%A zfNBW9^NqQ^>Q{HyD1A#_2m(WOTxr9X*XDfQ`NDvEN?IDFJ^)po0H28wfq3lvU_(Ah z4+qZfQ0M2ztRPZ;WZ-D4rcm->l3 zahBR3%c7Lr+knCLjw$>)eo&62Zx@BKgXRkmGXu-S!#Y%`{L~F1O;on71IE_p5BqZ0Ds>E!e5k< za*l`wwN3ODhj+xsBFsvF4nfi#+X3hrU-_T1yl!)V!4D;>kZmw#3D^vgM_4t&h(&rXxsYc4^BnE6_j~*W@T*yXa;s^5QbK|0 znRd$6f9I>8+k)2-&%h^aAny)xr{-T4KDzq0sKPw%BK3ZvgiQ?OH#(!5z$UZHr>8SC zX58PWoSD(~`+oG(DhIm^nhzy2t#DS&?^~!)EOKq>sgD=g=(Yx58uirpO zpK@!V_s7Iof|JGgaO*E9BDh64hzC1~e-8WBRQa|IBz0=;ppc#eT!VeGb9H_T!Oxx| zTACVL$=PmxzAY*6+5vyp;wH7WXKfT8ek6277X1|6n>W+ZlRx4`62i|0JJo?wwg(@f zF`L5a0IU0e9e6>)rf-i&VUT)16kH`{r9d_=diieR8Iz{EbFn~SaOO@0gQMG@wVG#) zxRFb*e`V>&?|J1dwG~B&Tn%T}F#6)V-5x4Lz40a{y!sD%daiq=DQi{E9sY!~p+hu{ zP+FRZ#p$Y}hA+6D3z@lIVrpnL!^(-o>Nh{59E_C)UNAw;Y)K?6$)z3kviH>>8dovl z{?k3DPhZYgi}baR6G5Oz#VuD2N!Vj1n_OBp39exH*-<-73YPM_hzXPPR4_PiHd%z1 zk41KsMpuHKYnQWTz%lSJ4s&gaEf1~zsP!duEnt5Ck^KTh@s#3;D@?DeJTtj0NlR_J zr8c;Y2Aj6$>H&A=jegf*Q1rFUPa+8}4fmSXsoku2{bh{Tj%R#p6r}QKA8Tu7Ep~+m zEIR|Kwg zpz!(8Nq1f(v#8HtO2^xl=1JA!_BvAw=U0Nb%yhq&9zN9t`1sDhsj7&7&S3vHcIxvZ zkfhB^!(-C`?okNBHQuAlVApR8ec5NdBuo&_8aUaiGjl9p%tUxO)1c+l&extLK5HGp z*!^7H9D#5A{)1aw~v%cq2te`j8qbDdOrSX&Hhsve91g@8Wk zcVc0X-xW_BDqZ5}TD`IbnlidcHW}f;4Aam|ylrLWE(k$-CeRub^r%vDf7QNCK zZom-_Nf#rP%epG*Ha@houG%}f@vb3q{;;PID@D>5i}{OddExo2g%8CO3}_Qc;k`R{ z!=CcV0S+xJE{ zvhX~G=Y>s$iV_e8DuCtGsj<~7v!Z+K`jyq^7-U|!5(MDz=2mX$jcX)0-s3(jI8pd_ z>i;_$t{xr@y8=pIL}jq^gACyySPJd6)%yn0F|Bcb_TVY!SLZ|$Cs!E;$W?;d_*&U? z%uz}U&luY8*`uPSfahh(>NQqqze&82v6<7wv62C(tofY(#$BLC9$@J+>Id2MF?AIS zM*N(A4c&defMVW8hpCshG69vHeG={LGTe%s(q?-R{#b#oSMuU)>fUlWxd1MVqY8kuN0kFNA zhn`{DAo1gkJOscom!&+|F9h5bd_k^OcHI zCe8tvVa4QbFO?h!xRrZ$4O)N@3D60Rn$v2lPT-4mSqu6EK(ey%?0Wo%HwNEa_@zms zN2SKGLJ0u}N(!JK38621J>Fb7Gm%wTk=t-3X|=WRZvlIec8%4OnMtADpG+R$w%c8= zmR)G@yTtWoiRhd@CrTpwb1e36aF7JM!KBs~Z_e?thIaP#fpj*Q{Gc2f08ZY)>OkcJ zNdD=7W?Z2TiWUH2*9|pill3#@?D-E|w$im8>Nq#hPyPAtG)4;~)7|W*{OsW~cY}mq z?qqw*923w032J7bmGV^@`vU5p9x$~;gkJsi~exT}8 z`3|1lMAB}2Bo1ko_UPNif{J#$nb9-B!ymDCV_~n%S6?t=7%_T%u^=wV3o`h)rnD#1 zm$Lx|haKd6pQm(#0!riA2ux*f#7gHP1l>P!R4%5$H01o?^z|^^Ci#z}8_=~kSaCW# zLXs2JSq^Lw*?<55XyEJR9fBoTeL%Hm>U0`Qe~55NHc;WM!VN{e7b4Ml=@YyfJQSAsNvNZNFlY93NSeDFHO=9WO|- zPc{%G)KGg9kH?xcGvp;R?jRWU-I+nI>J>B0-qdAfKyjY+L=b3=jMji(i8lB=RNkho zIlo-4ahW<&FYMogo^|X9EzUPVKE9blZpwXjN#1mSLh0&@Zwmgx=i8JW(lg=Z(e@cd z`|~Y1vmCRy&Wj~&d;jiJr_{Gg={biErGGi`BNh9zQzPoz1;9nzIk)FQO%2+#r&b(n z1{2c>kV*ZJY|?XZe!=pkaKt|$I* z?<7WcQ!h*X2CQu{Y+_VUj7w~w_i7f#}(tjjPuByDP)i>CyP$61BHUmqFdQnrmE;saHZ)9 zoen^^=!1OooToEhJvgWR0|aG2z3;-$oys3w4dFd3xEs@V8?jT(2R|fcQuxlSpjIv4 zU;C48xq4?(Z`4(V-V?EIw6OqZX&2+?=jIdBZwgob8vxH0>U>(vh!Q7>9!vvYD}Hs! z4Pyc(W=^|N>o0$v;MoGa#K$HM=d5eCyJZWv6hu_x810K^2CoSqI@_*r1C2|3*yi`>9+aL<_T(yX9If?) zehCzt-pHDZOxoBLS)U8e72*m8q;Mbqth?jKv@iVj&hL@Z#UPskr8k<3RK_D~9`nhH za`XR}U;z8&F9>i2)%O9{1%Nxo;FE?^UYA&LQg=Hqs4eJRFya5y#`XmC$PwDhcQS^& z`ZA4Yk8kPu`29xsJYAc(*Tu88nO6{Yk!&|z7L|n58}$L+f1mWfO=puNh-V+73_y&y zB+Vo-$pl{>RcOHXz}!#b8$4iKSqqrGepaw>8@5L?<9HpD#YmjU-9&IedXa9%+0CEk z@kGoJj}$mreh*<_+hvncCchf9N|w8DAHj7es-t%Skk>(>9f+9d;Z%s_F++-_SBP`e ztPijocQXC91X+8zk;1M{Qzh2r;o$8A;=$Me!Hqg-GD}k(X2LmFjCZf~%rODxa z#ygPf&}#hpxOwywy97^@$;F+37B-jwujlQfpAw+flDbnefAnEO{12JBKw|xO%}#C2 zbNU8w9yEYRgxp`cc5>7_$w?0k2m9x{9n+;)U;-~!$7`W+gx(0kJsb6Rd%npP>avH! z-87-LG9L7)^39c5J=GWV>|0fAaBF+5w+k1)l}|=9xw)x%xw)v6JuPb;NZ4cp#5mj) z%k+jDmM#99cGLoQv;~?LH2_pgpX$RagGC#S-@zhi+tR6+vbW#@Tu-|e)R;g<7|1DZ z;Xtt9_tXd_=zu{C9;mPwvQRUeAf!|i7OGng`hH9iR25Cpl!3Xj{T+9P2X*bI!HAE4 zzR`qJYW0A^bApPy4_4ynNfI3GxoC8~W_HUlnO=i?PQB)zIqL@QuV9=DN%B(Hn$Y4z zL5ad@ZlDchJO(@DCnw`NzBQ?n@Dec?0mNhU_*&z7Q?!j-QR}w^M`Hf4VqwtBnV&@7 zEN~3C-)N2$NY$S#YP|z`)4{a15`*!2CQcTHjg=a4fzUOM=Z_YMt1{f^S1YJ z68R;HFCVTrJgywlG=YCPB|JnF*x!!j+9!B(!oDV%0ry$m!;S#Zkd*c~LnSSBU4N1* zRFkJ-XG-r@>9oNWBlLI~dG;J=FD}2`N;MR8J#(p^dYJ`gm)?*UOVr&Z-^chY3JtnYnD#hZHAy0{%!cQdj+#va`2sQXEQi&9?&- zQZ>gk-mLYe&|Lo`1y=7~*Tcd2?S&(Bnie&Fy{M2tB8&;;$6TuG2PwNSe0YNWj|r&7`IPj<+%}+Ev#xJ01eUCZ2I*k zTckl9*J1ss?*BVloKxeF-4fQ|j{!Fl!w=6EeF3pw^H=4|A7{d?>nHBUV{6veo}P0I z9IY#mjYK=@k0<5|A@rL6){kkoR%htuu2^h|DnV3Yk-9IE1W%mNP{hTBgvXqD?z4Z+ zLZr!=fLfULruHZEmjE52U?j8E3rmmWFt(iAUyCEc)OWJ!f9m_q+BOK6CRb4h^IjtF z-vp8Z88CPApq<%eV*94W_2;xzpWVAPTT{4)i$C}a@{1jI_<^Nz130G5+ctF6i^|70 zeiNh0h;JGBgfe!|p;@K^^3@|7%qm2f=IA9LXe*w30+%6^geE~$WUx?C#YZEoFy|6! zy(P>iejIcr4n4zI8F)h3Z-Hu69)x<`{zJJn7b1cqBj0reacPET>0ZAP9_Ns$2m-*! z;y;)3GX5}vr-qrduzq|qM}324EgV{E84bQ;1e~jFo61_#0F}Cs3<0&|Ipu$jdDx_Y zgGlHazJKfI76JrkvZC|+klY^4L*grw%cUc*2s*AYK4s+)1+GqyIFc7Y$XIAiul4%3 zJ51z}-H`pOk1Mm8EHj_GKXmVte%dXUpYFVdgU;`6+`707*$8>!041IM$bbCod*#dq z_J{o6?9ON1_QlS<{xfP<&3fDp%X-qTl9hR(H*O=+Vn-qSM1;WyLm%^~`XBv|0iDEF`vK@R^+)<02qamuPH z)w?cgsEldrYru9hYSP8M;fI3vsgvziv*^FFYsPm@_r4!J)+ib&N}i`%Y9v^j6gHTx zy{Utr$<=GuMQXgiHAH`!`B3zo_VmPBoV)JLC+9Vl_q9c*;9|z7siR4cN zaPH+ea93)V$FQmV%9CV@xTywbske+xddE8AUJ>#6&fhgL>zp0|4wpFLRkFHw5yoO} zE_6}lu*SWN-*ZX2(Bkzy2`oAD zQdwjgR-cKFOB&MoRFUX>bTm(Yy!%`d6S0TYP^zf(o`#7e2)UwGu_*NyGOOR`ERON7 z5`hgeW1&S)M}<;)=+4#O*Sh(1dW~B4U$*QE_!7NCk{6Qmq3u?R$LA~!r( z>Rvp#5kTp5QP^6RfZ$Ye#&5c* z=)MMLT%p$)DRGLjQ>hCtF%|kI;ITBzx8cwVM*a7_*%W(XOrkYfGE!!Xo2DU!7EzjF{LXZZ2 z$;EkLWtnyULEqO0#@#O%Ns%G(heaq?d^HD@{j%5j@&8w6?YugEC zK~yui1*%uHGAuJK=KKlH)B;N8za8~G5Fev3{(U8m?QfS6QTwD|VrQm(X|%m<8FaeY z6#XI~TUoWr0`2`Mn;v$s>0o&-SfnUMbnVP}bZ!Pd!p1Zzc4Sx_XE5o%LZsD*>K#LWP-0!_ru_CCLlp`v$8$ zd|{09#oMjKB!}%LGn6H#af+K77IZFTEN}fuh7x*AiMK4qsu`t|YL+f@!(W=qpZhTV zQs%UJll8c`N#+7 zhy2y=2p9~nu_@LFbP@0gJmeoL95b2JQUL1}2IchCmz zY9o_ZcdeKFJWWlcbo=iyZy({sall6}te&UWT!oB6c#*;rF$000e~GQCnfUE}jtA^! zdR0BRu^53MpWVe(EXnHOMG&0yV3gb%Gkj!lg>Alx*%wmJ4k5qCU?Z!I3M+YBbe_QV z@Qa5>@w&In6LD8zoSG1#KW*H2hf_lUbvGNk5#&Z3$oE%HMn3CF*ZK1LNg6;^tYYoG^Mp)ySD$A$4^??L zt06k?fNcG3uuA|cS0N106}y$~iSbxKCIb;u{Vepy6r0+xejAK~F02*S0dJ~sX+7iC zM#3A(f4uZ2n-66&>FZebcJV|0qRNa6O50CK@1<7s`b-9g-gw^nZ03JSXEc5YF+-*~ z582e!-r3YG8FE%4^3+|0R&0DF40Tlx=HB`&F&6Nz|EE8gyIsSSiji%0VsBwydZ&}a zbT2LFM?fqlO*%jt$fpBDO#y3mcyS@l2TbOgN9Dy1cVa+WavrM2V_P)SBXN}j4?$S~ z*gONhP{L#E#;*Q+v|}qu562Cz23g0Br!Uo>Vusx`1x4RKLv4LKQC+l;tC?}bG$#>Y z?KEk%%ctfM5<+ISv3v)R1)I$PZuCmL%9OfZKh<>d;ygDrYdzq6O7(2Uv9*|bJNzLs zkg8XJ>6&EYehi#3E094zyggA`3M!stf&lV1`Y9^TZu)dG5>TO`B)iEOeJPApoX?)d zXZPzqb?%gSiyPoBnZsbddh-J5rvfF{LYS3URdvA7p6R5LM%WyRsGq zlF21BBO}W>-#;6~`h5~Q*-L$I(}nt_v77jJ;gOHavm#}+7CSVOYC+xqSVWY}ba+uk zV^UYT&zN-xv|;Q!1lpkqI)^YEkf)j3&QUC$+n==^5jj{GB1W>+s~r6|{lmsWkjP~$c_=Cca$B-p~{=6O8QzmUH|n)?8Nf9c&QEjC}~UvY^`o(UQ{X7uvVQpGx*r zjb}0XU9bD$$*PFri7!hnXBq!iM4aDoR*N{uEr+M+2V35|nd=)4yx)62!Hp)i`5Y(8 zB33IfBUkA5Qf02td+`-f7F-L6(V#kpNHFLH1e0boD7O|RC)rIeZ{&Iz;a3sYAGST* zSNO!asu^qjx?5d{*k+_@!W6E?VbTvSi|NTx*rD2_%3}~XME}~SW*dH5JfWKwR%s9t zmdrS5Gx<1wR}|D|sXzjPg96*HS2G#B|NN%;lvxLSzk04nU_zN6rEw^?2)K6Mk>-B^ zV9b^vJXUCWqQ8oA#vZuN8?mTZpGOH;*o}k2t~I5v83jNxG1mufF+lCk)-4*>l+9;J z>ZVi=$Y^McoBXWOH**m?7X%v&$7y4+jD+hyjg1b|Y0QV-wD9@qnPCk(QYrX^u_c=H zs@bZ+I1ms)j1Lcbd^IXwvL0O#P0M!U4*$PTXYc|y6vX*`_w7c({`B-#^E)o2PFeF& z(2;3pI_L8a>b}1T2V_kBI3!(Y*L`SKek3YAJp%kLzeshJ`-SCWOIqHB{Q zrPP*o{ zQbLeFg1UR2s5I;kAtjORieT##OQf3rs9*9a$da03HmUq!|L{`N%+R8P+hXL5DgQ>a z`$~~{+?baI%Y*jh+@(s;HDFQCYnX}LG7?tB^OflM^1Ie$(1~QQn=XUa$1Jc9S1y(recGK3x@s|+nKE0f)^gcFs1ch69uwZ@nwD7* za)8ovVVOq>K&F&zJQJ5CqY#SsQALISYf{>z;@$JSMiOqF-VE z7Id+6hhI~h~sR7u#2qckbZK|1=r~XZ(3{;!z#9UZ;FDT;HW$hW82ga zia{{y$Ji8Zb)&J1y0GpvZK9RZFAfEnV`4kKfwsRNJxdf;EhU}MJqQG?zFnbHplWqQ z7sspmQQBRzvRcgbE8&wP;5f2>y z4lo}FQX)7je*APoh$Ju?D|yzeGk_gdc^=9P3ug@Z95>^%V$v{ta)DxCbd-D!p{NV} z4M6KxVh_H5$pvd_U|WHYTMOp4La8Lvj(bq@9t}Z>RpY*bzCKw!s}Of41sHG`L5tPw z5YnrqB5wa{I+{s#)lLHhLVmIFfRVX6WA72Qe{E&tRE_;Qx&q7&((odL5tEgB*yUEGv$(=j8_&8BvcCck`l zvdGB6M)JODC-H9G92k;9;I{I2`%G-N)gWZ%^}m`E)Bg$%j+s3Yzq>tGCeWj0=uku$NdHKYBPcSln9O@R5{&Ox zOYR$(y5Y4oG3@?2>bp|YnlU|@4}x|_|61M(mVPO6Ea@%wc?ewfUr08|Zgd2= z8ixsX*55S}JQN&$@N9hF3kV|e0CMUryxYCmJnE!zCN_1dY5*jlxHYQY96#$__@xKk z(XUi;?biMqby2cQ=KkP(Xcwroz&zu2JA7lxkcXS!Q--x%7|mu5$QR$8#Yh&ylB|cz z2o?b8S^2enTW%59+++tL^1>{BuHZEjrc!SJDt8X1WanuMd8}xN*VU(A+U$M5Adtpe zB)DTw@s}R;{<(hT<&k5ogN<8@Cz4QUCCp7n$1ITFZy&SRjNd|?@X+D0OX{* z1+BpgFHODmqqVJh&EAUZHFHtF|KcWB_qfW@hU6%;cMAgz%SyhjY_;Cp3hpducC`Jc zIq*(3$|gAhD()NZb@d5ey%`mU|A}x)Fked=n5tPA8X7AxHiDNxC!Bu! z_WED*Ii~IHm?a5vTrq=$@zX?&t#ZSekpDQhzlvy}mY0lt0-p})l%3ep@}3D{l;@M` zB~5g%cG<4bq(jnaj!d>FGJ{&)GB)W?G6K|<%Be_fj@vYs$8}IT2I%y=BqW+o!p=T9 ztU)czFPiqpbraB4@p316^#0UVGdJ9DR$@Dr} zCAjje-}3$4++wSEEc-0UxZMannYTN<+AEA85L}jrqaHEBef3}ql{(`SsLX5<(6F0M zbm}cOxBM}3wG>HnC{=5!RBrMu&991Z3A@{~_|xTZie=~2dZf9NN+$J!?VpcUIyv%P zR28W3W`k)*t2!l~1UnqBQqW|U!uk=Nq?=*9ywLKQR>i1JX=a#fF&*els?z%9;*N*o zhMRpFu#e3Kn|);$)JYE))V)DRThmREJfRIE&KD9apcK4&gOZrt1(2TYG7+U;laaBJ z%7abJQ_K{}3$Ov*Il_xrFJ?$3MKyavL}yaYX7Y_|Jgf7`3|&JT)#Cmh0oDiCDIvq^ z=R!ZWjN5!U$@}7%_&545KGzy6aJnPe_Jx|ApQH+0oZoC&+{q4)oN`qwKM!a{^NFG0 zK0ylmlea4hrh4U@<_AF_I!e?8y;9fwFP&*FEZND;h1*Bm*8;DNAm@qR@HV@VVT(GK;!#!Od&JCNa5>c^yA!C8hQi| z&DQ}~6#2G~AIhb~1FzC&wgcoyD)@*lsgjp@ChGCnoTFS3+2y@R6L2%fxLqD7&nrML z%|m-|Y9OH$iDUdPKDv=d-q6LhygMwW0S9#?uDMzUA=7-+Wyf=JudFgh$vOlJZi~7$ zhj@vi=~22`_KyjUosCCkbo+>-#hQDv^dE6{N|3PC7a5a%h7CeVr6^S^XaosFX=6EvVHhXq#B)$xV=IEpQ;j+P(l zIN|jRt18n!xpAj@6<^Hg2U5d^iNbRTc~kPmhJ9lkoh`DRy$N6LFy1J8wHZOI8;K%1 zE(jSq%1_lq=r%}{ocq^Lygx9jP+;L^IkbY?5`IQW?ZWo?7xg<*@=QxKhi2BA)~iP( z1&W5}+Q@LqyTmbF*vaO5Uhtzw|8_$4aM!kvQ<`U4Np&q8l-w^;5VC&Xlbp(PF2bqW zQRMK3_n3y~qrMyCVRuqHk%ymqRbb}W+=lYrW&A6D3z0g8{^VLCaO9a$t?5|PHe@(1 zKSQ^r(|1X(oO$6^-G$j#`4z&BW3egUfQ_|QAJOQH5IubDl{^O2&tiWAu$mMF-tFKg zGaYXkXGpC%m+B7eNiTUCP}4**!D0Jv)g4{K z%Yt^Fgo-+Say8J|lZ3iHV)fc?|88Jum5 z{mu8`9cG^Xgl@||T|FDgO?Oks7J})#%nTE7qK6BmKsxvXr2o@=1X?}w-~oCud{Fy+ z335Y!UvRIm6|=PJdk6_gB8ZPZz?zrWBNU|Olj-UgU5j6h80u0s;q*Ba=@W8+zvw0G zE<#dU4>wegOfSbi4`umzxAA7gie~C4pYMBKg9IV&*K_ah`Te)fN8y6UK=|M!a` zCDI5gjFb`>0+N&NPU+DpC9%OIMHGi710&hH%m z;&=|@z4!BaJ_*h~tb z-<>|NZ$M$XKxwYmskH9ZC%d)1SOR5+Xpz5M?#O@z!9{9nrq6f}rF!vyHk;_~sHn4V zG!VS#snlmJ!k0usgNl=JFh*8{|7Qt>{8})1vmJJ7zt%k))fUy;L5EBUipuvZs0D_Zb zsH96)=;6=ihH1qFwmR3E^{h)&1bz>Ulv*YU5~mb(A)KKl006W@gM=~c@5=FHzz1ch zFoGM}E{NO~VQRqWD)=klBH%Q_x220S{E-lA&AZ)_0@(Ka%Q!sA*cSV9sHd1s^5C|H zmxn(;X}6z1#~qD-7hjkZZaX6))dYWS)S%GmF*T4g2tYl$s-hCQc)*?JhSTvTs^Gp} z*Q1TZn3$}>m0Miiz|O!6RWq)`$uV=sTN>ls1Tg***cB)Nun}O&&MJe-q&~@tX#qTI z9s%4E04@W#4hpReCX|#V{!3k4KlLu=PhbJ~wSO5c|Dt`{kS#K%uKaEvaDZjPv2o;8 zUs&z^E%hw;Ix$!E*iOfJRsF3Q&zpCQ6xncmYEENS{J?|a(dlCZgYAE#2es9JixX*v zsM_i?PLywKVFi~Lvgp%_9cQ1n^BF!BO^C)ruiuNY;qiW{LYTWU4yky!F`CRX!K|IlvR-Cn)%uWik> zpYxr+jc8t(d;2E=ooHY(_I~% zPZBMn3emplF$B7<{o^P1i#Bt$mCJ8>I_W}l;sNU*#-3Qv%M--KW9_#5`)f7S!e4_83lhzXdMxREwW7&ko%gr! z&$%Oh0H40E000h?*gw4hu24hkyC3(7BCBQDZ?itdL&)ME9lit9FfC?K60i4d%9X;= zO)7Xkr)EL~#NJM4K$n)_1&chihPf`m568@~KiLE-XW_r6HM42FVdc)$WW3-*^AcrVv~VBK5kh+0Z3c2j)_DhO^6XrzKy z_h|v9`bC+I`ag5I0~;}J3P$)m(lJ?yee>{}BB5Jk7?KvAnPs-fk6mDfD-fhALz!Wv zzbV@>LT^N0OOh_p3h^Tb6tZtvGlqaGI23AFeC0ikzZqbodaBpA{N7}#@tYOeS?k%^ zN61^T7}r|A7{&^VeHo-v-E2h)jSKzq`V0DjsG@f|=8{tRhGIYPJ@`4EC57}<-KV)L zpu)-r0uq`mQgA~x+UzEk9;WU9R^Cq&JD@HPNbLN3IT?-JUjIWgGT;n4^8WYefAI+~dXhoFU^xMUltlR{hT3 z+2JwGse*DfTT<(gZXBo#nGWpxd}b1N08a;|*hYST$5b-Z6Mo-^dOiw(vKr4Jjh^ey zr*d)2a5}93ieS&}@zE!T-^R^#zqn~xhHe!=k->l#|3(?CY-ou{&KlAfua;vX1Y|0C zJ`gvz`|x=@9d6PjZWIN1=1b-@S*`Wippq#6Rk*8(sAXEKu}-qAiT7H;+5G}yuT#+w z@dg|NtTo@|;$ew?X3JRp{rr7TkQb0G{86k%40Z!bMf^lJB*Q?)p}nTsX-MEZ<;i$p zW1(0a(eK-6Fe{CWM?LNl94c&4-2SBg)wTp}aG#^Ax3=BHQOC3I(1%xNLJK?;sLK!- zP!JyoURdkiSNVMtb8^bFC$AE8QI#UjwRI~Sd8>B$y}%QHM}qXqb!!X(W}4;i~bN~ZF!}`H{M)8u98u^-1<8mb{J+JKKYb~@YFNr9vMKh z#mA3@x!$$ysw4aej((Sz)>Io&6TkmGJSTDk7Y5!bYi}r5`oOpOp}F6}^FK={OTeo% z>?$B+O+%MP{yO{+*QhN#D9E(3DbbcDqYAsvohTUv7uE6z2i5J7gI{QrhsXufGn{D%3m1H%}lPjajn7s(tX ze{Whyj8sBeRCu7;SmtjY2Llx5W)If(XKJe0lPH*T1R6~+&ro{~>=giEyjU`8d#Biz ztAN4L20&RoYAMeO1Rmbs*k1)kkKxb2`r4EtPb+YT_ygxhDcbjj5SFIfVDMWkiK-9R zO<>1w8}PZ^V~Og`2mtnl(yo350caGL*vtwe5shVR|42^t-z4=cGuPz- zpuzzpf&BmJzry#a!)12@>yJ$2S}=EX)jQW+VY9F9tad-2sw%w)rzVA2MbVQoN(JKs$sNeIq-hK1nE&ds`pMdQ+)S`u*6&0OuIxLfKX|<^x!7a2Qk7* zW9K4)(AJ&5%9X3>&unr+fv9CIft9)4H@a zul~7aQa#4~ut?ZKECE-2Hs=7gMfhiGivP9) z(0&lr9kM{}DY%sK67y%y_iYWqJ?3|xsWgvk7zFpLoH6hLYSIypuKfS>==|+@TGCGf zzHia0s1(0jEaM|abJnTnt=OJ(H?%LT)zL@&Hks(-49~2|v1`>oLuCGYf+LDm(E!Y% zGfah|!Ip*xI1J~BAzMr`HNWXd80{N=^MuY$cW~Q9Pcu8ocpr>mMn6`}7=0QlXyY{z z)}n_YC+)3Nj%I)OKQZRu%6oE0(+OykGGO^yL14QD8^F&9$?Nt0FmhxOL%PBic+XGi z@*^uGSklNol8wXnSe8bU+v`0=;A6#uL3yB2C9e6uciOz|D+ASoP!$Spkpp~b6nypf zoZY+$cUsHxqDCzE>Jh-dErE4qf!7|}y{jn!CR4`+nHx0-Ep zruep1(YVu!#w@MxCQWP8+kbIQMsdZ<0kjMw)YUex4DH@7d<2jBN(1KW0j#e;ra;;2 zvc7lEDHv-IZfeKBcvL0UfWIa9eN3ka?Be&N-JsVMOK9mZ29lC9 zJ`ieK%+%|_ON{>DWY6S>o$c<&2M-winz@e*SQ8M=K~`;0?I_jh15e+{d6Xw(ShMrE zh37nR3kv2@i3{h&i^iy%_2wnEI*sG}BE2V723uStM~oL$|SStmb@bREnohFJM+gbvyg?zldqdxql9Y${h9Ep7H`7o z_xu44CrT&Ibm?#uj7tTn zhsof2*^>ibuUay5cEoJ8$Tv0LZ8}KCfi3LyZrgaO&s>WIJvyrxLV>*G%STYbif606 z2Eu9UW((X?F1-{ncPQiS(v?bu4b|D~OU>;nhU!f2ogV@Q>>acWdIy zK!DR)UuTdG1n0>D@h$QXT-O;Bco7R?s0I8oZz_H7ELsreAyPsH zKhiI7BYDO))*psRZ<8Tm7Udt5fK{GsiU)D`w?ds#fig~swtjmTs@NGs;(^^-O{`Y8Gl|!I$5;AbUY}4L8{V17L=bb$@;x)`UQ?Q6hl^ zkaKPItC&^;zTdh_)%TZ$5m0saZ1M4hkckep$fLp zu``dollw(`Fl;A{o{=)Gwma+&72WkOlyuIu-7g(?{nBDHNvP6P=F!IhyZXfUqX7)D z<2&o^R!U?YZ;s}WY*Ze7m?fAhOx@2)$bvz;=yPLX(xgz30 zy1bzftvO!Qi$h4B{CN4|mCEI124g@W>YJLIPC{F28Y7&G1^$~hkuSF3o6VdQM}Jk2 z1Z{8qh#dH5#E)A*^zC-}*(3gG@w)mmxiz)=11B)&3!)#Np@e^w= zJ~XktM0?-8IpnTb<=tTIpi<_=7LPaS5D=WEgb@ zY@;Gtm9Wba{k?VhiFNwzf{Wz1k*Ognfwh0(F8i|i>t^Jf>$dDQ;&d6zvOyvPXgwWF z`})mSP|oKT#R3d&1^sfG^dbB^%sbH&Ps1>^w-Pu9TVA#t;Al-j%ON}vIvnjom%Qo8 zulbt&f@PrCg2tTyL&I4U93nu=skxf>Jm;Zem74+K$gxq;eXi}+vUJFH=FH@uA+fc_ zAp^P)^Bj0Us{@4~QE>YtH)gvI_*kob-C+MMWSXm;gYJZ=e_rLAbJ@FfXkotX^Hz3B z?4f4tFLqYGNRli#J$sr)<$dF8Wn~4dLFXz52&rA!Q#!e`7X#TUKT;KJ{nw>9+Oq$O zNEzv(LHg}hy!N;!yhP`Kxb=nj0VxgZpk-j~cGAC`}rWeK=um7xlr-4_I?=>n&_T#rVxVGXaqy|46;%FzqBMdu| zIWP_a&!?iGG{?n*#vN7va(cHrT82BMnsu_&F{4cNTjj2yljx+a!l5rgMo;H{RX@at zG!Ul@Sia`G9-BUWEdpV(p|^dDc5$Da5F8u1T2AHqqKA3t2jve%Kdw$Rc8@6q$$)1+ z^Ar1DwZ%vZEoy4KARFrQf#^yNH+Sh_NRe>CW1L^X{FGXM+57?X8Mxt$w9{-puM+DC zZi%Vn6*=aiEpr9!&8U3+#^|52N)I2Fh?gHQRiMpnOf5`|%Sc(-ufC0ab}8i5Y**uJ zoEB2dy+UfDi^1pMDt$S?K(ra$Tk>Hwn?}J87XBc|98fR2V0@JnzR?m*ibgNhC6Z(MEuzwS@=vkPS-I?vRPgeu=sLc*uE_{^oN9) zTYLUunTSyOn$DYgxitB5fyUANXFD>HMUgRNibb!OY=s1SbiX))$tDoH9;}=$5u1l= zy668@_UFUw`#er_g38v z$v#ziWBlU0X0Aq|nF>CDlEQUbWuop||Cxix#(5djiyu7gEuZxHiR9weeYub5fPwrm zbHAx(7-Pd1{KH2!^AhZBRnF7W5`Mu+22a`B)Rs*sr6^@6+o?7<-lFZFGP}RL*AT-E zKTHvjlY#A_tT-$H*>1J;~&O&_ZXqy$5QgGtAndC80w-xC0o)`ptW_(>_a-9Cu z)Lnk$Oi4|1BVCPk(m0`+;JKZMrAh0-+@VN{!YraNoo7CnLklbkB+eM zgHH1*MZB|)3rpq9Pw%nEF`f0i}QiOdGy}Z=1-0(SgC>N25qs>TwbKZ_d!cVR2Avfn7 zg@|iB+vlmdN z_B_9PBoWfZ*_>Q7(A%AI;seRcRTXy8g*b@&Pq6X2=Q*SL7rd*;|D?fHCJ;xuzN1+> zkgs=qr|qA+pwK;Xd*KKWQ_|4DK$=6E<0V9hkN9TQnwyO-P}Ft$8%t2#JH2c=BCX4! z3f^SaWPVSIx<;y0rbS4>L1ySBEFJhy0JQt2Fz_ur4SpJ$Zw;k)2`q)O9rB;3rn$(7 zony;n_~HdeHZ^`o0itV*#T!hUE(^bfE7L)m#W9WDN~Lo9$VtYmpNYe+?=RE?Oqol zBb&0*2EAvdP{Z%txs*LUmAz(}V%4Ahph#GVVOdqdGc4>BSzd!`6yTCXXnA%8t<)!bZaWvaH@Ww-uhyJwW$HoBD z@5jalsgcqaNyPg-&OR%WRO-+LHKp6nV-1J?b_!JxXN099!uF?K zD*16L37iIy3w<*#CU0^Zpx*j^5khW4u9H)sgeuj4~bx%L*-uqbrNRI>ZFxF%NT~d|s2ies$Ks&8d&y>rc;s-*_8@(6o>i zrzQN??l*XEyA?eqv6YtrCn@m;<7gKsBqs zrx093l9vN&e8le{X-Z5?`#ui*mBjYW7_I3yiFFCCo;Q63XvrA3&IK6o!An~$F-sThk8zrWfrxF3@QZO11qqZu+Xiwnr9eSj69lhw&vV=Uy`FbQ%GMTgmn{s=miPQv z`(=MJO~+V0gShKeRwZ#V*VF}d&)0uodBMru#!8Ed=-%o+P&lShPwNEBrHc>(kw9 z^&lhv`yASstd>tX|zNRmEz#-tS@b4w&u<(xapXG`p2(MsmKiPc$)QMj9z zWpYbH#Nhy8HJ>%uZlK;eTkSs35hkuGDy8bs)3?<+a0B z{)4vUX?3?_LFK7hyxCnr*hnd_^|oHd3*VYCT~-*QdtPJR7Wtt99r4>}QIVRE*T86# zx1B#rdTozOmJ>*FTX5&`U`8T}9XQKFDh^NE6eJhhCYOJ2Bo=mx?#&jFx=+7C_uL7W z4I!|6`lWzyircv+Q|=Isxq@7LJ!&LV*<5m5V<~-l!yt_FD_W z7-`^AN|GD;Sf(;{FkIX1wWRjAzGr!@+JM`s=)~lW00fYL6`M;Z>dw|xnm0kA-f6JH%|58g_|Hc!=Ma566A|LMv@1-KlePa-X&JA`K*+KNP>(0u zraaX)4+X>IoV2`<9zQoudvV~LXZBMsP_}1o)6z86w}&CsYOkRpMCX>2!%%&jSX8n0 z0dA1GiTVG_J@jP$P2`Nmjz9d=t_;ez1g?o5tpkIX;iuxeEw?Tk48JThMfnx-I8pp* zIKZV8Jt;2CuRSE-!x}jVS%u%7Pp{w6Y&ZwCC!5(GlR9a`uXY*?%U|37M?x z47IUWWg?$~I@P<>M37C)Ik|lB)`@}KaAz21;w>?rsV5hHQtkUX_@cANr?uQ^smPH|JhqJ*0_yyB|seqVm{ z)kUjh+fC32;zw=~ryllv`nDo3?*w&$yw>sne8h&*7GJ}a2C{(bq<3t!3>1w%SQ?>* z%z(K!ABWQP6O-oT^67FhXzF!4VDnXDPLhtY+Ida z_Rsb|FE-)OLOi*7gY38JO;bXLF>h|&OXKS7ZvGd>=QyU7nXO5_S-QKjcFq=QQgdNG z2}vMI66&J>eW)oViP-EEDqeD%f#A;U`*MKU|L5lmou_PRcv|c@qDrFp!;8l5s7?#j zaiQ5L6uIhA%M&c~Y?Ak%+!m9`O#{+oA6HVxXFfLy=|L(}WZbt`O!rbVlvDv}7bW^u zHshC|@@vSK+1G?`d}4;*u(Cef5-blh6{eyPCbM7;c*S7(fMisz_Px$f{Kz6yuHum1 zdn=MaW_RwzKFb0U-_BEv$4<7D0-s_4GAW5jzP=lgu5iYIR@!8ZzV~- zyws)1c%KIHFr_o4y?x&mdcCp-J|z$@FS7U8yrfg2kMLSI`zq~5>$TQ6uQ_gEu0(OE z5N$Q^I9v2#3Pl&fyjI(H{(IM?x}?Cn+T)?>lE3n4ud9G`KKN~_$GTpWa(37X?|8=o zsx}24-mt!$JBa|+j5!`2EEKvs2Pt^DuF3yfA2*#Wp|9#xZ+kotkn7|Db%kN<=c+B6 zc?+KNs^Mk(NzhyJ9SOxwPBIND=RH{{XJNn^%tKYS>E*W%v7>UC@LM+eI6 zOpxatY`Y%Hq5Le~@!_mwkAnD(V(!n)%1=li)=HBu`OaM<*<<1_5@fMNloybT^u}aw zbNlu>nZ64+dxx< z;B4Am9beAv@(oU7$o2y&UE8KpBwUx4C#*O&l8Ka|Ly{#U7;BdAJFik+=NGLvof&vG z6L{i6D%Q6I6R%kQMiwP<)kdOXX~*)C@9{j3cg~y`%sWTN!6DVh$9JMh1yjlK-O-GY#dq(P(rmrj%aJ+L z1+n^%2u+rW)WMJCbAK^YeAH}G#y_Vr?jr2psk{ylX>DQOm7A!mWS(tez7t*e@_Sg$ z(*oL)J99rzW|41Yu{S`Ax9Wasx0dPa8SD0o{*WJ56PNWq%a5!IF~0h}oI}z!$b+Sb z84;@+*)Dj_DXCI@ETtHC-nVnZWyZ-d!h6hfhSK*xu6>E(^v00=X(g z!=a;7v42vGbUEt@{2?q4oxN5LDp~f6?ch#9>l>29H=y7wwnruWXoC%rBKJBoACIsQxB5$yLXX8dmi1hki4uj0Z#DA!;7 zdZLPiAftLIbb5o;T7(P{=MpFKgQ~}Qrk$921i7(Lc4>j$p7{IVDpP%?;*(87uLv3J z2V=*A>VyJLmWR#{lylaUG}QAgZ1oF&dXebwoSKV(PvNUgYieRdQvy|`yGq+_vt+bd ztBx!aoGhkRnBTsujaoA990q6(XSvp6(9|ylSjwPIl_gK^-LWQ#`_&G^fmuFB_r(@S z5AM-XfJ3#f-J}tFE7%U8k+#*NI(FjbJ(s$eY9K1P5F(cgT+(KZp-uy%Ka1!_Wmw=G zBgU@N@aKw(Jt@6FTc>TJ6L59{H}Y`*1rkACeB4{gO6wr+;{JxnSRrv!_dCID@X7smSGO(V1|co`Ag*7 zenwvgQvS?PRuEa!!5uV~2$}cM5xUEY90(P%OlaBD2=7Tvew2f_W_i<(Ne}Xf>*n2* z6A;-s%y24{uNB>pciDp3VAX@%#Hf}-wp*X4_Hr7%1UuiiWlIAnvo-Iq>HkHzjs*f0zvFYQ5WxEl{=AGUf3Dn`gl9 z_+YeW0hPfcSII9i0LXz$#Jm(DM(gw>S2yH*L(IiH8+7UiJd2VF;vFlJHmmBSC zW8veOxp2OX*`GG*)XbT`kle5f>I$qGpAC9B3tMJ&YX$F|5mVj1TtsE93bPEBA8A@I zEQlTa2XXD>@IOqOQgFBLDHEBmBx0n~|ANK2TbSoM|I>VP!{*IE8@lv9uaLMUt=QVI zxL&v0s*n?fyKj+-6EYE^plOfX2y>QEh=#RCU9ZIMy#M>QIB`K9YC4MmWLITClSHf9 zhqt$$0T7-4{CgM%72mKAv&UFX^cSnK;qd8w^(k-R6Mo}IHii@KK0i;$S9;o3^tC5< zX*W2iy1%JsGr_ros&WGv#rQBM`OYGIgDs-VeuI$iJF^2Tv2}8QNjDN|$p z?mQDaZzo@+I;FSA+(}R!8PJI>NvTz!rSFpV#P}qNyWj9)U2?WNJ{bdbI9D11)qY?9 zOV8H#qc3G{ATi&&NWQA&`W83+HJRig-kE`w7yaU`{xfB>7+C5#0*em6`eJxGyCXgH z-hcim#7j#~Qz$3LB~{dGV1OPNw&tGFPVLTi|^=MQusZy;hTAHPsTJ|FCk#hyuA%`)j> ztY(2xSO3w18;*&Zf|AR}=vO-mD?brT0Zt1R6?%H*2jQs#urpoCW6Kh!9lQnz1-os>=EB6AUFlHrvVze& z&GPoemA1t&rClCc5kl^RZtB)h+g}>cc3_$j+>~_@$ratWo`{E&%ap|)w{AU`zi?L$)>#LJcGHy$nv}b7^C=~QO|M5NCh`P?vof$mIhRrCd z40_&b7Z<;%dBQKZfbVgstxt^8G zppLflRzemoW5ahO{gH8zXTEQ*-WLrSEL@eGuRt8K7S8uQ>Yq*Xcx`Pr{`IvsD@v$} zlRh4L&>=Q{lqljEt34L9otJ~K{hJX(BQesmKMs$)`qw2y5pm$ih^~>(L3}wd#Bt=f z2|(+KY=>Um5b}!itA`ahncf_h|9mI*S)ly;;M_&%=zEJx0~*8@qH$lM7+?t+utIS8YK|3 z)m_KkE=w)iuqW8x62YP6?ZZYbuiJLV$H;4aQ~_3KKhf7cG8kK;^!`MlY{GiBX3wmv zUy2@nCx>$Hq4P@hUWXxmBjo);I_Li2ODizvf&x>>yN4|HpVf=HSD5Y>Jo2335YKR% zaZ?4pz);#L+GAzB%6C9zhUY%>%e0>ye4LD$`|n7{rLpM=H!(-rU@&8i%6j|}n7TQ2 zsGV54UptYW20xbBPE(TE%7RD})34f_pC}#@4jjsFjRVud(8)sFzY!vj7GoZg~--3v3Xx zGwNZw^&u(`>2)czxt82+B%p3^9>}@gz%Cy~<~;@8E_P#laS6a!ggpv~3n11FCQ%0I4g~b!dCMDI`_i(hvYXJ&H%lOrA)xX^fhT6JM7`Ph@je5SDiMLZG zp+GNM2-9_=BX5^dT<)rxFLkUhBrw5Gd_u<-4LozuV*?aC#D{D5*j#~69;yH==CZj0 zCva&N=_NvhSet?a_d5_c#I}^B03?+&iuw+Q_Skiv)eI2p!F?f8p9Nhj-gDH7w5oABRhd6)x4h%d}tELF!9o~Cl!6}2P7Yg9t>{&mbU)fJe@g9S1g#8gS ziLTxkzV*K*c80?2_k&yaTi*|3M-d;-XM&6}CKc90Psg9sqyZU=WY!1YeFJ-%6~!D{ zkJRchUvHC;kX-%IQCBhlbs2_gMH$?~G^TuSyUD~ZvT-k61M0H>t4Y!NT~}51b1}7J zOR?{!k0$_!(*kt3R%SOYd&Ux6#@N+fxNdvz)s8)BwMWi#A~vG_#@3JuCku%ovDJa`(cxb;ErJLunuGxJS=|`qU@!$FKe@mfBNMpe&*UL z`-m{#Z4aF`%0jjgvh`7`!X56Mq{se#-Y(xgmg8+1ho8lJGpt+rB+5F5BKw}jhiJ!# zsMUN9jnN#0C~4J5i&(VJTS%4cGH^DL0tkkql2i9KR#5y z+pyJMtJXXfcQ0=B(zhpYXM&+M4BMiEnPEE`4B7V1G+Jo4ufF&RP{H6tHDuld=$5+|yree)G0(zkF&yBy14>&Nos-Az@H^5?=|n3qbxu_r2mS$Y5| zb(lE0Uh(GTZCyEMFD*f$GeXAFOUq<^@^%8`;>SSQO1{{^s{P=Tm#pyU!0LNmTJ30; zHLDrQ2d!M6PHI$7Jc`rASzT3~qV<(^l&6*dVO?2+JxB0c0&k4di|b2*e-WNR6xW`A z68w|}7jbC!c#X_KFJT!MeFweV&lq6t*7Ac@^H#d(a2gW`l*sMzA#&&Tq<^^8R?bV{})7d^hR zG5Blx%u0F+F$U90AKhgRpeH=cp^~8K&V}a=F)wF6wm^Y~e^By@^x%f;lavd^-er~M zE-wS^a~N6ZLTnK!=lYchq%w^1Uj6MdP?wV3nbWgbXD`-m7w$YfH6*?{yiz72KSV}j z^1i?}<)o%2n&2mT#yK$A%&Uq1C-@o z07DupTs1qr-0C}aASy^%1%G=5xYZ^?Xoky2u4Tdl{xLyFj~NYB@N3C~?2HhAJ>A2l zOvC9zdi7eFrIiup79u+_=!5-{UMO2EyE@cC(}^7-w$uJjFP#y_p$+t3;YIdSAQ3ML z!OiyChQNrqz|d2cnokz^7g@8{nH|m&l{y6uZG@ICXk$;N>_@UoEJz>FW6`Fokp;!a z!-2*n+4tFY^UFpUvYz|z?VUHB=o?coiV-Y+pM7S`oUNKTqpsiLnqYy`4DD}=R}k`Z z`lM(A=U|pPGdYlz#f5M+`-p9Zz>T_8q_CKrNhjhPVU^cEvMK!cLZN6)$BJykB|qZi zwf`_@7px$Bo!1f@6+x7rHpbZecZQMDB&1Q~{kO810=6zb4h}Ae2-T~Z!^jpwbw@5D z^fCJFLP4U(F@V*IbrX<9CSP`}p$`_%3oVFBNf6>9ewSkDPKi=g{eCJ=l!iOM{uYCt zDJK?R&qhH-HU$acWmoI8RjGB zV*{mmZ2C}8ZhX!qg4K$yZ_330zbD?*XCUy^&(;R-v_%;YNwIX3T-$)>s<@r)2Gg@q zrZsR<^vwadyHLQun_~7jAO^uLJUk2y!)0 zT=8BKDGTj#6=kl^>seL&)3+gkn2o1Lp;EnY?t?|t9C)22$C}c++4US>n8OODVmoVE1Yqcm!=bqe))sC@C`OUKAw+ zbn|Aqc+gjUh%vz2)LGEfwdnaSFG>qlkS!5i+L`rCyk^F|pPQbsQ||2{IE7zz)u4Lw zuSy>@79NjXaI?Sx&Pt-Q=tP0%B`+WG1o4jcejS>6$xqc{^X#)M92+*^YI6Kegz&lO z=2*SEOJ@6_=xAmeN=EzQLS~Q+EUPVm~Xytjt5JmfkgIegI2qe0x7?$u8&g1;JH!=(6S?X=lpEM-< zrqya90F(o8w*gu&G+(wiMcRF{%&^F>5V6046HCix_xevJkAAV=#SE-} zg;hxCxqm+)7pHZus}4vW5O{w(7&(`BM%mk>Z!Sph>~Irfg`eJ4aYI454NK6UCfmO2 zL9&oZ9#ZaYwf#!rcb`202_Upb;t+aI7=-hXcZgmTk`4619ljMeatGO;d*?nnS zxt>VUTy)rzx-ti7XB3azvc&#%=@jQ}R#Vr+ewzZo5p!VLvn+ULQV|6EIQJ*(ZQC^2 z>38{m=N2JlfPzrwjymv%k*N&ad_AQ^VZ*@iRhod^&9D9XphmyHSk+}!%QPFrG1K%! z8?x}u?Jf$0%L-s`7sJ-8g*fV~ro&QE|G@HY+BpLnjLKJX8Txtk_^Wx#pmPrmz~!}2m0S6%#J#C4`d zm$M99iVV-NJd+Z5(9zgfcY=Xj@G*J62Z^k-V%Wmri|*~ZN97>wkB7@a4r^D*hskOS zo=Mn~*@+EgtR|1&JhOi%_Xd`P531i;*oED~uX#9}7{qRc%qzJ7!{n#0^)JV5#_O@W zJR=WPq^0zx`eu-fKq;|Ow~{>vH{36<^*|F1oS`0|(^dd)1GvN9IR|6BI4`x!S?EJ$ z8D&TF8AaE3!av$lR4NGU5@}D!O|pT<9GtD4(5f5ig=7qFAE8144gX{NUr%0+;z-%Y zM$9Hz%0T^SmwwPoea=vuiFon~3RRKgDc>YQMAMrAcPn#%d#tlb{Wefn+W<3s{sj9a z3!Viz(>s5@_ZK(=mWXuZmnVA{BK>W-4?2aP&L5iV!1P4ttF79Iblz<@Yu9f%S?jhh zA~qwIS{M3v^sJGjUhj{Q8X(?!bpp9I<~BXirl{uQ49`v|HpmV8(P4N~DbmtDa+qnA z;_6Zpv8z>-ecb*lxOKDdJyxvigyVEiU_qoP^c1l_LY->=B`tb9h?fk04KET$40GL2dMtB_Y%`AI-b1JQv_ie-aX%-qEzM@M1PM28YevW~T9{q;FYSQ=y z`mjSIuGagv5Tw>xf-9ym;Md*Nf-`5s-$~piMf&+sQQ>j7^tZB9lH;ff zNh?XGz~rk!3~>@ksC6N}?WKdg9e~o;>lAyu9@&)Kznt?mxu-7iBi(aW=-9dk_ z9qYWHJ%#XMjVA?`b@b^AW!>|iADNs=+_Q}DQ0>0) znpd?TNht&QD0Rp=_?0hv_Ni^$>f$%GedV6o*~y3ZkA2uPAl!t_v(=+R`Vi8t@uTaGm z_Kt#3IPbq<)^D_If!@Ya2ha>7mX3$k?SQZ$6}zg5qw%E?6T&@AtzMMnb58tJqgGCJ zB{HPr5K+H>=|6Pt5Ux{=_%Xd-O4n}h*M20rUuWsS#rgcSHIOi=$fa~T#kLxO%;(za z+@(DI++dUzl7IE+^s9FvpVIm7nH8m)4x7%s(^PCh)Me%bw?e%=ftRwT?_Q?J_Y<-P z{_>T38uKntyh=MU>Uc^d2%H%p^f4O{$Z}K5Rg1YeX{C`FURz(hcr&nAcOtu>MR1=T z5ZtDW1@6$Dtc;E=n~dJs zBaV@*kYn#n_D-l!$v#fDLu4KtQ4YsA*>N0u&)>7p^}Vj&UtL|7TwR>kz^E`H?w)% zu^61=tAMen+ZSAKR%&dsQCy!96Y#0zNP(`BFY4_Dg@G=*r`x8n)#g7pOND#&t~g$N zA)eQ|)wwxv55s1o0~PJqWc^4DTYh!QN=6}GSLyC9GS-4LAN@8eaO?H;v5ZiH-@q@z zr1Q!kFa7HRlew;sB3HW@{&fp zkY{wL>CWoa0TQU-+M0Umb$$xU*y4;Eumh91`|ByeEa*l?7Zsc3*<{(OcT)>=UB$d? z=<7rH&TT_Pl3@~|wE->kI?%}MXLf`XNirzJeqFvc%Y{XV&cR5DQcFykE~W=4J3c+h&p| zy{2yEB@4*fu29;!rrj(t9d+G~7zJBE47nMN)LeFB(O2;oniSzcV;n>=Tu}9dJXFWSZR6{nTH8=b8l z-sJ1Xwft$|kd58D?AIl|_ctDW+UW@;Fuc_eO4-OuRP9->=uIo~&BIDS(}xmdCO^4? zc3*DMQfn@ZSJ<~r2{%jgRV>;WuJ?=cTN<+HH4iG_?w8-~LVVv^MJX4Rm}fDRw|zx8 zJKCou=~KKJgkL8|y^o0PWQ6NR_!9*MO=Fh*7$$r2w>3)x&k0 zg5N|Y{}x6o=f6gpO3Sm7CLENXb4=pd1Y(X4#kUAun*~qff64zdJcl95Zk30?d^v>G z1Is^p3Gl2LWzu>V9Nur2-x6Pw_NR%9VlydmEsZj>7RCk)sR+vm1pHjb-Nr{Fc3*q`L?Gsn{;U1X@&{{8cXwo>rTfsR$!1v75?O>#+}W!u@)v z)14_<$iJ8sFR7Zj=8x|Qk(W_es8pL;Y1kZj0Zn|@J`{cdD=i1m5m(jD~XY?OM+(z%K zMU;0+&%dcRRPG1a@E>89li$CY@F{uBo}72t6P+L;I;iikoTl0A>FM?&reGtoJ3fME zL{8QL!*#eR%j#uJ-Mvm2hO0N%DOInrc3fel^@YZ_N3w38v0zp-6r7@uk&3;bErC~bK$HK@#*@s-JK}s`aSlMW3lAa+a?_e z>rVwHOYCD?Q)(ERy5`RHi}qMrC?hRXyj8Z_my{aapSDf4Dos4N7gA2h##gLo;VV|s zCSL|DChw7YP97^A1)Zf#)!FC-n=5cBSd7DR;n=g%MzNc!K-B^fr^%aHJsm@j-=@1| zYFvl5@5wrx9=BT&HbzABf$>q7J(tD1H|b}>+H-C2-Za5I3r};)8i1ALczh`V8K;7V zHxkL)NtxP$6q!$EYp+=5UW>;FMN1_%3^?LufkU1RWsQM2ea0$5)#5D!v9hbokpx#- z+`5=n?vFmB7@_`{^hYK#kHLoyo?kSowjn+2Y*hbUM~iQjF2hTqSMFN#n9bA|pc9^Y zWn_WVv?3tzmIl9ZFR+sX!xdjG*M>a|kh1xVU$i#F`Arx->G!ZK-7E0ypdOift_cKl zs0)E(az_Ja&@>l7femgrn4MuT+ftD1owf+5&Y(fNc3jZpu%b&rp?gF5n;v+Uc$lPCZ8pnpdrJ*&?XHC@fG zqxQdQRQvU*fgRz^5b7yWc`HL4xDmKss_lJI!u&<#7ap%wVQjRr;jP^xa! zsM5t^GwA5dxH8Sh`gQr#ZjI1F76zp)f8PHY&4LMvw>X=6x_E|x>dJ3^yuaXOEUS(> zTxaNSw(>=^EKPmx4-k=iI&(JVwfG4Wtc=>;xDZh|KK8NeT%t};%6c)mu2d1iQ1|y_ zc>mfJ79cIT()tFjslLPW{of=0Tm~qk*ZAisB-|uR>WcnZ8?~Y6Pw3~Ss7l^z&5Toy z0+RxG&QVD?)nG?AXS6@RO$nPxq6a7Din2H9IqL`v!76IXqwEicL%%$F_4|A z#Yxi|8}pI(=Z&}1Q?OacP7av82A>;Mw{sOSXSrs)%9M;(K*Bf`A$~r zN_tp#hECPiV46B-8a+(T^`$u5tVem;%2ra%olh3Vj)RZRj!7Czg7t&jJapVlIf|!^ z*IhD1r+=Es20#FB-w4+={j`;{EU8T!s`rvZuSL!t?2~&q$-euxl3~fUaR$GLRY;bf zt|a?gC!ZJc&o*fg$Oy4GLH?~4Bx%!26=!jJwNk11pJ<@tb|*Nx%6e!*#g z+iDhGy_eS)sV`1^d-Ys={EEz|oGCrJWrWxoS;PtsXPLyfw){cYW3E_CF(#o~?dJT~ zXu=}n=|(8F<435KDeqGm;G!~CmF+jKvS&exhHF`r_suzdts-YQ#j-9th<4~8<)Drf zutmY%1;X3*@~W%5%b%-i^^z4}+|-sgR|sgFI{_JpuQQfW14-%-dDItN(b?$R1GNVU7nz?4;A8FG_ew< z<;l4FgYuSxY}evc-MdYm0XuHG;C67alX%FsEtO%tGa=UmRKqX-K7E6=?_F_!c3wtK zU)GTBN`R(&vxOZI1MCY>e14BHr1l;%STH@^1f+6>cI=xjAafWYSA$MCwV?en)lE*X z=$-S_6HTWbYA5W)1+Vt#lG5tsyuS=1;Tjg?C!RiJ$X=Wip?qO$!$9t6_3O^;W9F-Q z}TMpoD2UEXy`B+ww3-agnRUGt6o#SeEExJq)=kpfh@EB%gpd?%G_6y9#(2x&`Mw5IIUNVEHuS; zLLcW*ewja%`Bmea3^}|RZ1?IHR?O|fZl|H$m+KdQ+ zFU;Ls;e*Hem+oU+x9ceUs>GVW>goK;;(Udw)6?CZdqPBnci<2v|Bw;aDLv#9w+EZ7 zF^BMdyu`Ow9#m1|ev>OnQ&VOR>me6u$(fM;EeNGFU+P~m|1;0S+x$zR_|}!x@vDhN zHXU&lMV^=?uDn-s`%Ng$wK1yxif^Rb&E7%X?%z)93GpS<$@Jc6&CKY?AfUk`gjioj^gn(9tz$De+g+`*!BKGJ;d(iuPj7s!&3E_1Q+n_U`9 z(0XwZ$rftTJ|3I$ijRI5H^&G-{uYK)2IGUOU`8fypxXb8j0lzVkfN=wVZQ$_KoH)M z1T3Um2l~`n%}-j7l%}p4NV#4ikxq}eAw$tTHp@BJp`g(qFQJ(&>?a?r_8fLCqBPp$ z#H{J6)>80Q-588+gn#rw``1@ic1@k+S$MB)>+8*Vxo1(usX9d=6WsE7- zveUduB|6UfXG<&~YKpazCcqe30@4p8q8rz+HXNt)TX~QN_rj5#-mZAqe!%QT7}Hja zA+DyJv!CK$lJmB6ZiaSWBj+LoCdef#O?P!NvTu#VORr80q@$& zx8WN1vb1`2!12AoeHgu6h2a z1C8^ph=MTD0P2hzOF)VsKo<{O@Af0?Jq_1QWy27ZP*g7;VP5$<01)(eo0N@YH? ztlN9iSC2Y!J?e2sGq5NX_kxu;K7p1eO@ z_1eg^4&HisbQTi)AL{%Aw%=R?`fSE`D{gyCdnk=i<(F)65trOgKC|_taVratUQJ>* zm6zb6dA*B1T_Q#0% z2*dHdM|PUT1NR?@kXFx+dwvLbnesd|{7uOIIEQ?S53PCXjZUu+Yp!6H_JG8;s#hVb zSRk)#J@i$WI}el#ai4egY_671e|^>^$8y-z;5h4@V@giT-?imR65G;|GfN9L8FV_p zm6{r|4r2| z{O!!s%QgA5sZKArw$j?oRDn+ln~bJm@If1Ibmzcbm2f4+tbdw*`Dbvwx)x!xA#w}m z1*@wj1&_GX9Fel)3Faxt3=eCVOfy~H-fQ*WV!P`^UbAG+q69)W(_hv}PtQZQlSf3N zxrO9Kvu=yFA6i{<*o5$}-vdj;OZ{P()IxjXyX&ViMjdUUE#&CBQP^ybQR<2_ofSiJ z>wAi6q1J|o=My7s=0de{GI;?$1YM8M&y)|BFQEe z31Lr)u;n>)JG*CO=t{IvR?2^0bOckSZ(c@FY*}%&T&f~4iuTHmv$tLEm$|i(9O5M% ztlS*Ta4Gqx90Nj3N4L^0*CWL>2hzEaSHNM7aZ_yK$eyB^j9lqESeSlZKO4ZBo3`}R z={9^3B)N*!_JbA*%Yv<=CFfeJBi?j1WHT0L&QWhJITSt|QdMwQ2A{9$gc7#c5)0mH zJ+0x)H1FTaPR3d@O1R8hK6S~c;5XUuyS!^I=Gi3LPB8=~d=ZG}=)@mHin9{}4gf`X z3JoOt^v9rO&+rzfoOHY)UxvwtwkBqAXYw;|reHQV?=t%sEL7c0;^SWC z!gQDxH0w4+CY@EwrC3>w=I{o}?V$y|+hbQf7OviUY>-c83#eGJ0=z`qQ}3AN8!dsM z5znJZ=>GM5>PK1H4UlmzuxAC1LYZZ>>{XALo>I43|4NGP=MvzG5yZQqYeXcrnKT_P z4;_hgzU%Q6O9DE`Bj##;CmEVWJKRg?mdKb&s#U|?u3;JE3-WHTq zMQ21#M7256GKA%@h3?wJch-V3VB{M5>t4-T3IR?oRb5hEdkdXXVvgyuYJSY#4M8(J zYj>4O7Tc<(-I#&H7V5dTFTAQcATBG+RZgW5DfAUnyPOdixL&{Yw0ZEfT>4Ckm{)97lbUwo;+%ka>fSK)EoJ6V-kf|0dZ`>AN_XEfLvV%IN*~R95=pE=vRAlsWP6(}e{8M(>i0Ng^q9q+HBEJLv!^q5 zz_o0 z7P1qO8{CxlG@DJ{a;0n@dOMwq5M}?j>;%ARX$OGa*yUFFV+A2T5K!Gr2xSO!;o}p? z`2wMIZ<~&1V0{ThH}GQnUo&x4GpifVY4Q_LHo7*@ZBi{XtO;{TRd=ic z>X5K8Ba!R+N>pn<<6YgUi!D_!BCRCk9x?WUVt@I5uz+)vv|Yf*`o4Up!%by_9R}mL z@*_<5u}!XZkP`foQHyT~U$M3Zv|j=*Hx@wz_4aW74+mR3^cI-{Rd_}f#?-ZDpd|m6 z1WCdHP0#R#*7x>OlCuJ_(Vu@rNax&6{{APjb0}&c5+LExv!>Ru!F>@}yAhY`d#J+| zFL|($Doh$61gg8_wimyklMiP&)#Nr~>3oW>g2Qg+Wm2r+fS;0jU@imyk$;fxpOXAO zY5wKI@$AJDrGCC*wo2y{k-hsp2VoOwqybb@C$B`!{eVA$t>D4t8=}PUh7+_#vlih%9rxiwJ<97Bf?Frri8lPwJ-~&y zEMjc*ckaJX?jdqR`S)5%Obq1a#b!XD^a-^uS+oS^hFGZFh7K;b!I?$U!Ey4=4-1hw z#4=zWbm0|dz3*7lgih+?CiczNf%9zr7B}I!p(d{6@!0pf!L2#}+C|w0@Q0Vpv%4#{ zTAIxrl3mJ`w}6jP3!0MQ`BSnMToZ<@OS^#rRo`;eHIm7+p+XPFJN>C-^l{&+H*veh zS^lon+465sJk>^anJ82Xby2{8c2_t7dk?Qt`s=&wcJ3H>Z(8`Mp3$OWl z`xTS6@{tp+rf%+9>JjSYD@^r|BdmLy|A{nnkmiU~CkCIGeBP!0b{zma5G$}y8V@@> z|32}Q3#5~mm0D>g?qt`_@Gq|OzfVI({PzL5BSD>v^`TnQ4vhn0aaexgZn!PkX5bd{ z3oowDBoD@HEw6T!zf%%jPGG@e9#1y;vPMo-el1~h zc)RFQ>nkejb75r&bP*^jWbz57kr~v4CpFb70r^buC>Mj)pymo&S;$>G z;_#JhS>|I&p!;YlXUnk0QZJ0Ge|p%uU54Ybe~fCY9&PFgK3dNL>EayN0ZV*MBX|)J z1ln7~wC|gbhXLBpgRT7xZ$PP>bOpJei$f(`)O!n36{_N&pHK8Pp`o6@s&J!7*`TF` zwEWGsmf+V*+wqF^y7>&~>-KDYSl-8M0uL)e$~Y%B{9`#?xrG4s-@cah>E;>0`lR@W z_$nBM*-PC`X3%N3)91?&+c%#d&afgKHT$m1BtJ>5_$RXign-U0B^z>}RH1KJP5HiSa)piv31H|_Za0UvJfy>JoLe872g|2yM#q2-64oDmFZnKe7waumtdL#;k&ob9YiE40|rI_itD z;#D~8bzV5(2x<*nc*xNE45Oeb|7vB$bI?mKy}r;ZvgItiXfeGiC@JvhtyFJMrC&wM zoGvCSIgk*s9mWx;TzS6rc`?21q^@O_g(Hn{zN_u$8xVu446dYj%=VZ$i`Lio6j<-$ zn+!A3Jj6@tc19}g)GW#RcTRH0gddvmf21yVrtIW22`cD&G=||@9d=mZXTquQO!t1V29X-y)=ePpNWq?!}y-#}rRPWxWM9|MyyBT?E(;GjXsYzJdPm(t^seK)*er-K^nDmx}xVrh_-KUb9}ZGIo$V`&WO4CY&Z;Gq1j#fnh%sGwDd!LZ`NDxBOS;xsj>fIUB@Kr3CdCqDJ+0JAO*$;aW1S!rn zHN6+i_ZL}D`s<3OL=we3g?;_3#5c`k+raAF~yb+R#P3Z zw%q~I^#-<_Aek-zqAw?j229!Lx3?WtdPiuuowEVXe;-=roN zIm+=STZ1ocm%Njr>t1qxZHXmsON&ZLCog)Z|1Yg3)QAk^17tG*w&Tj8<-ASM%j;a@ zq%!2<4KOvKi`>8!%x%)}Pg(m+8}G(2(i%_*QO<#I-Aag;nB!{P+eA5SH}Q;q?#0O_ z(uLz)8X!Q}n_sY348Z%A3i6G(Tvw=I)4bWO&3k0#jAcoedy_vneAM{<2*Sn5$<4g` zO;IFuw|;GFkZWvAwd4#>nv!$M)C)fwR0?D9!81_?=AtVvE$*+U24` z#E&k`oBmF~ZJ9gb_L)pE1I{H)ZOBRaidD6P`Z3|@Wj+z1G!fmVM6z5k%GgZ+IPAfP zyA-DIc}eQ{vjobUOT}#O0lTAeM}M44h316EL?!eJR}3$6={1u%UMy^dm-Tsy3MV0! zZPYb+udc9w6pVvDHShj8S)Y#i#dl4=s%bzMPp`Qllz#mFM*sL-UqiX9>Q8tolJs{x zl-8Oh6kHw)WH1exrnQKu`M>(*@T})t8(Nv%Wg&Cw@jYHLC@8~`uCL*xj3VH@Jo27? ziqIi^Wj?E@aNQ6u_1ba2fVc;B5*ASAC_awh`CQLIZN03*;KOg*(`6#r=JE&dqrM(1 zQI6of(M8v6c2R8W{MCPBlQ2Gba&f!zGlvjIz*f}us572l;doVjvDW%DwB`IQw*On( zahip~1;h4?b)c2iPQ?Mb4S#Ci`1h!cLsc_m*`=9vdGJ!^xFXc4)8W`IKN0vy0BFc-9Dwgd{5#C)|#_VHM z=0S)$(l?sTUsU*PDo}bIno=&T3Re$ez*w_a(ON>3+7G0NtVE!+A&5rh=xG-l?6SnX z;{Sv}fcKh*X*Dzc_$IEpMf9Z&5J-+<8@tnmgYM>}n@QGaM|b-$=Lh+pl}~cg3|T`G zjLTCK&GYP>y*|5)k3hb$)b+>X$R=>|oGEZQjTgfh$}|xTnX@;$9!^f53-jvof$is= z5S|=UpN14_xuC7(Il+hut6_k(bV3@QTixlcWdm4Y*X!R5(t0uTybVNGvWPAVtV7DE z7kjHaQ4?O*pm{QNx6}1FN2xoWY}5~$@js;Q>!?tXa7Qc7Jly}_3gaWPk4thLxUyt7 zOC|TRvBWGM?3rOJ+0yci_L$nfGG$oLAH5AeI_hU{^cZ|EaTlMD6|`>h%CqoUhWkx@ z-RJyd~T)%j8ipw(eRzTdT3#^M5_fkU@D8kD_)H^#5WJ-^H_{V6qUf`JU~%6x6&zd_SF z#wa@Ob5; z$iZ{}dPk>3tIpWfqiB|I7si9#)x(%-Z3Tt@j%mFcW^{k4=IXUK34hd5v$=Kf++^^M(tYj2c`*mgdX#*v|Vj5Dr-7R`1^h;6IA|+ znE<6WD|xaM%~0>BbEb*+-aGyk1kOiNdwNVMa^|nC*^@1uxkv@C2+z~o`zO`0FXLkl z;`4qL%OwG1Xa4n`@`RwnatgHAVVUI8>y@x8RNJ*CaFTQrGk&Fasno)x#3oeG3uPSA z;HRXt8`?;Y-r+LOxKxw^yMSA}JvJuzAW%-EMl^fhf5NM6rcESSPk)I8eQrU*%w$C! zgAuT>Zit3VK545DN9Lt9p_n2LW}jI;MYK3qL5SnR+DH`8x}U?J<=H$;_o398@(VBC zVS-!Xx)AHLpQcr1kwMvE;>6PiI4F{sr;%&egB(zmj$E7OcB7!2VnhpIgv4VWE zd%)G)3%MrRE1D$pSfH!lrlab|$YbUog(9wNvaz);ai-3?r?WD3--8YG9eQHlKX{P z-t%t_Z5sRe&Ra`l^H%y(UrrbFEU(8K&3V$hS)SrGcN0uUD_uJ!{^$kikJiA(n*N)x z2$L2fZ~mOcO%LP`#;p3;PBvaoKgnTh_B@}@`t~kGFiBJej z>3TLgRkjy-PCxl*0eW#He6*`R!{2ti?zrHMd1NH-)m5@xXxwIqIvra^(^UE;4zi!@ zJ96+~TUITOjvVnKQo*bFo`VSmA{+rLUJL3R0d0XBwS_5F!7KL>cCf_LMw@RI=Zyzw za`%g{)1FR+?1R(ugzfb_1>UNQv4F+7`WC};q)To&VI}<-#bt_Ud^WbS5yUHTQAgNo zwyX*x9-BIrzj&KrZ?;U%xjBLWx+pLsvkTVCHEo7B46r-1alk%Sm9||=e=SVvx5U~d z-!zuG=}5Ag-BC>u<)Pn0oT;&D3ph>vIeZ<7dOW@Qr%?Qb@qjHSi@8*)Cb_`hh8cy= zbR?>T;}JTE)7SWNNL#&4h%31(+q>cYp`5zCPU)%?j}$Lw^Wz&cQY3tLDbjC6DOheg z4t75|t%+1<@7}W#e_43ljvJTmD~D_yW>;y(+t$WaFEn`5dc}&L_;B)#=D6C%Xf}mg zM0}yVK@2b7p>xD_g^OebLOPuRzXRutS&c7SCZWYrZTvJbpMMFh*Wq3wJPZ!|GFjtO z_=X@E)CrT2mK40*yxV$%aQ4lkSytK|C5w2K3bCxy8XK$3?sgR(nHl3Tmz3)3&-6wp zg}4)gZZrFAq@#Yej+7EHZizvho8cLw(zmD;Iqn-=O}?q;X<1cQsD%GgkQdw?Yv5t^ z+}BZBJ%Mnu_9X;YRm0f6&l-?C?HA|06;=Hvi_48#`$t1cRqXVprONPJz-Ntp5ccY1 zw{Xwf3yN7saE)>0Jin|=ZDNsdmp@TPYX4)Pq2#XJwCx=hN{fx#mqNI0#!OCsRwD&< zlxtp{qsg2+j9vyh`Tc_<)N{%i5= z%^-O`ykD_7$~T}Wa5jn0?;V52mv$k|2OZo0c(PuZaIdHyUkEU|REhEu1@KxQslG1a zd^_e%JD!lrT)F>(^*JQT1m`*yKOhmvN#wle>150}F9ZyOv|2#Z;*RI}Pox+G+-a~0 z(8{vN>-WfiWNMZ_o|p=KAfzj3V+@(T+#5d+EBo&?v`zl%y#~+C9j(lHxk<;T%3uf8 zsUX0_^;B%Q6z@&z^TC|+%H?y@1ozF}tjoO+(t!fpOcj=@$yEL9OzzOQBl%8>kL9y% zM8UMG;vZMyWYHZWd%Dj6bL|aOB+|TU8Bn#}KoxT%y`pHtavpa*vB5t4Ahof@Hd2bt zK-La`F?Bab+FG=-!#VPX>TM4uMpEjJHz(X!ZzrKSCqJ!uoCn%<7Z317<;LWtPA|P+ zEvSKcg(#f=$qI9FVjSmZIZ+i8p=#1~Tgw|NVM8G6ZV;UB(RrKiEs^C+#~jSnK&sY) z=E#-`BS4ri(jmpW3qZ6Z_TI%$I~IhQ1S=&OjQhEK60-EauI9J2)x%v=&f{A_=NklO zi>-H)bAF{*8$Usto;@qvhnky!h_`Hl)4ih!Jq@c6^}jC$v$`<#^~-$>l?^(mlXK%f8im70et7%Oz2w&Lxl4=a-D7_$Ge(e0>W8wG6>sXFibyWs-TcRd@1gl5&jPBpD@ z-V#f%HqGW|X5=JeJdH?LP*IPV&F6!3Z+`_PHZsln53paM@042`8l4|7cmt!C)*Hhg zdvai}yCq)OGm=Ei`xnlk6`~aw0FEaiJFLNY)CXQq?aLCL zEUt8G{Z(F?zUQ512RoxTHLo==+nu4*B)7qq5Ra11HCKKfl1o&oOqQ6Kb>};C%!_wf zR&}S5#5d>D7aER(7>sW#P)M!KaJgR+`sHG)ZcYxqR5>6s0H94l+SfJJfJ!s+;~mG# zYx9xIuqYvK|JK}U!jD!l4d|)I4X65IKOI7xL7oi!yw1SSZn9zP)qJsRgSW-{%mavz z8*7$1mIgiOt&(L!?s1UtmaEa}A!90wF%??ZnJ;l;a3iy7>Nmu?@pG#Qu4Ho?-TA+= zc41j!spI6t@DxIHXnP`H{kw9**oN$~2&5Ny3!-mQbw6y_1uUXdX%S-x(VvfU8oJC) zjP`L-O^<_?+3m)dN8a{Yd|sj@Fb&$W z2tG?Xc!P<)XbA<`gxKb3zIEj>OGc~^do!h!9L1f}1aWiRhqN0^FBYrITW%=qn~H2o zm}1A9)!qO8EojCT1LkDQzdV8^jO0F1az$oB+WnZ(Qajb&apI#ENJIdZ$Ziw%08AtH z6atOrPajBo z&NQXa{ZFVlijH%C|J-R#KMp-NKPQd}TVC2)elhviBQT<~$(se#p1jC#Q$SU)Hy|W& zZb&%wTxaQcQ_1m5G9+pF#o>IGZhHoo>uc(5G%xKdC{EWwE?%)P?)cI#u2vS z_s;Wd9Z{mrxOcRN!Fd|Uc&vkq1s)+Z5{D^g2JcA1557`4pl=A$YBw=z{o~KfaV|@8 zr~K{#X3BA{UV8_%-l10`Pm-g+$|A+yIKyfAN_&Z8T0vY*scL`X0^j&j>19 z9EbEe%5Te?*1fKAadFFRsth)jYEoG`IOxMJPYa7)?0?%{QEf|M2;6A(ocUIj>V-en zk~u07O|urU;B+Qew<{Ub)aLxQTWdY_WrG*<)$3!WDqiR(UQtF%Q`(RS2Sk^13&JV) zTh29#5w{6=w*BXW%RrV|Ls)%py^N?-+mL!*!5%R}ji5fD8h)-gz=ba7TnWVf_oumn zPxIHF?|K(22M5F{8x55sYZ5u0u>JXPtf{Mx%8qW;MgQ(PogHiRT2qQ^eFZ}eCC=_e zGOka4!thv$I6{(*-i7*Xgu3e^@tE}(=MkP7yHhru7I8_$W=9X=5wP>+r za&Y&h%hU*AULtKhy~G;D#|_0|Hrx~-ApA3ic7P0uDV(KgxBgR&gVy+OpCoisrAOXt zuy22n@KKk-BWAtEMuOsvtCa1u9mmw8dk1dpnF>;G`Z*+%`ZpxsnANfUn67%6;w|+~ zySY%5Ba_7_QU_$SChl4{H(RnBYno)Hy@cq2kDUJMAu#P$j(GgbW0o9%9kKpUP_8RO zcf+W+sTgeJiKvz+vF`6x4scsE7Y;Zkm%8#8^pmeTF#v)`#uuS9x7^}{?@hjwbf=Ji z`950!U`VD&90mYj(>zun%}37v z%)X#YAoxlQAW*N>-*J6H0Qe9a-Na1Bz7-oO1iJt}ZRo zwXyTRzXrn*2TIt^r+)+u*+r98{MKqV`O)>i?j}P@)-ARA>3Aal6;|dzdsDb%tjEEZ z$Qwu%exjm`hx*UDwvi-XCvxgcD9=Zp=#q8I0)YGeO9T0cD8Pj^?=Xv(5s+tKFvRzYel09x6 zyiEjC<4~4f+g_LF&Vd3y{;d1+f|L}VbF%r-o^L*);e#$=IoP!5Ks&ZMc?w?Ca^ize z^O@PA@>^n<;l`kr*tVlFL1ywtJB8@8$+snH8!?pT%tMHH`kaafmr8YWD5qM)Jymhe6M?o-s=CcYW)XMU(_7{#3Uv~fz z2`F;Z5JCN1w$IG6qf8%X^X|VXukwKM-_Pbh1VEyu$85r?1D>N}r$)tWN7nUNdUSBp zEp9)$5ujz#2(Iz(EuO|?QT2xiv!rgw{^GSpl^LMmK4r2=%0gLYS1^qQ+~qG$BEcB9 zRnv!mizE$Z(W?9PNdK!WA1nXV`_1H=WUi`k%cQLNC3bBnJXzIP<{v&p3wn)a6K{$0 zbGTlwGgMLl3%I5LW;2BZ!*Rz2`TN!dZ5!N9>iuYFXwCYi&*<*w1sOgW-fNOtrHfr` zp*iTrdsjjFQdoqvZVW5e=y2sw1}2z5?cNMQhsRUSOZCSq^NMu-FD$ zfn|YtpasdqWW(j3QrlsntZL|{x`Efg1_(xUHfB#O9dyJVd*dYYe9gp z<;IS0DLu0X*S{2cHJ7rjQ_pg6s{(y;GWN&Oj}8%UD=S=B@_+Jvv~y)_Q@PVl>U^@p)Jt$lIm?J zN9|Cud5j3sSB||+V|?Wi8FPjj;{%pyTbaWxK;lZxXeqLb@P)Oj%{@>0(J}Ni<+Zq1 zI(!Sx@<4zz!{e$CgW${G@1=TnH-2fnooTyOs(VLBpSK9X6{ktEn=n4AEUPW$`%K+ z3xqcUXD7B-q~z4)kKQKej0NqniKbSy%$IDp(pYl=dxrORT(%X&`mmk>Es8q7ezfYS zz}a>*joFh z7T7%?hf)Ig<7*o=fnAdHKxB}B(j|yrZhh%FbgDr87zT6lenMpVw0&l_IO!MUr z@6f!K|2+W(l@FYULMY@`zaFVHILInk|8*CJH6l z6QeAj$IQ;F$tI~zx|otHk$+8xpVxr%9yP2n3HM&}PfY5)rx?18k&u3b1(|VpI)rUKNWLo3!Z7S%3)N{wR zzOR##K5t>NQQdC1*aUO4PJQ-?_y-WTe3wP@C9Kl+zBN%wBL z;w#GKRS8xxN1#cbWu@ikbWpsJdT}&}54Une<&`tQ)g))H_($1jfWUJXqEfQ68}U>* zI)6qADbjOBHguIbdW1Se67rI{zE6O2U4Xbg{XoFSl{rnp!P3sXlr01QYZqPhQx(4V zehT?g-_1h&u2cnUW}Z=UAI;K1ztp-@s{1rvFuCXfPff$zj^Sj<<0*?jTZRatJMf_< zsoNMQB8Bu0KhtjVshY+>pqQkZ5e-ER*FKVwtcPhs zA%ZgkA3V8%HJjqzoDiGY|7mZ-XzCrtTEy_jK2Jr6oxu0lNK|5-Xsz?2>~3JhIkBGTj#BIq}q@M6vl& zOY|AE+!+E8NAH!h{$^O#Ut)@qgUuda9jF6U_p1g@Y3!y3M6^u$1DRoo-;=QLh9V%n z1KqbF8G{7ufi5s@!CBAB|NZ0+-_k}Y;fNzdU`>YrjuNOT%K#@^9GC*n3B5uPSa12# zd2(QHg#)au*4ZvFaaui1hIx>W4?Y^I1K%VNGBWS-DtzvZ!&v#dYp zXAlpzWC~GcG?OM_$85?dqcr%#*8639d?17r^jJm%2Kr zFS?H*qIMH^FrEk5eaM|3bL$}8cO^VV8OQZ}`cE<7=ycx)r$OY#FzgX^J=>s>e(qB2 z2}u79rzo%8CLwjm1T~*h(_q1!-}6^3<1;jNPAh;(;t>W0#=q{ZoeZ!cuu4Rl50_8E zpWqf~ymi?STBN7er@PJDaXzh9A_~jb{O}2wR7}g3%r-|=8(3mi22JyBXZo~i$)D6^ zqbEh7dNX@1j=hDbgJ(x$%kq%6lW9!J2UuCTi(5u?>UGnxU;NGwvrI>uRI=RIGR#^r zcr4O#{RN)W+G;!CX!WD{!q<&prJ4OBz5e?1P4lAxDur~_3O0lhES=Y1KG|hsG~o9a zn8^k#0+=sIKR~O`>9s&QKx-iLo+$6KR;DozQA`^=T9Pa-!J>WVo8L#`Kmbx769s_| zc`||FyF>9Smj*yM z0{oW4a%^RnqbzAHpv1=O_go3KXMZc1R{nBiW)dX(3O5S*Lt5tL{SIe&4UO@fx`S*Z z)fJjX<)x`d3E90JCE9i~AEP`+2iuI?vfdsiN;EpEJ-CrZA_qShj*NSB4LNN2494S{ zpge9P3mv$N9(bg4Y!q4NYT%ZpH_z)ZXwX2V^S4oDYy}Y_8!KB*nO1qM)7&r>ameiY z>dBYCU6uv*U$K(_Npl+>k0~c@EFV3-KLz98lV@)FF_#Qe==}DmzPMk5 zhXv>Qx-(;1v*e9_B1<%oM^!wvUE2U)w%NLZVs8CYX6H8g_x$#JRIBG%P{lTp{84;! z&!;YZr||GHTy12}mjwMeG??0>e!_Ha2pmeZ_yRQv z`BB~MAyZ9N!lrl@LB`niE++B1=#SWJ+k!(Jnbr7BKu!Xq8WnE=ery91G)KHtSL-$G zOou0*DT{+z#84Cqp?2a&hNkhaLc$tIds`^!nlSWtCOaz?8tAV;|jipkh zz+XIeF3ME|6}h=wb^u}W!sWK;S}4_v${!<1BXz~)JgLPAajNDzke^Ewmt&MC-6ebF zh1CtrCBDC{%#R*KFjr`24(9LrrT>y)xNrW;Z=}k!o$?VaWy?RDRg#R<$VMKZS~+IU z90(ExRt_7|kfdX(Mg#Z`2<;l-_yS_29 zQUWpip&Y4%yLofLMUBAsUQchW4lpa3xK@%9@oW_SZ3;7d_8X_*;WRP9?VGDgAQ zS5$nH(O#I8?0)}gPz1#(NZ_w7@H zNGeE=P$?-90bw*M-F_qo(jX-@x?56W10_UC1&Ps&P`U&GWw6m9Igl=a=jQu+{@^(F z4;;X;_r2>ruk(DJx!2j0p>h&vDSerRmJ=>U-63bCO+ebe5t6wex{#%`NmrO-Tdz2- zmu*|cZKWufB_30Rgo7ffgKa8Y|uux9R z!w1s*1uO%#8*WxlwQ{ER=42Yr!c>;>uW8t5;dv%2^YzBvChiCr{_bB`F0~m!Eqe?r z)AUt@Tn3!1X-W3AFAo%zhNwpGdusu-Rq*Pofvt+j_9SNS@$PZ%R*_4{0=h%mnYEMS z$-C~HEaz&B-royKRf&NViqWl?iGV=r)%#`21w&vpW+!W5E+1uSe`6u(&hRZVf8tnc ziGtFyi@Lv1kd?qo)Um#*O-hV{HIR{6+J7wP*OVjtDJ*WnqlFcE&AGAlT}T<>;?on& z)#!5m;h!rkZ%Ut-G@Yx_@5hIK{s$@lJc@)36Z>@-_xtO&-O{#YCb*L0qYN|!^Q_1- zfY31CR$XH{{zYn~z|{mWB2FXznb80<8-T?7ksGyUDz zgWCFOD`7LI<)~Y4h;RbzUO|JeL0`&hH0F6fUe)agBVF+RWh!detk-I)P~CfYTDGig z{@4a}Unw%akOdSl!BRb;P;F|T@Q6_d)2}CAVNRk}VNb5mmbwO1!QD_D%Y}}_$uR&x z<@}#FjIYlk7-jfJKb9&q!HnlXoh>!lo0KQtG(=K# zT7esWt-j5~{A{y&nb^%QXX@`F$G}nRrL}R}S2c+mpT3VmKm09NG6FF5xYtw^b?e)o zolIUxQ1>q+{uq@M=Z<=$Qhd06J?$YdIq~9UKp6js3hnbU?ku5IQWYp7 zzXBTEbb*U`Cr23U*&lo@%Uadjcy@Ov!@^uPt~zikREIO8Fx*Wny9iw^|g;H zuU3jR0$@TVo65tS)FBZP|FQa8CT!JYc3)+=IY$z5Vmp*JV{O&3KN#RC?uyu*$G|H6 zlQ2Xu{x?tfqeVZ3UXYss%e(ELnQ>rgQQu3v$Iu5klHoj(ZB{^(mA(DFA)%^u&SPv^ zZ;TK!71;YD@-~1Yleg`x1MksM;fla*H5(wxOt|qaEiB2}{hhxOawN^$d}K6Vg=Kl3 z)tr+X$COw0mPJGs)KnjO*X_@8wW*}}-zb9cWW5Yjx5PldY!hczz6VKdvQ(>|xzC*Y znQkvoPa+2EKrbeXcr=MQcD|lL0}6Jv+ieX!6M!RQjj}oWB#2FtCS0JV)6+D<7*$r< zjw-wd-v_hZo=sr30ZgL}vgJDObDk~NuaK14-_(6>7-~|#dVix}Q>d_{;2M%cZi-(% zYnHc~=VPWA`OOvMnW_$>ak;FB6#;19Nf7hURbv8aeoLksJCkX3c|C9)O;RM>Z0}Q3nniAtiCK9w6H8~bTvt(!mn4}e0(RCj8P8UeMZ|c9K9_T40}0ke*h&gpNSeoKbV2E9&zp}6|E{}F?!J|Dc*=$F=CV_ z8*C+}6)*Z$8@q7}W6$*9(OiY$^`t+VsG z!w-k}$~CnQV&ZrRY}lIe#y8w3+VZ`zKf4NArKEnHb~*OG${o=Gl|2A7zz*l!BOEw&I`m(rCfhV`~~Y_s8X2fNbmixAB!GjEFT zqa)L;jfGdIq?5mnbrUQ@dTrhBt^E93@Ds3^2Q!{-G`!l;PoirotRqhM3(oU>|GGS? ziDBaC<6J=ZQNzTMgJajv_^gMoEjn7to)Hh#%6>XKQlI`-gBt#Xe@|^y;qz?# z5HH5Ln-Ucha={?(SUKK2M#5CRre9bHyZP28K2B^$hCX;l!uKL2m({nyu|#IHS%cki zl55YTqmX428&CRE-{ra`B><(rr+Psww&D835yRGftzV4kA@gDp1XDEUE@Ng-h@hx@ zJReC0a&Xk6Z^GzV(huEU>s0B+?}Q80UMTD+zGw86^SwLOZ5Q*Ogm*ME?-(Vk0|9H6 z@B61vyU?7(ZBhzA0qsO3>el`Cb_n{4=TbQ7CVf1?d;eWf2EPO3ol|r0>DM>O89j&4_A1$(hy=p1Zm*Bu|nY#`R z5ePQ7ofBFm!EEA?-u&*!;RiTr8<-JNqNcyQj=gbXhHNQd_Oz*ap>a4xQtrsiZ#Z5g z-O2n=)9*5VD6Jmm@hObvkCMccAjmnpAR&>##=`VHq<#7X93T#+!c&l5%6btD-(7 z=$Vw^8>0nKeEp@1LPovW=ufBa=#_)uv$yl`Z8t^|PDCL4Evg!qVo^PIw59{vi9QXX zwM3_FMEOMT&&zBQLFydt`8QFpu%EJZl`xiWds^S#&JHIyWuimC>p|4trqh_O1M8ix ziSfKX0}b7S)5NEKlJ%wtSWt(A-|Gvj#`CSS<+o1c@H$f99vPq#WZYzrQYbgSpc{8GWDzL^$&I-djL-IylAlSOI4 zn5FSr<=wM)mbTA>BaCer5BiTd9Nuov;5=3V37@SCl3!^$DIQQJGsle!^WZDW>2V|L zhmgH)E3EV!rIrk|8BzRoyKuU&uStB`pOC*cC{4d4Ech$wc?w*hW#E~f@zJk! zD##c;PT``34pH>{m$(ES{5sp)L}Ji8%(q2dS3_K8M80flW=_7P^0y=85nwiXupoZ5Rh){m<}ZD#TZoE@HQ_BQph`-5$()EglRvUB1w1O@zi$KO{@X-Sjx4l;_Px^~*<3e~D6nD#?zv8;>Bnq#Z9Xl~%>XJ#*Sfn?TOlyfokLfm`coB7)&7u+%(CRl%F4-t|UuMIWN z4f*4~JA;%{nSrl0?ryE*i5RvlSv9WP4!@POfal8`4K6O@@-8FI&ia!3e;f@XPZERR z943?D8zzglTPg${pI|B>2w1pqL#>HV;7N>piab_7AkFWg0gnUwl?% zYgXGCF5G2S2r-@kDHUpzd(lkHgR#fq7r>mdDlFqP5v7Vf2_P%XA&1&f*p3Pz+(oa7 zOVT|eAC_}2y}?w$7!{Z!^+fq%$|4Gt2S=-|>qlfis7@e#b(Fm&n^cFRh4@W zwzR^IS?Melu*QOKBpxl0c2dH(ZmVGnrpssMdrBR9eBWSwZ8zvJ7!+O7~4SP4_S#FH(IYoy=a!R^<>MLguia z-cj7?GvRE?d<>hf2R!+8a}oSs+0(766pvMQ3jUY?)<{^3ImO1A*JsQN*kwAoOghG4 zn#MiGg@5OT5B~QVHBZ^~wC6I1h10G!`R7P)e3rvND~*zrN(00epz;CHNAu^}!GbM>KNX&(P)a&GcT{Ne zT*}IwPUF24Vb(sM{=VG(X3VeC^y>wD6d}GPwh*~IwC84}+!rtW< z=Xe_68m5Q8v~_AL!;apIA1_1TE(4KqD4OQ8ue;$C!wAM~&o9k$WsA#E_Us}R!GDZ* zyH~PBkU8ET0bK3#ZmwjrzFhDDdTGPrvZ)NTyV|l?a3YMGTr?39lmojz{I!1^2bL`7 zQo-~K+`EHnHn=g#E$~KCK&B-;IDhjZG2evOUag_=7DW?1;Af~d z(fd{A{pL>h{8wF4?ETHC)H_c|%+WADOMm(tB$i+H653tg(cutT(3g1u&|DtWgA6{s zA6W;A%+7kLiDBlrXWgDy74IA(MGP^Qt$RYZ)QxD0_Q6Wo#WX**Czg`Uo;sq&X79u_ zniYQ*ebUA%5+!NHr7MyZ3Wp> z4O-MaV>d?iBL-fL4>U#NQMI)=yY#1&vF=OH;9F_a{@F19sht)v#fixP8ZdPaEqvF+ zF1zQ}sf|!SHAMhSyXE;&IGkwf@_1;HI}23N&=`9Hh5wuy)sTUr)(9MWY^d7UKH*~k zw)qWWZ-NHCFS4?aU66~i^e8;%7TCgp>ok1cj=A%3u-mwJo$S9CT;p0zPC<$y z*6l;yhEB?RILEAWB+4XLrr?GP9(^Rs^63h`=~xi4h;wn9ZkwO zb@sb?F(3PX%}Vq>gN3_F)UWIG6r@)2Kiy4nqjgV*f3r*IO5~!0e~W|+DbKg|Dik~l zkNj9^eaK>OE3SxXLo3Xh)A`VQPn1815O`voxg!p8S;t!X*e>HhUx+$7JB)ua^#{9# zqx~I=qiew-?DE%Do9kbj6D+ua#Ef08)Brm2Q+(gG>2F&L?i5vWQ0kt+MJB(()SA+J z+Y?%K^wkv`z+S@x-o9_75||hGZ}~RZ-8M@ubF+5r*>+dHtO2eY&CaY!oKrinFxeaX zu4)S$(28e;~sNVq<5(zJy7UM>T zmRRoP(7_2l_I4(f(=huLpz4fS?asnlqDf((ldWBtwS$^dxgB*6HOEi=LH~-p_ZrH? z$y87XCZK=*BAe7^SgtYG;}o#s1yN`B9+&G!XBukgn%MivNQtV-EU^@|e4n>}miU7B`7>&qQvZ4?&g z|M$Xmt#;BL`RW6@;ik1pBCCdIQhMuQesOAz^50gaZE}8K!<&E?-FWt+A1($ZAl9)fifpa$TMGN0x|yFi_d*y=O* z)6HCdo_DHu{x=U%i!v2L?m>n+y3@w?tcp1zVdn_D$(ojFyXdFm%p}tt@rLReM;{0k zdjubK2FJdy5@MRk-^ALBiZ3(|eZRR8jDyPM15@8q9=uZaC-;}^rB44!I1wtE$?&g8 z_ytr6M|>2_s-fHFsSd5F_?lSiGR`@>e{Q?NtO3238F|dGQ`-HF1$oV{WF@r=oe)y` zy$*BCiU*6CH_&e6W){#1x*#MlY7`idqgG5s&70~lkBcFZkl>QieIM73ikhfX*2&i1 zN@WSKXWzV~@i%*vI=Q7L;N@PZEp8fZYqT}VhT7V4WO|F1OzelTK3hsUC;<9bDf8R+ zNSfYZMz7vscE?KqNHLmPZr`eSf_;qrwWHtwFiud z-`IQvARYDPDy*6Q?ut`f2W-PyfAU$&P};0FzC8@5C&l|6H7Zi2--e49Hdxm`A?-=$ zgqdV(YpL-Lzh4L&CQI$ z7lRFIS}%>ianPO7_YR4k0gYR@Fl}X2_%8RBF0jm9t3Z0~c#7Z!t5pTYpI><&Duue9 zQHm+W+e|x%e){DnJQ34VRER2%Jw^W=rKW@G7V3R;VarUVI#*2B{a+K^eEkb`@WPT+ zU0k&u6mFd8aDci~|`g`&ZkKr-gNwZ%oGROn7eUxX-p~+uQTX!xr`q1i~ z;pO!7-XM4V*pX4^HQ~Y*stmciZQj<=^9CR?iRnG_b14UJ`Q9j>1iOF6N^NXafM6#Z zYWr`HK6WQKth}amqb$)6!$HEn71zLP8Hnyls=bT1k9C+v~t>VTD0 z|K;u+V0u|ulIh?1a?2ds*={$az$5#Hz6GhiEnamof`Bs_JPH;9C=%NXv-2|?2Ot(z zl`Te6m%c~a?7ZPdx#I7f%=@(QAT8ik&8J<+K7qWD&&^8<@k{?9&F>G(9+^q)O)M@? zu4La`$?-tRobMYfcMZ2Z2|g=*Z*#EDGWm1D+HIVZQR7^Ov*E$>Vbs^0 zhataB8u$H%5!Ffl;emfM82dQdyfUVC8U>cOL|XonJ6T9uI`wH*xY&@N5wd9g;saoPz%AALrJyY0QG`sVb*y;hN7pomFXJTphdl2U5&TXnJ%uDxB%{I zRPp0Ud>(VX)gR1wtEG!|^b-nJYVsY)rR-Mo3qPCc*#+-J8FuO_VV;c024z-8yfL`s zn2Z4141|Y55skw(u(&C<0(pO8Oat0^%EdrcwKCV4ARGP7I^kXTj_@~dQVn2PyE6Bq zG@*7lZ--_DcTl^-esv<5jnU2n2w^@&nsI&(Q*iaMkOAn{fO#_YBu#qB#Z!AE-2rWy zWo-=3tf?_9q)Yidb|bY*H1@=*m0Cw*pS`xyW7o~IF4f$z`n==Qa()mmtQK(3UcwT9FY#HT_9cA zNO%=6T`42@D%Lzksl$gNVLqA0vY<}{IWNs;SD^^bYmoH2E4$}E{mt$Uf$%2&9t8q}CYyv(!g5sg(s7B5gjhb;;~(CzBW z)a|NM)7T*wg%cpU)NunY+3eeFCLF zbQJHUi2rwSGQZz~>HOctiJ1Ns==1#l*Cy)|OycmhWP_FU+5ag!8MojswLFo(epjTr z1+Nu&d|&J7ch@=R^*bCJPTkXi{x>AGX5-h#J&d%^33w|fuQMcdz$Ue`y0~0Jr=6-H z>|boQ(=FMHo;?w6-2JhQ7!Er0Z(OE18fdSjLe+h>*cLfuNB3+VAe`}UwN9aabMsxh zA2o9CuCSjxd7p7;m=_Q;b&`10|0Aze|9_b8m6=_ulV4DCq3w`?jU^~1WUPs_+-0+_ zYLk}Jn&%lwPhIEBZCpli;}5p?cffA4Uk%L(+U*9Sa%MPamkL@fVfvq{mFg#&-#eeB zRF&Tin8H>ZOojf=-@qs5g;!c5rY+KH_QI*@yFXLBLIai_U3^ZAlgD!ebj2>J7g=&+B5-O`fAn zGM!^wGf|bqs|R6qLaj9F&|bkndk0=H8N;kqlyF#V13-Rc$}+T5i}Dr0VqxONdB2!& zYS8W){*?TlKEA)rMpIFTlD3d22w#Syq{hseTfSNd*(MKbQ*TnV@rI~h(s}SfZeA@! z*GC!azDsU5rZ~YBKs_g#rwsB6`4_vRTi>J2{Twz@)S!Ro#x4CESb07%Ap=;tmxftY zmWNLD=zQwS*;8i)@oz1J)@1iVXUb5ry^1^83;T~li&wI6Wf4TRPtt<49}h50fMgg6 zDSlS5k^At00q1qXOwy^WG72kKrEw<(r`6=%pFOOk@LnFOa7o9?HZ|f$z0!hV*Zv{C zMiiy0fqyhS@ft1jD*M1(=4g_^EBSY$Lr6mn!L>~eaxwvtWF)-kp1IUbq{%ivR-!Z; zpto$|cb3humUAOk?%<67Btv+#Gj|SZ>Cuqu{Eo>6+RIa^-jM)yJ^G>Bw8f72)3pP z{r6V4m!P=DdT}^j+HUr$H_ewB*-p{)>-1F=WZ-&Tb@@sY^>h<|p24(rgkY`&x#3vR zk?7##@}q}=B@GPt)4_6X^E{qC`d(=}oFdk^4pcJ9UZ+Y@vA{+RHW`nW`#t2njwUZK zakLKyk&g|nI<8WUf!g_~16pZ7+l!)n5JaV22Hp(t_+=xw`MAr|pXqT8LM#axi&Z>$ zAc7ada!50;KeSgiR@vXvpdFCDAh30MlUXfqGq{YLZ|j~OoU)5R6tkw5z`vedXD z12c!uOYQEKa0pd|jKB53XCQk+%-pk@Pg2L0W^+S;{b|~;_rT%|HRV2hj zJ5U&JZ;W=wj)pQbyIN{~CcX%HvEK|9008mLJsPb}y4aL;+HOqG4 z4Th_wjP8CiD=i=A|EbK@XM(N;RXL<;^mZaS>B27CK28A~%+J|Idy>Z>dXJ<_j0e@@{|4~#)Ob=fayQ9?-f%;lH{E&j{ ze$3IJk<`M&SgFomQ4N&LF-#RY)=-$d4EJd1N}_8g(_)2ZV0-s*!C*Ew{?VW4M`G^9 z?m~-xp@)3_c?!Rb|1cNk1oOgk99ao8u0w4mxn69H9^ZB`_VT7;_Qa9`Hy+Q#%YTlt z?L7P|ob%x|d*Bzsbi026sZX~UYfH@*;Y13)4TUq#C$B?Ch4b_z+6!UZueosLBAU-f ze#%;oQpd4oHq*IW|5wg+RZ2W6?Bxx~P^qJ2-m9Zt0e)U;ytB4ZSP((cbc87>mCclF z8O{JZJ^MiT$dxS(z5Z-z2&>oV@}qL9xy&%Qx^VkjQI1-rW@`~*qT2@Y}`XV z8fC*3&b5D;@GDbIpVW<}hHT)=R%}-M1*H4Y`RGd6_aEQ8wfRkVOs)G~$~_HnZo_}zS|`lUkw@~?^#I!F(dNlUhk>A}Si zY2EGrD+ll~!w)YP+y`Y^*d~q8jxoks2}Ok98)oj z;#~fV3ok49Msca?5r@CBO_>d!GL2GKbK+LY4<3~h+bAndOfJ#M_NL$p6tia1_Rl(6 zemq>?4>-WkR^08CGpnDM`w0F=Tw~PL4c2yTz#vwqr8NFlnIHd?sr}{BCJXBmDpZ9M zDO)vuBJnrLdx>Vg0MNvnQO9<|1iz^`H=oH>05rQE2f&0EpOSih4+s|&3h#=Z9-6a)@t1rv^SIn?Out!yI-5=f~s=; z>}-0L@^5tm(=Q+rRNTC3%-BC5f_|RsJ#)=t#E-G>GjF!AeYRH;+gT0WvQ1Fnf+%m_ z<@szfl0w8cI@@bW)Z>q3PoI=Zo}dZ@UifdoAdlzr_5R4Ne9~j}q}IR2yW`1b0?C4< z8MWf9%j@;#+$-x%7_-3K<_+87)Kc@Hux5PGO21RCXOfol&fB9_mDck_w|>}>?7dPJ z6F~}mej@Cl8=AC}2xh8javjdHgMuu%;%qkV2XVTsHU@^LgHcF(w}0VRsNofNS| zb-hXVnPrS%qm|xDSmoYumD|p(ikLXAzgP%y$LPd}?LgdT=E=Kv(COZ$thNWmKSre= z+)F!UOBJ>m_>l>~&B}oiH38Ts?BinJiEtBTjj_{@irFXV<{E-~p9uE$2)>XYEUx0c z_r4A~LVBJ> zcXHNl&E7S~END#+Ev%VgZ}Wb6P|oc>$Wl>n>_&&8uAu@u7Ip0WDJA|xJ{TrIDLHK0 zH}>gI#8z$%oG=)39Hfl36x8Ugzba{bD`aArUs_7!zEX|n!#}{)BH?@W)cwlu{Xu^t z2$e9Uz>}R>CEZmVeN^x%-pS|ZUla#W)tbORPxj&!Cjl)z0p$xSXLwy*4r$%q#<*9^ zl)2E@RgX!K^ScMofvwV1tqa2Bx)2(Mw_7=n9KibUkv^0pH&&*t3=8a z%)9FGE)F05yyJ0-<&-oX2bO@WH#kbS=T^0J0JsqLxa0Y@t(w1e93HSt{dO#1J+lt# z{Sxs&x!5!eZ!+`f(br9?fw#<#OubE7*b@iH#|IjWzgBnR$)_EZ4}ZIU=OAnl%@?j3 z#NCuVoTz!^L_t`Sz_myHP{bxQKk51+wOt-pCyZx?b2`>`ApgD7i=(+J-r-O2xdw+W z9Y*if0U-P@oxU&ddrklWd*&vBE-6Z}d9~{v&(5h8-zMDVj_XR9E$#6q;-8-s8Dn(W z565PUFAo2T@DFipf403BSYf&!@U>pv{ZI{7A+dG(ZcwGTNxJ(}iRy>6F4<#6|t_`kD0=g;eWHj0_O{5QU+8$2S6l9=MWT<7vL2`@zL z#H29ihcO^}8#<1!#(S1WssaT3C4@JL_(@(+iyVEEpsJKfY&qr)EL)IhWgD(~GHD0) z1B%4Six@IK-YK}jS*Ww~hU9qtA>e(fOW%;b0kHAoYLCye?bYB~C%}KY!sQKh0k0En+m|8^Z4$#(re6{ z%hMx=cko+plX;qZxYV(HT%es|O(Uz8w5 zUZ~^if{mL#tNi)8J;LduL_8~+g^84R>psY(?VSFH(96P1V}7iw z_BI~CjO}1PyN?Q@SI-wfi6?#<_{fJb|WRrH@es^E9djX&2;osI5!ho zMIFZ%Lm6b{y}pt#u~OZ;Tpd)<{C=3mTa!nWP;fk9^%u?)RJ-d7>*9H)jfPFVUg4_zX)cySy!VOL98v0Is!S+n!eDtn3-y zjgR$M*9gr{@uc~0I@)0HQ``nkQviJl8*?8hw|`^C@SHe74een@v3aYt zu+DgLHAZZC_RnE;WURnj&WIz)g{F&-lzFD?0k8hW6jH{@|18?!!VWv=R0ovB347iB zz0EKuWmTK>mNsJ2=hInM<=FAaEdyHQ-M(up(QvmHNtj*SvYLRgRU9|+i5l;*TwGTp zBKubE;=h~ku^h8lL{FnB)MPksy6QadG?3ajW&>e0TJ9F)M$ksS!HyHNbCFW@_Ie9* zGCr8(@IO}8#)W`}lGhZhwQ|^p_h=+3nS2vaT};E}*Tl@obn~LN&KK+0Wl)V4?32=* z6q@^vFwEndozvrx-8lrrjGz-1u*BQz0&@c6*;CL31D8E0Arr~-x~njlp6p3%_@$Q#hCVh zrEK!yMz{)S)>EORZ%SPbd(fF3u>o+0Tm;WjAok^Ku{Fdz`0Q0tNBeeRU`Gl|=TkO* zg=0$l&lR9bd$I&BWbP}H1Ns|*n*=CJAO_2iuwRWmJqvQd@;K_-C25`)Xh8s?ck8@% z^*PIJJMEC-keyECs|G;m%Vmou#^VG(k9wjB$_;2N(kkKs;oJ{2s&zt|l8TEUU|tU? z@Jxs28euItvQ-2(S!yXqsYikMmjI2~sun|4iNwD5Hc39-Bc}BNz}$fH19g{**1F#! zU84ZnpB@J#&O@rWycykD5}mK@|6^nRYKv}Vt}JGetV z%)c4hR%ahEE5pJWH5()qNK8MM_xusc$}z^d|3{FRK8EUW?dTrrh4IK;RE_5|25-%Q zkLAq99PA zjB-tm>hI&5GX=;{a#^)ev)75#Izh++-h0c1BGi_pRB(KjC6caFuVBWsenZys{e_)j zg|Wc(GxX+EusuTDlK-BNJdrra9q z(l);(z9x@cgX1z~YTOkV#I=l`J$_imSfkCPh)rA?O;VyJO49x5cN2+C!gdHS*1K~+TKj<>n}7}8 zI|^0um)E|k@UA2ukDPPCN|-m%oqUez$qEkNR&l!Jn>Tl-Mc#H#>it9bCTTovnR z+VUUnEFFFbTW{UWu(i@&{P}ZF8#iLi99yr5!z_$F94$AKDko#3aA(Jzf?jJv$DTNe z-3{YeRs{sur1pkJHAK{u;(tlRjQ^(fae%%|g(Q3>Kat>I_IXc6B~x6ZJj$Bipe)s0 z+aa-6M`<(;2q(EB4%sO&^+|oi?|GLlqRATzga_Hr-rrWlPFFVQu=gnLKHwAomf%4E zd;P6{NVa-TI>jCm8re6=R5M^hU>=gUAd5uL8dm2LRc^9jmzMa1~y55;TydAG=l}qHb44brsY-ryoqLXHu@QhMf<5Y#;wQxq zkWV!QBuk>?7*nLFtZ*mfu%~qbvC_U*&|IxKsR;yKm-W06&#BTL{%qEDn(Vy14|f=R zoJOW+){!ZFxDP$k63r#5Q|@INtlRn$xHeS^1LGd4bag@y8A56 z_w;iQ`{&9WEv)pVU7p14R$LzKcx?6YPBQs1=EB39_l;KuGDKQ5<@OPn{@)dCW;214 z*LLeL&6?$B>-9_J*Th*0R$DZ{D8k}zqo`aV_{~U%^{mW^Ss`dx6we?YBWxEIo^aP! z+Ze1FKcH$@QCpqqZ~*Nqgw6ag+UD;X)ozP_(PEgM0%z(N>aH5w7T`b&(_Iyj!3l1C zZ|Xiw%KBuDk-JW6QGsm7TvkUydJBPhh!X)1#rZD`O7}~@T>S0GDzx9rAB%22FRW5^ zAdcF>X7c~pF}5*Fe#jc`Sl^9AKRWEI)P&l6vAyae8mz0{Y)&v6!apT7CqyLc3^SR} z__<4>?CTTk5)|fulD?mq(0h0Y_p_P5v$nobPYJEG->z|<#PVq%gpqMDCQt2Qr(t0z zPcnru+23XpM=~aR;IbN*l}LpjQ-dWXeD&qko4Lc<2FvyR&h~la_HEf5uMk=a8MzgI z*N*LJE3D>VMyh8~KNtSBV9nkL7^e(?hXBs~n(BS1wkou;HDIt4(p^hjYhs~1m5&eA zTq)AZHnQq`xJkfXKpCE-=FZ8z^`LILy_@qybHN3YMh3vzLGQbjjwY_SIUc&fRSky0 zt)C3pd(>}s64Cf7l39gGnzrBGGfIPhYvWlq6`p@IC!0AsGypzTK-V9j7DB}Eq24eJ zFkUn+7v<#JvX}GH(nZt3KbQc!(n?fsehR#(zm%(1r099Gi@5LS|Kf~>GQw{QNKJrR z-j(fS)71Ng5dC+6YGpO4=$rH5VU*wwirV^4icw)932+J~jh5S^9?V$noDx*bCshGG zLKH{c7V$NUUK#nz2pi@x>Y5|b#0AuBXow~|a-$N2)sI$M8yh;dXX2p$5d2#YQPip9n? zu8x;ICE-?tLbKcqDdtrm)tNL^^1#Qo>c)kq<_>~URi|Zg?4!f(uTA7BRMC#C8(y_2 z6u5QP=?p9!e&)nW@4FkW-Z729`|qD^zwhsYG|70%P}@w-OMh!|QwvD3q=oNc!!jSxQCU zR?dMq7?Moa#%__8-0}$^+DI&qd>oPVqPIWjN;4G}j$6>tx_y2KDwq)g`gz+Ie;w4( zk8#3CkK0e!?@hltKmR&1JFk8oRKCiDST-pU{14#(i&$P54-SHyyTGaX-UtbK^fUwF zfm?_OCS(P@TflLyAa_y~f;?(j{INSO*=k~b@KIy=WA$)4g*NnQt~=Jzqg%A6_gYD= zaF5*bXNlnHJrO@J{zM@MChc>r>GZSV{aGFp2Fa-*r#&GVys|qFq)vMmms+-))#WZZ z^3wK(9&051!|?X4^{@*evwaZcO#&7dN`7O@!)f)+nH-wRHAt!sNGI)gGC%5#d zjrX=Y#ni?lk6toI^m-{{L=%X+I2i>e<;ufQq#Z1O@4QU1WeqJforvAcAPm?9_@jpS zoeeI$44}SE{P+*J@U+_)2OqgkPG*(iCd8ZpZG-j(h|(@d6`Go1dXCS&3tEyrJo&Sn z9kb!tcvBI?fdTP=)+gNu0E<9k7?>KlAsn8v{hCJjQKl|(X?1Cu0kEI5o6s9i)XFzq zbM{mD{AZcv5Rx|hyK?_=b02RpBp!zaIy6O|uv{WpAmW zu*N3#JsafuDJJaAA`s?{&5dqQt^*IzI`{SZlg!9=Tab&%FL}l99wX1r;6jrsqKdxh z_X*fhagPO$oUd2+SZSh7U+fQvAohC`DbUOA$1Cl{z>~EVI{XdPz$;8VGv+#)071$A zdb4(0)D|#~zLD;gq8T70VQ1m)t&9L#Da7t#Z*&N?dWS#eb-mXYK$E&JEvyhzfL@Hsn7ZG z`U}*<*2ZM7wRAuF8CzulHx1LTUllRU9}@O3tjSMx0Y}dRo^yZ^c3{n8pxgxnHoMBV z;9^q_8e^ytHFqEL9QA-Y*1x#n*kv%r+1v#~o#qIwM5E2GCStJ9+7tkP1oW5Ki)7HP zZcDj{{js!&-Kid6Ca2@oo$A`%QUF!Ucbl~ZH_M!A!#AQ6ztjIK!AP>mI?K?i*FG;c zdy{)>^l{W|(qAmiw#ap3FU+%}&4U)PaON&9JfeR4H-U4#;47SI3Oq*)RY;Y!J>S|? z2i4U4zCm!5B<*4|ch)0Id*m7`vJw795Pj&F=E%=%C{&eM8Vwd31KGg)_wq{oZ+=YR zdxIpjE0X*gU&MVis46#T3IOwG?kt$d5(F275wfEEdUWyi#NRc(wmtJWVaVvBlS;pHaI!`7 zJJ2mA{I`jG2@1ck;`nTzh3R>74J)GPl$D0E|6jMn=Z!Jx&m|V@MveLmWhVRsPA~dH zrvK8N{Ho>1sJA$=^E%!V!?29fDmO=RVwD)J{)J zl2S~PUw^#863{uX(of!#BWR!Fmz(XrF2%D+9n!D2D}UK@i4fC~QkJ{OPwpGA*uQlW zbGdWb?^lw`GyHhb%WqG>LfFmkhrrU);U)$1*CS)gVjO{a&ba3l2L=^ouG@&)KXOb& zj{0{0m>X9%DziJTqSQDTTv&yPrtOg8>-N>KMIMrtwOr>8lD)Bk9O?8*>Bzxz+WY2Z!1KR787b0{_=lHlE{|${gg1;bb>Fnd`5E_=SFz8Ej}J(l3RtS-4Yy{yuOsp@R?7uYACr3QTYeYM_2Axeki4@_2Nqd+ zcXqp9dgFQ%0Hm}_m&f}Mth=a{N*{c`j(!WcU8B_2*r@pgRGl{u{!7@bNSh%%fM?mt zzExhXM;hFVIET0q@O!}`>F@~zMk2%@eJKSzBoEf?Z;vL8Qq2KRQw$Q6&?mdaoVOfD z)CBnM#ZI+3-Wy~`2WwtDhu&#}NpZHBjN4DbZx`i=lr--xBw0@vb)z+Q98}TIrSby@ zxTm;M;hfx?DK0VG;WUqwe#$a{MV!)|xo5g9YQ&D9DZBw}*M3A8+r`j)%kThEF?x>= zqgx6);r+y1*S;@<_*7w%;hTnV!m{T^Rh_n+6`}hwvS7*c9UKoA?nOu6T;ekUf=Z1X z{i+B|E(BtE3mXYNYwjK-%M+wHPw18;v_qKS${w}B)?Sw%XBp;jV)vucuxPaeF*-Z2`5;fW^VbUG9g>% z9hmo4M|Hk1=QnrOr@h@Fj1F)w0HB=ld7&?%A(dPy^)cmRB4$RGD3gk{Mg5oKVBmPCHDf@_5Y_1ArLuAf16 zoYxl%4AQglu#5!cnU^$F%;mN`*`7|Zl+bX(rK_Q@xddpDY>7;?v8cyEp^RM`&|YcK zO=$UG?*GwrmSIi)@Bdbj5O9bhAq`4MNl1+pm2M?OK-x(O$mm8vx;vyrdW?{ka5Msb z7>teyI7at~-`ns1_&@Z49*Vo~UGcik^AWvg-6Kv8rI0e$v6$K~db}rpmZ$Kh*uNBo%c?5CkmXa_%Ou=}d&+&?iJfqE zG({8_z4Z4Pk=-pJY^JcD?Gs$Fcb((ZbKT;z{7zxJgJ1$us|7V3md1*GKR&bTW#G={ zP-Z<8lRDZLJ=lS{{sHskK2)|fViOj|%#LF5%VP2w{Or0y4N_vtxz=a6JGmT}yP@0z z@@E0Dsh200XYEaw@%8c|o5NCgvG4o&6w!Mlk}q>yCe~eh%FKD^n=Tl4v0Il4{{PYx z*6NA%FF#oe%&F^F@jGv#y}e$fI53LQIx~o*I4~z;r}y1pzegx)?5*e9P24J zzUytXTsiYUxj4<>g`p_#3$1N)`%vBwr}Gdl-GFMNwymjaR`SX@xxA6HHi^ue8HlMD z%8wSGe9E=%!S3Pu^K80y?yB{766#smV zV`;Xt&ArjAY0}VVdNjxF&M2X3=bX!L-unDiQ42HVRH3~9B(g7@T9LK&|BzdiGYFx_^-9ot zHEdQIR1eJ5Fjrrrd0`FTojXAVUjHwi&JuYFGj@w}W4Esiyz!m(zBK@|OO8VbJ}`-Z z>8~;fn-?rIGF((*QQ$ON^LdT8f|D6AgqUGK3<9{LU?_KfyFaFs!9+{VqX{xfLd!bp z&|s^gFaO>oAZ^0b9%E|hhc@bPoD5e~BECu|0xod?EL;zwC=Bcbg29R(STyXe!YK=x z(_We>Vy?1=gO2R$3q|nd>9QtC%luLQwHZX{TX^b=(u3sf{Ic7nYCQwrUoiaRB93^; zVdqGXh)!w_^)bm0_jZXESeY&&yE3o6WtfQ2|Iu_@ym1u!>_&g}&HA33fe0#e8Fz~N z_v(S}+x}3lR#9U+Q_WhG$w32&*MGkZd&3JfGRu&A`GU{*@$WShV9I(+f?2CM`FI_} zE58{h1Q5_S%hSAOlX=tph?yO$qFG~^(+@RAL#1Das@k^ZG;tqb2G*wX(DPcYoAC96;sr0&eQz<{ zk^{5UiGV<>z}?fmZH#pa+Zz&gP{`;LSX`*qvUQ(snd>9+0dw&oSyK-lkSdG~r(XZT zPY~Q1h4$Kl2|SyR8_liE$>b7k@#7*?#&EA<<`tuiXP&bn|2mr%Bq!*mIxB%Of#C}K zCV3Q%t{MibXlQaJ$bfv1iDVK?vUoI}2JLA5eXMY}G~9JXfa}1ZGo};Uoy|-%5Ykb=i(hhp1|yK=dv9gY##c-&K^bao=69J^{%$kwrO7>PBHB-P z?)>7Y&ucYTAWZh;hU(tj~eAST$5JV58+Mv!*QZoa;91`f9`u>5@X{^ zWY*u~Zu|W0E9t92u?T5#Sy?ZyOPw_8ujF2C-C4Q37(oq;hOu&Ldo3m6 z8&hTWrd%gV?J{o3ET&muzjozvDa#!2y3Xh-_kTvQa9*B`T=JKgy$^c5y)=M*yw#>A z=YH<7Vt6ETKT=%0KO@D=xUE&&Ks;<`B}E)U9Mo`k3eK70*zh7`_E#Ohz>=?2k0~V@ zj8W*(5Koxlhs*Z}NcreN+N~SQl-?F7c^4i$+s3zK_%sPu`T3n#8@n+9pVtxR@o=xy zA1as!JK57nRod$ax(IA?=T z{7UA3L~o6{H;()=Qk!ngUWOv0r3rhhN2C$WIiI$~?wf{A4&Px7!-gLno4)c*?HMVR zyqCn+;53ez*zCW!RnoYpGqcmAlxi-tsUd@N&rX1woN`Bs;6c1;ts>~~K37?u=iV2} z@?Y?8c3uNd+hn^1>LbSDhJCmFqPhLNzf{jc|JsfoaIBHD3%2g`nSDZm4)Z zbMBD{_ciZ`lx`m$)@I~>8~*;0nRTzjy)6IVMa-!HaumIp(T8Qi-Uc%n+*!R_&{)5E z`MX807fRpsc3cHtl3d&db`hZ&suh%U=olm+`k%D2f-_GfERfT`UGGh6D*UAVVfytv z`bGCh`*a-qjH$$Au z|F~qJL15`N`(lK745RpJ^V*ex6qG!x&v@hpS}I*YZ1!LO(!_?ozB+(^+EOn!AmV&>O9A*n)BI9t-HB5?G-!fUc^)wkUuQvV z(KRS&T{?6W0Yra0YYzt7`XZVg^={ z^T00KrIN{iQrC6tMoGpmsOf-~oG@8)L9CoXjMN`VAIj0AOKpJ7$?P z*E{J9Cx0Hv6tHn)cOz106y4Z?*wd22it#}=s!P^|wNncY=(VMm-g+%jEBCcCc_EqL zoxHBQCv*dRbGuF_6VVO5`8PE!5^h#Vux*w%m)ne3oPB>pO8T_30b#LtYn*<`jav(}uOzL!c zb0o)*b35?^rzkNDjH@KBDwb^As$qC_m4&DmYW`_ee7)N&n%%>G5b0(ZUma4&_$1XN zDp?|E2MtflQc9i79v{yyxeqNa<{zl6%u|F94fgh9UKyL|TQR^LO=l6Ub($%auOA%A zpM}qyFNEw)Rr$T#G)MG`;Na^Qfbt77bT7_M@v=}>1X_;(E%4#BTLv4Rdiy6<$eQ5S zoM-;$M@(%4+kQW%@AwC}NG)~bZ;3|c>brbkg02d?9nLH%I{J8krKyq&oq52CI|Hx; z&1uXWXy5Y(CTr-2e|~x_b@X#g}Q3W(!L7^s@Bi!$M8l_zSTNz=x%!edH;8%=l2P&=_OS+cg0}bTURb+_r_x0n|IXo z$e7J7N>l1t!#`!Gx|{J(Cu)W?IlXm;*jm@sEbW8rAuR&mY2;=$s9U`AJ=LA&Elb4X zewk~!VV^l4(K5W5U`9RYYMYEfq1-+!etg}1qAPgq?4qVyD$J?M;+ED)~``nog#m?24J?Vimal%-Gpj>&0%1K4*Sv0b=AbRH4~HnYQzx0_>aHLI8Ew zZucQ%lR3<{i@%B;SE=4^AFC>B8s>P)WlQN4s{s{bnG6iy!M1wOUKP7{LT?Obwi*{V zvz(rkgQ2agV9VSw!;^J(Xqu*DTP2$JdSCKwNNj&~x!cW4HOWv7rh&~~=7di_OKa+8 zz3>Le&i`x>mDWkgJ2H-?b4W2I1&bnmphbDc^i_OZFy*~)l1ouwwfYc?33w#br^R$$ zg6z~Ifp%0==erP!Ny;}B_Z*&$K|;b4y>EWGiZ%87=`BEHVOygB4sjeQqh<6;eux^) zOTFs;Bsi;;_jYeAN+B+f|G_fP5`?A=@&=wAhEux=qYLby(7_NxGysL#iI(|J?bFx5 zYOSHxJ@hdtTvf5}xn#4$YdO33Q6k+54wasYe^gry$SDc8Q%{yXZx}-AV^!NAvCK7M z(P&nl(ye-?QY%lM)rVK(?Gm)APMCb_r~KGsyAY@EOD`r;#Ho7!1ZAH>H&eaJ&;z(i z&#)}_!*T3P?MULdwv2I(%dnU0l1oXy3yLI0ep5_pCscH0MSnO+Ut3CDOX`4MYVlY< zdN~&AMa#_;5YZVJ*YrDnO0Jt{%JjzBA4j#b&Gec`svA8#kqLB>C8*o5#3>z zt?E|Nd`Q44z?9aaZbwM#jZ4Q3@vvCWVp8NPj!x??D3orzQ3<-49rCIwEZve92WkQT z*HAKOpi_-odSI~5u!TI;fZr$62mmTgO8n4~s+7^~z}jKYR^UA7JvW(qQUERV(^w95 ziKZ4a>rAjQy(fCGnUQiKd(VFJze(3u)^DFLxA+k#bKQY|d=C+m4o~#loQThEx*7O| z=$31%QbGOi)Rf^i#dQ|?6lR}8%>6q?oB!?pIfNLu_tOcE}urK){9A) zco>njoT#Vve{;vJ7&goTvf+gXqOPo~oBckRS+c|~pTBuR-doQhrqxsaogwc1E!Q=Y zLBaMlh=y_4g9(cpFgt{kWtafLeSWisnQOx~uja0mSg*KmKvG4Lnc~t%2URlZpYX{! zb?7BM$|`djgC3<{7Y=_wZO9Q6s^o<2yN?k>#YylQD_gG94}X83?b^r%msK|WaK)nG z<#Nm?|LA4}V0*yr>sSuQAV(5HD`Yt({m1nA5dP67l2E4$Vpzi$mnVN7Z^jWMqWfeI zI9(0#UuN3iI-5q&-Bhr0ZzGrhcE41D(XXQ35mo1f>q~;yC+_{WS6~Ks?bal>bV&plW`uo)QK>H-Ldph~`7lA$jdZ;@1&i z0#S6hqw^w#qb?Rj0WDKG7yzKAsrPw|_KLr$XXq_eNz-1Erq$fAvQ{&bNMJ#}F_PFSe36kaLNZcZqQ3K*AR3!qW?yE}O zZ%*iA77w=XZE*N}8LL$31zoE&zga_tJZC&?wHbBW_cF;n`&C%ab*a>!hjqeh5!iq3 z4`#HLX{tDj#xIK*d6lLb29sCMmsEN+99ST^s*Uyg86jCp%-O9YY#Sf4JGbr_72p4) zOrI9--kJn&Ox^73o^=4*H`4T!e{qN*XRw!k$pLVfpgoe(fijO@?aj?h> zoVoM8N>Ety{L!lEO6X)X_2WLJOEtO4=_%vd*LI z27o-6lg{jYO_tB;lxue)RjR(0jFOhriGvjWw;OhUd>FiJ0-Ca1`=wkvKbQ0gqjK(p zcR`b^oEEDRQWn2mfUPcJ;nnuq9WNi)puXjxE%yXMKzCvLv^^tKo4I8!KJSJGoEj#= zwNKGq8iUL}Gpf5)+R_>^@{2E^f5u}ZC#>gqQMvD|{xG{wj=DCo9NqV;xT7tlA0xLY z=G6&S+ldEf!vQ;dSP3eDl%}9;*O5~$<6mP!e5df<*-VUe%>-whLvKt-xKCpqD&d7AYcfbcaPQ58Oi<*?s6TOv$N}&(hl%0_4 zFtkh|>LELRTk?O@*BxVzz%fXE%o8U;P`{gatO2X~a`Pbu0Z6+U&?XyC->@6av*V&% z_(yQ&rZ&OXO&SK}rhMuK6$l1vcKns6%uW4r2+x`se=t28V)ZqjaCSz1=HbDIYd*;w7I(rNWJ#)Grba=2>${uNuU`C&7~Y!b=Tf+)}b*$)t=Z z0Z$-Hl7;zcxL)^ds&tQMOM(N)0aWB~kt-I!M1vU?b`)i6mOneOKL|>MoAsZp`feEM{u8#+C^ZguP#BK9^g;oQVMj(&5c2wQS`PyHmZ<( z64W2JSkx`h-+u5bC~OpEw{P!Qt@R`R;r+q01bh|XU&6C)$$)YtgT~Ui-+wRzA&GlY zv%Nc_?|C(K354&HRhY*UF(}b5=)f>g%VbGYJv1@E#Jw-=&p5`ByBHgDXG?+!Ogud%({hW6FwAP&|NFu$7h#T9cr=sW_70CLf?@`V(@ z_&xzBkR_X{Nc2h+^5UrN<-Gi4emm@}88Sr%{$@lj4lOKsY=tXbULgDeIj!tstI{U> zORrL@F?lk=c<@3EbGI!r7>G4qTeDMWTKECzy&6=zxsB!RIQn{pw}#wvFZ5*8sFbt- zvvPWlf^ zF7lwYn&{bB-91=pUy~8$?xejAM&NDN${k`!3jPL8e)C_!o3%y%8;tz+0zi?w7$Jc6 z{w!h3Ki+ZoO|j4ikEbDgbZ|kO;DgX#=ZH3aMu#R=qY~8DajS`jSW*sHYJ$hVK``51 zR<$S${a7wC8Y3CC*hJzebFJM^O8i5VfwdnYTsL;GldO`j$4U|7b>jtO{^!F-CjTmx zud4Ct^-&=Y@OoQ&Z#qYK1+{N9(#%x;KJ1x)22)do`nT0k5=`RZZ8(Ry2L@F>KIOUG zPnkDw3?Kzf=OR3nmNSQE5%q3%YjSgwLZCe&+D$Mt=M7`_O33n<>q$9>|KYXkTj$QU zFtyZ{#WG3Zk$WqHqF_`!aw7}=$IG>UeHDbU?lX$u*rsBnm%yRfHrr%yHFQSuOf_uE z2!460t&MO(#KE=CR{x!+$X{9~Y@JaECWsEp7+&ZOPz7LwT~8TS`}K2OLzzy5v=f&> zcb4Tn_*s0t2gLJ6#6<-VJ2C&QUMk1>q~&zU=Xz$mJ}+|a_rBSLt8+YhuOB;T|2O%g zCeb0Z!|uk^r$K4{ov@odOx-~BfLxaImuUv1iL`S2^%3J~kuL{KxTlnKznp*99jwb1 zw5tGUvm0o>EyA3PWwWW`4m z52@!|(N3VaNs-5v+89JU@_q|Ho*cemZ0jcsDyKzu)8J9c*Nrst`sl*@Yj}l;lQT zGga69>GT!Ec!EDY~&2L80a7f zX`1`35&u^g&zZ9R)MepB@xZ$IvcPMxV=)|3?X;x(r~3CuiKfL4x4|~#=R0V5oDH3A zl39i0&`Xf8V!D$L%bt6i)h=A)@qUIAfuN(NTbB_=<(y0GN5x zg2@9fY}Mj9`f_A0KtVmhboD#iMET=d+d0P3D~{g=d_0^_{(ckRo{N7Z_C>A24H?@{r4Q)|XxR@=Hl@9@*iVA7=+q_Do}8^I@GwT)ot4(8zG0BvyN< zuK4kaJu_ri@QxFWN!qn~BB8%(&z7$CiuBihF9hitoF2w_Kcx+wIeR*5=;~6kdJ~4? zX*x4lw3`3_tPvsmrf=ZYQ7U=>YOJ+Y&4D;}pG@lVI${liJsWMkj? zUFjfvjOv;X&Zo(h-9o1g{~U_B;Wy%aX^^%VWpy1^65wGP`>^^ryZW!bG55`XO3~?5 zIH|q)`Pk-{i@9r;O#1gXAN?U?LHrFt?p^9fkO~bFk+H=j{@M9wI9!6@J>#I$lUANC zt2Wtoa%018rFji17=fguw|fi6SpfhqwB5j$qEM?is;^NKYQn>-n|RIg$KE*)e#yNj zAZ#if#JP>aueM*n8>dm3id?H|0KP1Bn*QXs;v{p0;-wNn?V!LrmN9|cG>p7>UKXzE zkCpIO7RUR(u79}YwMA;ZdKiWsosI4DnctD~n$Dbm;Ou#BVzZSakx@R~&2zJF;y5}JG4hsq~9GgIsrcBHk0h)@lL!fFGr zQR%D!K-$ykAyBX&JADhYpG`dj%o`8mR~tot9*z74>8oN~Pp3eNTT!DvY!%h0uDJ6j zkBogsj!U)Ckqf8rSnsYVj1&|aP>q_Iaz9nI=K9aPHXNz&Y=(cbMlW7v7l~9PBU5J5 z;%C@8^YRsA8sdFpsGq>0g(PhRkNztAj`3;a{yn0bJlZ z{YU1Yw14`ZZc^96)6X?6z>E<4<`yIRH6g23(JsghdkiY3Kr{y`s{FTm99$)~b%OS1 zZC613l2p}`+~lQIlu;)*)9rwJ8nDxNGKDedda&ET*}|Jmf`}wY_x&HUjhI1}Hq+Jp zcJImUV?vy}wmV&@22@MYk1X{oQ;qod`fcVQLP`BQMzBCHN@H@C z@1M4m8|X7lUx#<9HygDn%=C=KbPlSEN64rY>Fq{OzxU&9H052g^3EgX#istR*utj3 z-9`%}HmBA$7&DTOJ!PuS!hW19cy2FS$tz4P%lZ-V7-T&vPU4o_v77?^4wNW9%r9Js`Y}L7%|teF+nhbm z=GhKAu`}Ez-YP~d%EK;ngh!<-xMf*Jp3oS5B;;CmS3ZW=CAB2lHXa_8Rro)A35C_n z$FFMPlJa%IRB%=bE5`inBU!B-2^1V2fTKt@&)i=Zd=Z>I9HF6s9p7f9j|=#?yx{if zO$bv@>%HR-R*|lSl0%rd(+ErU<0xmOcE-ON$)GXD!Q24|>6j}7RGO7A#(Z%p@S-$z z%+N==_YGa3e?8YY#JLd{f3!;v(wMOs(_)R_!E3E|p;i5kpQx3)H?aloD-K3B)nXL6 z_Tu4pHHm|}`8trV)GPj5rY=OAjSV-_d8TF(>=yLjExY^A>%D%vmVTEhbI+`0C^r@G zYJNzhJfV^1a!1rRwkrI4PpMKTE`+wVtrAo*J&rxOmuG3QNKOxZ#EDf=3|&?1=Z4&% zIU-w5!5832HN0uryB+ys7)L*pH=q4iOX}s+!`$Ot{oQ!;bN7>U^Yh0i3)<%`z6&Ap z59Ci4V|z*GkJ!BknRD!0p3}|PA!qMqnZvcrmBrcE{>s@{dg#&G*&K@hiPKS6Y<~>i z$9muoGXmzAUT$8aIKgkqSC(2n4B#_812!k%CT~Wd?ULPVp^X&VhMp6uB8(EOPsZ+w z$1dG<_QOrv;3n|97*@Xyj=yY|;5TzR`>q`9p327dDOEL__oJPY+{+9G62emYfeE+B zVOq;rzy4*4GloMRX&v2i!0m6ABkT7pKzY>pZ^Mg8y2`qYs4kCd192{mM?f$>ZIQkN z8lksP&$8KWW{yq%m-P=9ie`5*_+{&hO^08Qra?02>2MfVHoPF(qc{1J7SYnCrGCi; z%Ln?jlEH!&tH%RIjYZc@BU1G+Ub@O>^$wz{V~^>7-X=O_qWV@huT$Vhrc-v#u2bSC zqVc`bi~!Rt7|)Nb%#W=Zla?xa%lbi$@I{Tu1+{~xcU&!+@dYX&=6pPfGB-b>vefwU zlcAG}$4KB>p5{z6yFi_@0trc2QGjQ6{?;edfmBV6DuhMeX>4;!iPVv@dBp#KPj7b2 zp%bDDm$kw;-y8M+-5dT{I@pp%)6WlMXqk+T8-CZr&9kxJ?ag5k<{wXb{$ReuGB?Q& zF>!U)Nrj*D~ZuOQ5=75xZLR>lquI%VmTjw2IV>Q&^)6vI~j-kk|NB z<10C1<(+2dcVSmoBSvUNKmqenmIrs{%8yrw`-hFYQgsu`^=srbORyj$43d!wr*$#B zzwt*15BZOTXMX9xY;fqgTDL$bG#*a+mqc?CI08O5Kl$cBKMnSXoe-jo+;3YzY?WU( zru)Bmy&cXQ`?^A|+veXxVt22W6sm0IZUE4k3`wpuZo>YvPd+k#iQ^-V8S)aE`!hmS zIO{8!SGD!sWK8fphy3^`0GcEXk$1a%#k+K_H$4~ze#W^@OF|!L!?OOcnmRdMx z<=3XPoiTf7CU07_nyc15{=9Gu%PN1Dk|=@0Qq245`Y$(Jww`UWUVJ{=5IVQ=LO0I~ zv7Ypf^oPkG-vOcImS=O@$Bft=Wpkm}4Zqfn*}X>9rm!O!TX5jE*^2O2N-sBUP@O2B zK87nsK8 zg{AcNzr^v|9Mwp)srP%dD$bqdPz|8XB?S$)p%`wERiA_dD5|sFe)`XnR=wUH9gNox zj|E#3!A<_Zn+9P_6&o)wj{MN~`Q8`czvX{rYB0ocm65#LYEBp^b{rUZ6;p$!=PQw! zk$RniwC)`P(tKCqidvrZf+y|muM4&w=G3}rr_M@8z4VOXkIZXn86rT^`W7mLm6Xp! zD!l{oq>;cw;ctHnTMJO3*%zV~5|UyZrn9XgVlwZjJ^YlqxbSg;k-sOa{0P%r_(NuS zE>i96-~RJ~(aC6GF&;mC%n=h6tR~KV==|L4VDjgjnc{sw!r#+{2l{Coe$MbAajTAk zJ9POc&9}WIct{Fbo8qbk88Ib>EdW)vJoy1^Zsq<$f*}YeL4cN*e*PP{6k5tT<>GjV zvx)tPIky|5aK9>h0B7Sab3)cwj8fLhC3V@6g@Oy}E1;1WO;Z0u@^uo9K1=(xq3tmF zphzO}rn={Qpw`SWTC6kCIs@{84Qc;xm>kgYS?DRXdUInUG!%m%iMq%%L z7R=-*an!p$tSJ|MN$4tAgqyNBg24&^RqCV_VJu63);FvAZW!gCU}=(^i#l$K{Hzj^ zPHCG{*L>*h#NLepc-Bs;r@*m2hs_PSZ%haPNET9pi|naaNKbu zwy^t1yH5!EZ4^$wq;J!TT&DL3#mAZO0^m|!8hAM@rvw4=;5Q(3376c6J<=VQ$fJ_> zp1Wm8o{!(2^O9eXx^59>b=^2DyqOQLe^SGHQ27vz={n&Y8y=HTJZzI9F|pvUk1HPW zfmlqxKK8pJ?{OjPCBF;W9PoG}65>Cp+&z5rnmkII+6u4sl9Yp=-GP0D?GM{pv1_$P zHOsUGp`V}Q*L9P_hMfS`&XMFV56k}{nFxbdV@O@ROEoVyy<^+IRy_tk!g<4U0pSl) zWc)&#AYf%eNg{|!+O0@Jsuux`BZm|F%uQHBmD$L%5-#9I_CU7HFD&5KCiO4?TqYFK z()d5U{L(PyU(pZJm)B@l%HjF4W=mIveqDLM{ET^;XOWg;BT(Lq_Zaj4OPrvzYrM2d zo+*}@&O)}u;U;7?-Ml?F{QO3a3Xtj*xk48w^wqNgw521m5BfJloBhuI8RiPJNiT0$ zB zHGgUK(`W9$$!pqV?qRIlX`{n@o4&Zi3_qViWeO>+P&`_0`-@ED+tQk~A2z$ch~hpB zXiQeLXnVc+$nQUE>9t*F!4Iuoa}OdlCj`!1avt^BUyjE1Q=PY8#D8u~R!{B2`5!A= zm$LYrW88N!z+^%tV8UBA;h03&4Cq~%$-P+5?Z>hDyq+jG5~OmT=3+Fch~GWPtkCJ1 z(44lhpK>y;v#i~i+Oze-`2?uR?F|YOrp?!~M5IVzVZ1Ah7+$;z{}y1Fi&$J|DPk^O z*dBu4@lbZEOK&7Xm0>i&H3Z0f(}0bEsngq3_3(e*j8V8tp(!tnR4+mB)ASr4Y_*8# za{-R$kZ0qsH@oY;lvb{Z<_xTz{lNws?w<0#lm@{z%`S;KG+VBTq&VnMN>sX}B)TzU zBU=R;D2(^^CN28bWcD0YY^_4zs1V2=n;qx&I}f3SNyv!Uc2?TG`Bi9YV%VSx3YT?t z@lUhSr_y*LDtr0o4gaAPkj!RfZZD3~)2csAPW(_zgd08Y=LfaXVsJI1s0At8)-88b zd4bU+aOBFKYHaA=J;)P*DO;e$^YP^WQv9K&R+n*yCw6L3CG(I@L6&(40^$n3#&S~H zb~swJ+1@%&*af_ZAWmC7+`r|fXskS`1wM>n!uWDm2b0{QpTT^NAt@XKe`}K98i_?f zZ8og*`5y;GBC5SaZV58Bse=8&)K)aoiY8!t`22RyideihT}R3|W$RTCyfxK6Qbnd& z5DK1+Mkn!3xt`9-{0Dd7#w$M^#)hvyA(OdhK1vJG^sa^#dVkAm)6(}prf5KSI&HcwDLBi6WPL*QKEdr)*HT+w)C#oz|d z7D%OrHw7bWYp@_EoQkx1!F2uBoO+%A*0-JQaS8U9r<^1~HoSUq$sU?M(x}r_mpm_(VN9PF(|INQociyTSMTWo|8ZoQ@OEKtk1vP^8Vu1`eTv5*_@08}7h^x>v*OSli-RLE?bsqD zUrc@EN5K1!|6VxT_BTF30Ri;PPtw56-5{W|@^6B1A3xnQ%#PI09A%Oy;A06-x>cGy z#C;v48RPZFhAE&gzVtNe2wl=qzEWzte`pbxm`~f;W+q? zO4!i)K8+a*5uJwrLa(f3=0|6(jm#Mxh zbOB~_2W?0FRp+PjiRNcL=1KovCn;2Cld%H@KCJQC(;mG)4;ZaacClQ;v;wdAsUAjt zV2OYKGa=c)^O`Q4kCm(wGF}wtbtEuMp(C?haKw0YzKzqEWH(LOqiWlf<1@PI)$n0Q zB(mOTf!%KiTV}I^_-~i9X}-&cCH``o)qi9dhDxbG)cQ8ROcgLO0dFto1k-8OWQq30 z?A_j+hTg+j=LD+rzs~(7xpMEAVd}>J`H0Ff_DUHf$?DwIGw-`FaYSs{mPLn!@dA%h z-ud(9x~=xncL<37`?cq{Ji^?4BATs|9RaOYXu}fbAskt5<;@QSJ@72=tIC%D>Z9QY zcqc_lX$EB{k)5iqsSA?@pL6447bUeOiGONht|r1UxsgT8fWEpSw0jZtO zNWkk7LK-SnQgG@-)nB5OBv=88LjW`6wUcOzqrFj+yW4Gxo?_=3$ zR6|H3)U!bQ&=j9cC+IP-XV`>&Y*sxBsp*bH7i?dbW_)8yO`bjS)R3144RR*Pt{ZB7 zO=)`5Jt(1`EP@2BPf~RwoSx5W=X0!5ft}IqC9)#mugF1 zc2gi+%Vd;SAgb2pHam_#@d>xohxc}RYmaKj2V-0X^lUWW(&TRjzDyi?ix3(P6{FIi z9Tkx*(ugoS8WWF-K#-9_l5OhDO$W(Bv*xPzKb6nt z2kPO4XDVs@Ga2&N1vj+4jP4I583j`d^;$0ZssFI5Th|mdt-HH=&uP=bl&s43E{Az( z_-ZH`>$6C(@VRL6mVu%+{4#l%?>&Cx&r)obe=WdF#_)~Bxc96@i}35jmaEI&J$3d^ zxD&nD5#+9=Y%#7MOz9alS??q4@9j;dK4I*petlo1Io+s7r-#D*mYx9-jhLJWg&ss< zf;th7PyF<`B}KSZISO;W*wi+kd1?i)TT)*D2$%Q!sHh;i=_giAnJZ9(P51%4Uzpvn zxj5;Dy6E@(TxFGM%CV8cFLHQ=a_Vq?-!`r~1mQY~bB|s32$Q_`vH8QZ?VUEgDaKJz zoAK(l?Ob9R63);a>2S|+|IZdxk?vfO1D294*4(R4XC4#FBj|BI{omHInmnyAjt}4P zGe!F_U245F^==tf^&?9csgBw=S5Xz>JD(S#i69$&f2+!+pHFf6vER+O*Q7yZsNGN= zux}Fn{!19vE`LnLLgPvv4Ee~T_l&z&q#0iazmu;7`3PDk$`OPEKe-Q*!@6 zWaB{8Wi_3BhX?nlE&G~97zd5=0Xvya%u2#ji;`48HNHvhsuA=C$y8{<%eL?+`kCI~ z#_ez1v5iD>euwa#4NrgTs@Q3{Y8Srmb2A6-EMlDZtUEo|0+gv-YEhWXz06-KJD4p4NVkO0af+;y*t0)cy|w z-GF_-ia+1enzf(@^=BP^RDI`FCf2;Qk#qtSR{tqZte<^4z#^>s?isiFwze2FoXmsn zHeQ*sHRiVe9Q9f``&6~;_{p=6 zFhRLf?=@p5qiLI~ly0*&{wENI9QW0M4u(aWNxhimB`w3Oym!xJDutznG`teM^%9-% zxye?_v(*^#+CJgjkkQebo>+)&LnP*9y@~fmUxt>H{(EQ?O zL*e(z8b$qZKCg9z)IBmOpJlkNz+h=8Q#% zy>i_9a`Rg3C_HbT;Z#rD_dl`-nW*$ad)Dmg(xR@vtIi*<9n?bpvl5*u3XrF9Q4l8Y ztXZ@Txhf|ULv?1scB`X4>xfXe(8jbH6YrrJ|8=i2_^Jy09F}|4@8uN;wIp^U3qTkRb=J5k`vVD)z4aL#{(5##Kf((%>1elb621}0Jmf`x|H z&!;DF7ilDYXijCmgEsd9C5Ra=NvXkmr6ZbU%A-};tYyM+JXI5uol}A&GRyI@Ahk@V z)qe*K*qBOlyHvsG_UeueJ;ZP8yrEo?A3J8{RD+&fQJO3&oUQOufxh-kf~zoR@@`y# z4rAis@m_0DbcLq37-&2$A{Ah%w>`eNzilFu#dGlN>WNgTZ&|-at+mQTP~pAxZ%BM$ zTi{7()DRYDTzqbDuU%8E$)%0P4Zrmum7C5q{SBu>EN@)^5R0iaFRk@9zM@JswrwG6 zY1l~fojpEJdi5!;_QTqbrB1rN6u9?rTxa8^r|2i7RrhPb0B{h_*#^!hsSVhNZWH!0 ze#)>s3XbZ3Nbb%Zhzt=MxE>ca7O8XEy(Fk|a*f|eF$k5}ayRZR)p{+6XlbWakFn;N zoLYe^sVVsf5WHdxb!fne&?>pF~X!HYl$QElF6i&Ji0$1N#RF0fPL zx>lL{i&u|m!=<&gUtxBfpTkHMNp;b`_@1}Ib=c5s7`Dl6<7LsnY9d2TjAFiG@%n1X zQSWb0*ITgg`=MDOg=L$++*}cmBfaJl+W@F9*F|IMzVwq*K*Keg=^0?D?3$Nv(P|V| zI+$X6C4~GtZ+Pi++}gE88EP6XNU=ojDyR|3xnc>75G}|^z?XjY`>x7oN$r}XOe!r* zP$7~pyjiBd-S*L!?Aq@|vu_k<7K7A;9!5ZO=k7%|(e&JQ;(B)NVOLd&45u&s{hiY^ zPoGDuFw#!p>Pq_OcYvjH#QKNXI71zOiM|$o40KF4vYGm&pST~2^-iTeIZ5ylwWJ+!^?ZnIYC7G)l07e z!n^jBwFBDkdCUWUi&?-s__XnC$lOn(?RZM4SN`lAg*Cs}n~(Eo!DsKT&7rJU!Fm<8 zOl#Z@4{wlOs?ab=*4R8wWdK8=6)nCjPQ4e3k$bPaN3%a=u5%-*h~*AV@m=K z4OeO;T1@BmCyshE=MT-i&Q0dnoqe`Qv7GI@+Su;ocRo3RF9`5wb+6ZGq+ZCr8G|tW zBD{pb!oW!?^yw7H;e-1s$%|1F#}pP&vE_O5ht8&B>b=yP^$;=F21oRxYKGqa9nS06 z>mCz$fd2;KShqcPE)*y327aNSR#SXv$-?2>HYWHuhnZu8>|?h1#K25G9ssin@P88E zvrTQv$dSDL{-k|-6TuA;ujj_-+@PeFWTGm~nFrA+4=EHq7MEU1d0Zeq?C(!|dMH^X za_zJIbuvJ!dbH0mj$|bY`QbBnPlN(A<&Ju)db#BZUa)sKrGW{ukiGoT2V+P} zOPF)P(?v&5(=23>6z`vLBdNsl{p$1B6X7Y+WynKPp1&DBglJ!>$R<8(nY=f|r@3og zdF_Bt6<%&t2f||eH5qm0qlF_UG&bN9NwJZrj@+P6axGnUX`N4*Ccqbpm^rqOrBCWH zF&FHF@MnIM#OI1KKKg?-k5~v1VDtfF=ndmm{B(`{#R5az)V&;r5n*y5N^dAeLP_Tf z-Y{?CX*^Khu7&aWU>7tC2}iwcjMA;6gun6dz-vQY?nOLxroJ0`gWoTKqAJez7D?Zy z7I1#eDj|U1x9m@=LQ*Vg3F*DAj`@}1{!Me^V+S>A&wZWS14RzG>8aBQI7HHVPh>Tr}{lq<&vU(>Mg!pJ2SV#N zu$yJS?iGN8%hcN+O2rjmVOs(}jwHh~*_^NB*RXk#uU80iXm3%01cJ9f;z|JIIC0ks?J27B+nbt&%};7+;m zq9gjrwFLDbUS&z!`04>`<{*`jtZ}(^-SL90Dj&7mfGn;nF}_qDUx`DTjD&|q@@5yu!$Ndf_e%+mrmZUK!^YfK*elSqU-)KQv6*70vQacKP2Z!jc^7Zr= zkHBbQx55bHB`m>c)={KD{;^2+Db@Se=KR0NJ*ULY8?`CXJ{E?av%%#c2}?r*Zq%1# z=7q+b#2G%?IIZ>=yldAxUfxM-P(M4(I+~}d%#8Fj-^|5`KRavlR|wpN_+6vokdllY z*$O-qiuvn&GWvX0ds-*?bpJrwYq3N1q~9<%$u8GlOYY$F<%9MEq073KqwFn2Cxj90 zoNyC25Cw|6w68?GykTT5QwqdJWKf!fNo3w@a4XI>kXnfdmwrAayT35zd*UvC8u%HC zWEY|8tZZ>e)kIhF)_R4v+~pJR{WAo$!S+WZ+;J>Zb*ndbdzYP)FV9eyN^)oV?QB%? zyIglXVq4c8cVmtMjOsT*LAXzK*(@u%AXk6+uGTLm3JIiSkeBrgHH{!6tS^KI+x;=C zA2(!ayP3%Y6((Q)t{eFNX;`YzG*96f7#c3w3=()+%1-Zf3_yjpE!RmbVW}iI-$Ju? zFe*{}eN|3$`6PXtAp`IB4{QaHfnIojU~^(Y1LhCg=A)aPf?v*K!MuM-Fa{Y}WZKR` z+DSRK`Odu}3P%(FLE9hKOzVi25PNqG!T}j||L;K4b+O-lotY^FpYJZA_w*(`JYTjnvbl7@!FE+@_DTGX} z)9+Z?-=|ZYB^4zYh-Ld5X!FMXqyLT5kSkWNd@M+LNn08-HNigyG7=~*hmb4F`n^gg zx0PMKF0xH&H4<=2sh`&#eapQ!r;}#XbFGVAfdb4FAtT}dLjwKA_L6pKv!fy^)2|8w z-t-FUsz|*g%p9wS_@9|eND;GZT9+i$@324}M#@OBSq#do$&c9J>Sksbnx2|MMq6#g zg-J%6e@&s(@kx9n+ux<%nq(#4Rc`Rc&i}!J zjsk;p!zkiie5q*QG;V$cJ%NT$+bnv#> z<9;2n>2RlGn<&o1D#ezP`rgXdIi=cmhD)c8&1PMbnre!pHKQ39xd*#vO~>xvhl=2M z&$aI_*XHTlA9LTUeOTju%4otmW=Zv*Ha#z|1YK1j=->&VE}NcbJ_7j8%Lo$K>W-xo zJnM~GN0_9~d-ZZE4$ARsX5B;2O8vmb4bOujCxA;tF6?c`XD@I&B6@mY-{tX~)j{@R z4>7V~lL7}dk^(_eP`@ytQWLTg=)XaOdUQ~<(AXPPNa%*~K*?kRvB?8yBQa(@ zYvCRdg;)GfSqe63<&mBF8&|AnCj_Vl4jp}LW}5^M?~+;g?s(!P98-54eOBbp7XuQ7 z0`Sn?;Uiz2L%Bm*uL0;hpR+f?2P?339+xD4YH)IFm=lk=TI17AVQ8`vH)o}RS#QO~ z&6$JYUE@Q6O~@>n!lXq%(&!1y<7tDe!Bm1e@IQT2ffk~E@*2PS@@$=50%dX z`9d_`09E>Cwx8bosPhuos)+L^=Sb#n(8Iv48Q`0|9biAi=_aY3RPd^se0;0!NE+uf z;MFg!#k*|V|NY7XmLF;EObx^26EOLzZ=B&xzBAIT{;hF))m18%FjAwJ6Fs)X z?5%9)7+D#|Av^nb`~Lp(hw*rv^FFuNeZ8*hd6|(2c4i@lpQpEtodrg`W=OpwKU6m%{2pAv z>EXkFn0w%Po+hCz9p?cT7xLdL5vAuM^9Ry@$yJd_ow2GYJ9@|DQQKk4Yp1IJIcjs1Du7BrPZ9m67G-#aT^W(wc zrSjnto~(P6EUj7!(LQtrzPD(wZjgT$$5$du=P#p>_}kW9^bbmU@?>fW>zQ?Lp2wXa zh(X$tY-Z9jGVOIWiR|ix5Kf=-mTuEOM=QTNF64P-Kof>rhGKZ3%txT+N+H1$)tNIe z$8-24dt8RJU3sWWu0J=Cs=G<^sqp5`Ztf;bqFA<zO1!xos)w0|$uRA=6$GBBDp@!NJ~<(8`yw7C@ynuzzd z|7z3Zyyzo+YI6sQXS#-%TVx)RT*y?#*aku09GFo1m2jFXptDMyMF8rFeH$27mfVFT z#HLO&UJu&+eAYzPR$VPEt2(-^vi4?ni)k=N9(a9bp6-tHUCK5#kYyXmYfJ+t1MhAH zP^PWWHQL&1$fvhFf%QT^35E|JK-a^#;gB%#2qlzHu?7gQ1df9~q_CK{!^NZU5T;YtBv`!Vh5pn$SB+cq=-1Fk z8Yp*MgztOjP{}x?y$?jbl9=wj$+zpW9=v_=TPqg6J#QB4wAG<oEl1NH|<=*d=>?ab&^#&p4T=(38Q=7B_EF1Ke{2P`DpU$!>hCPcl z{(y|D+x;uPyQ|-08iS16Z6}u-?plg(C%+SqP1L>Z87=Cn39h$`JD;)^Y+{fr>7>e2 z4!6pTEKo7Om&lkG2tSTVb9@;u+xTyke2^bU6XNmaYQF0gr0*E}bH6XY|3-=hrMndx zzn7mxl$b*pw`Ke7=|Y-_BfBJ7&)24idO&D-oYW`GLZKI2tIdOZ^)#$P5y>10j9A*I zor<1BwnSeJ4ta69yy0hWl13$|-)oB*Oot_TX_aA5%nh@$4PxM9Zm>XT>q%wr*?a2e8?SOx2rNtSI8<@(;+0u`?gCm{$!Pt1YX%Kih4WWGU+_`e1qpJ0}iJ*R&y9LRwSI*$-)9@!jbw@Xo2FDma0&f@W1kLWz?!hPUZA_%#P zV&Mw076zRPpEzqq<|3Ud>Qkq0G4@n$KPSLgtt<7EDG&2b)hLE+wbPztv|bUNe6l|2 z*<0@jbm-}RIAd9BRLj8)JK=YXPbn8j8zQ-jJ~d)~9wVNZ_+1lUUX?K#2`UtBh{PPm z)S5T?M`>3={&4K1-nVjGa^Lu1R27Wrc;;g_haTeDs&$*YpCRh;5duB#e;aSU!ZGKx zpPIGz^m4|df9K){+rZVy(@@3v^IE?F=J|8-fU9U3&cxP>;Huq4v3|CTxkB9MMSr7c zmS1P1R5-y1;FvIH7;Vcss)Jfd<$QS; zZYj9kSinOjjMGiA6LO9gjj8mWa!$( ziCK?5ryhxOj^JePTA!YNoJhJB>fD z$&Wl*`QL=%K~$%%F}2__R(we&C@o42yZ>5-SK-HjiOMuBf6sN9sY#N{epnTlW6G5? z(qOX*Rb?p^`<-hFuV%mKXhnP@_=F=+VF9?3uW>)FEmce8pYL>ae2-k?D(K1nHhQ8p z8%Aw(dTt!=^hH-h^u4wfrQb=l8V@dE;*Ke;sS3K;1#ZdWw$^1jOSi9)2Fu+N=1=%a ztjy2@9IjEsi9dhjr`yv|a0UEHg~bRmk!PK$fpzZc4f)*1Kzn(#n4J8dfAwvUL}~g; zkn+%Kyi(!4M;s{+WvzK->`d=XGd?T6Q6Vd~ou1WtX&Lf#OEhhcKrwZI>6Emj`@wo5 z8Fv=F?{)DhYW($YL>3#t$h_)Z9PjoXRx#9*1NTq%LDMiWiVktwff*0)2F28)O00yu z;11 zdZteavvrmH2qWoa&$Vzc%u;UIcsQ!UQ9oR}shEL1h-By81q(miE;2W|%R1ZyTP$M`8NhEFQJGt!x}OTk3MHKcubF z^YWPkJQzJs6ym{P>t_;*q!_=`fB8LE4IMQ;YSKFtZBcKOIF#fn`~(!p3+?<#f<2QK zW!@2{ghO&P5I6tyBbyK^c{Z;Um%q zZV_1CyL}1<;ZG+xnTB(-OkXuNj>#c2(_U$H92PZH0|TFajw0U%tZ*>N%Ue(3udc=k ztagt4a@y~;pw(H5OJ*y?xySom;*aG{Oi$+y7SVlmp$|W5$hc`+IQ6)@d;qQ0@4T>H zfBE(k=zOaV`SawyS52v=&|~C_HKb;C&{4q2->2s(uJ;#s0{yl=)X83|%(R3=lr&v& znAZ73xmwnl_D`nvffL7ZPD5#QNC?O9&X@$=b)#2;%~mz26NG@%{IJ03K(u4dd9@yT zre}KkQ-j*iX8G-Xp1=M5e!Z!sCQL8=wFV(L< zQ1-9E-n98V7nC(Ly6LPi)F@%$Mdg*8c)@W&z9b=~KaF>~{xqT!;sELGf~5MgF3&&| z`dvkbuf>^P=1KmgUR%#Uvb0WQzC$H|?orVDO9&ognJ08|lU?>`y_F&ERSm?Dm$YNn zLXVM^JdPUq;8vP^b>zPojo7_5C6l+aInd^NQ-Gy0lOQ(*yrx(K|AYvpya zP`qTN5PvZzbFB*aQL^)M=mdZ6cWd?>T3?s)Cht0v#bB?p_naul=2x8_6XG_0t|Cv+TN5#~e;rs?wwEdR0o1o`HkZW#!vUDc^_ji?-HBMu@`8zAIw5csIRlr>y?oYtxjpn)0sEo5d%W*QfNG z2@RUu^wx}*SvI=m>6fRHBT^iA$eKIy`O~SZ39z44g`V%<45rF9NSq++x1Ae~oGWcB zHbZ+hduZ;0lg$4wyduKWQFX^k4Txc2CZQxE{RHFl6w9a}s4UrU2R*_hD8?ms8`rn> z%MT}ql6*uy!}+@e1N~GSS9D)u7b2BxS2+!8Ul`9x_{(ujn8kTqgF;Yju@7 zrafBDPRTBxD>{y;^lCs2x)~vUn)ICw3RCiVr=yCS={y6wzk_HX3DGp5RT`f23@Q`Qap79J>WqY~m;qWF8z@K&Z4&#KEUron&7!a) zO@76}4=gv~xRUIvlLYmKX^vY_^qrPTeg?pIqx^ALz=`Re_H@>FwkaLNWy`wsv0>bN zp}9(U(@O|xPY+Vry3TP>-(7fJS~do?%f5wNj&yvlF7MnED7MzHwTtE58unXnaLRPc zs9jK_%LYmY$y2%M&&cmNNfBfpt6FXOX}n(PdGG;wUCf|=s7v!c&c`hD3=Ea^G~j)x ztdDav(wZ(b>BPTQD%a|Az;3M{f&L=^NJ(c_pI}Lse0_?1pIo?#YW4pzAQEaQ{c#50 zJulrgp_CqM)UD-dOjmW9$>_DRUxWOWueBA?8xK!uD7^^f#gg>|fta%J`3p}2dbXss zZqBQ?$nC@}4QZOZOQfquN67D!Jxb2L zx!rqsi`p-y9%{MFi30&sHd7GmlamlL=OB?SuoPU^s3A~mfPMsoe?9bxOhM=^$DEJ2 z2BZP+vK@cmp?JURXc=KUXn>`>E_q-d8bar%%d^)URVImKD&9r&j57 zalBCBO)1aLtlLloSy3f$!}2*#{gh7EgepzTPfr{kVE12J^Q^PCpCZ0DPZi+lc^ctf z2y_qB(onuka!o(JL9S3He^u5p{bJtMg{`clN8~d)2~dWRuL#EVn7}ca(g>1~44pkSxlc@@gkN%WiR4bn)4Wu8{|; zZS)PA-`vSCQC_5sAwdlE&Ud#Zo!d)7z2%rF{c@U0*SH@d;%uantz|SxURJ*@4Q+OE(nztU@>yScqf6u^0ficT!;O&lWth#u?%+y=hh zvc5i+WcbM@pzuzW7q{mf9|@SbuS$QPzVHHE<@UortL6;(!*S~s+SS8rRl}AjhF+gP zm%t@n9P(YaifUnahlcY{I(eLLO|t=voWWSQpulOgO(qGJvS0Z%=cJju>ZiStSs=#_ zTx}k-VBR%{a-wxh?DRvYyW`#%MmQ8>vnNMxhU;hzQV~nt$OUK89aExTM2p5z_PljI ztcGTWmiS2d{~oqel;2J!7J05v@+sM4*-La;D`P&e29ihS45uxP(a8{8@-g_WRb6JF zBc{z<$W-|LBiYCP`pg$h$;*eC&VTn(C~-5)mo znj(<^6c?d%+YrSabdS6j?3|AkhLW00pqbUyvS}u0$mkl$t9skVYcZFXuM@<`>BCx4 z?+A|DQe?$9I_ScBcik9PSF!*O;8SHW8Vk=bk5mU z+OO_L<0`h{Fn?*~hr(PkJb%mkI2kEnEMvegePtg%KHmVY9lta@3%$x{)ETSs?B3Pr z>h~Pz77Xz$o{KuPjNa$*B^R-ZMIaO+ovXjvBQ@~6{}<_(jv z^oQ=pHIGi2J!yjDjyC=VB0|$%Uf3-(yc}}#YS}CBA*blerM|ba7P?En@~b(qm-$GB z-?4bAx5II@>gCw;nHKktDPSp|p*wC%NTPM~*?mjrC|?XrRl3+Eb=MNxDkOSR!LtKCdmW8%_T>P;EmXt1(z2eme+)O!>9{^1Qnuj zc~E|-B6CzU(py=*h7;e%*9+1bBTVuWZOMYx$w;rw_o)}()#UxlyTf3s%G7vt#VuD7}g##)S00orYEpuHmqG5{FqZMU{cXT z;tML4d^W@~4RT@Y$-unAe7JL)eSOJSio6Z$KfO(uMYK_YS4CbmqbX*EifSvg<6EnH zH)Sv>B7O8>zJmiN^!TlzDcykrKQKP@nFU)FZ%+g&J^kv^rf((kY;G4VFJZ>Keez2E z--v@+<3%H+pyyzQE*YjWVKZE8h3@*#E%%@OELb!~%>^N{`eZH^Wr}kc2k>-JMR1h41~if6d4ek1B%G_0_R4|> zzIaNkd8-=QB9p9<`SA^DCZPpJBSqR!;J5Y}O&Cuc_#tWNNA}^n+VtmM{+Kdw&2M)X z@_%n!1-<~gT>F$coCfNz-{iv5dy{$m+Q5MB0Lt17zO|pJE{TXN*-2M80>UdJ^ZVrp zk?^*DIGKN6w` zh3JA6*XT>w;v@IYSCSWAxkcvCMN6;CZeI!i^Ka*CvZum(1!B$WtTPuCQkQ=_s$P13 z-g*XepS_EjbWf?8V0MV;6N7ht2#*1nSkL(gQJQKS`M4SQ+@E-J!G7|MN^o~Fh=C3& zPUb!!9CZ{KhNK#oTHFg{z4l2?+qb(fzxAT_$N157LeL8!ig@UIz%rGlZh8WnIqYS2 zT&`{28>YC-+$ygZiY_0&-JKDotJuksN1eD4yrJe+c%-hl0$k~MwS+{JriBk6sk&%L zBP*!7hD6TkS%RY6f<{Yz7s(Y@H&mu~)iz7&C-EilA_EXrzzJgR?;U_C1g`fGkcQKu z(i5`=wQI(O7kJk|z8TQOT~CmuA%rc^OXqy^0!l1`CvnS`$W-i$XHDZX^cj&GE3LyZ zn=Id__#v;OP2Yf{-?q+J=8Es-w8mw93&DG1dka^m9;+E6Quii?N&{%-f_S-cT; zs-J9bDsSdI~uem zB#M^ggS^#e2Lr-&3qsR_V^BS$(tO@M5DuyWgW!a=YsZ! z2*^8b*3^-8MN-6^@Ze4vC0CQ-BberDQiBtC`uhVcT28UVVVwZS5+5c*)!x*v&SrvS@`N{VQMuuOpbuctPvW@ zj=d4%LJCY70p~k(6${08E}x%N?z!G+*4nxsB#9`O=22z3xAKZ0kH356tH8q_y^WRvcrkMu9^dFx}PM~o8(yib|%ddzt%eMpx|U$tZkcMV>Im&B3k zZI!b<+4Gs!n#{%FnG<>`xtUL=d~PeJgx(2jx5+TYe_6)I){W>5$sh7 z`Bfa#-w|TIe>p+_tW6VZu$9|N)A%_Gr0JrX={i^gmxdrtX4lXEZqR~)6XE3;dKjhu z3juUUf&$GxtrKEJUvQBwHZ&f?AyXdJj&+rRA05vQ%ZL;mGwff0-uS?Hi7}S9-JkDE zAGxOWdW$u>u1ChwSr#r(!|iMbk^N;HMJ~>tJc7>5_n@t3J1cG;ff=p~joL@s==;!t zy8i6@m{Pp1)EZ`Z(2&YZlM5)K3a^jQ+UFD^>||NHfB{I3j3XVDFIZOl6{nRZpN0Gj zX}D5ltq6!gv7O{jnUdg!aTEhwf!4y9+U*a%uLUc72Xq4bkMntUD8r7k{hEzgLk~ol zJ3KT`$OSYieW&vG3j9LVvSg748_N$Un+ov+Kd1h-3)^!)G*<2!v5IW z?Q!^5Qu`UO(gcz3{M$`jXqZXb502n?YO##cFZWmGX3z>C%r`gl<+F2DC5Y8aj?8_8 z@tRTHw9F*~OXZ#UA?vTMf6l zwv=%S9nIz=LL|!llY{m&{-6MdaxMF=WQ}lMBBB8~rfN(uTBeF=LMmzq-el4@(YvSt z?7K6b(-t3ALcTAkz}2N8jgu|o7M?VL;?=(!BqxJutpG|fyLSHuMHRUZMIsNOWh_|F z?OUNml<9n)BNG!eFugIzJ7k*szjev^+q>;2bL(%$YJb%iyfy;)I*r`11&KA(ukTZ4 zfjRSWw`y`8lw3e=KDH6h<9OMTf~%qQzF0p43w>MWwMxkEmfz1+TRlnt`}yN2{2TKJ zb2s;`MnUdL(%M(|qjTTBx-eVdLzP{?-r!;iIzrA_|M{kbnE09Q%%uq$!G3nmF-l=L z&_c{T+rNjbBwppKlFzSy?5MkSU_~7{EAJTUo6h=e>*Gb^{pmss0ld>r5UPgCf70=K zhbiDt6V;#=D;mArzib~^=ubH>CJ0{ z16R!Y+TdyRbLf_%njkpN^1tq1A7^XaWXkbr-qq^R6ePKQfn}5IrP47_KB&ZkrCe%)x_Hpzohw!(D)U70~1caWWvie#P!VLc}Eerv@fJn+-1y! z-tbB_^BmZ+bK}krzsy^gzjWKT8}5MhO0+pHkUJYsiAgJ>qjpwO!eYeZs$R0y89od3 zAlA=uKCopX5ql*`chm=b1To9wd0WT}jWsyFrz-o1ZYix7g-s^37xhJJe&UeOGn&s4 z5{8U$h(uOJr4bEAs0L?wot1MvwM%CSIn}GCbAcxYcp=sIZ4Uk5bP#V&jFpp`(9;V>|hOB_aL2 zU6zOSR0HC`m#k`g?4^lP07Xo^wYCmbW$bGThL8q8ED9aC@Fv*3rXYm4O3Cr9VU~Qs z&4;`ba518Y+mIF2DX4Gv-$wC+rj_?Zj$UQ8>^r@4NiY@yigxlMP+b;>bG4pRX9aWWwt#97cN+@t)<^3N<61{;won$V940Y5s2w%1la3an{-TtFw=pS$84nlF$cO=`uQT5T5l8@Qn_N9Y@LKVu8W_?ifyw z_eND&bD?Y+jA3BAJ>Hzo)9>tZCkyS30YK)-V#!8rAY(0FE{)ks zzpp~g=S@A$81^H7(OL*vY8RV8i7trkDMRWIC2^}PY0F0@=v`GLGYSvy>Ofsd-mr1i zSL>I`E(}2!E(9{uSjqXf12kS1&ohV?ZX=iLfhwOJf}i~J)Z*=0>ax*A1M-pkL0@i0 z?zhfM^WZ%@#~i89YV+*YNj_nVoe#lcfm-Nh|9n-9&q?EawfoV996I1!wC-B81XCAy zRy~=!t0R!4RIqAI)BsLNIN?1oQi&gZN`uKfB-TZD?Fn(O>-*nc>H;`)M+?DiI)0p; zr=J)&B@%uGEP#BeGS)RO(?!H6wwk?r9q~gKv@A1}!vj5pAg(|&CgPmfW z;c!ch*|2){E|3HV&5Jw!+MT0h18=Gl_7eVKX;RQ^dt`7p%L9?ZsZM?bWr=Cdqw^4qwp;uD+xcc<& zpFV^oooRICdV=}A=$p4y#gqJ!yw#$kzA{%oHl)03hF`XJq^foPe$#_7@9zx;Z}(d@ z`TJj3OBksH(!UxIqt=Swt~PAy36Lxr7;4*yn3a{WV@XEc(O-dKcKgo~AZCf29eCUT zZ+;3Fr7u9G9uhHg;M7b;TG>Ehx1CYw^5N;bMY)}uUWv{%0rGKDLv;HQ>iXD(CwFLm z@U}GYa^KPZ&!up|-rnA^6DyShyUV>3!j5|${l5c4q$rq9L2%}I{y4S}?Syd>UE0@N z>@sq>P*BT?xK}fx`7X3v1Tdujm3DY=w0Jl%pRMQ{BwD=O{!mQjwl|w>zxQk5f}+ZA zC%?*ZKs4aO-Xp0QdYs5+XFY)G%V;~M;eA%U1`jeh>E*om?nDeBQDJSKdrc^`s$P7c%C(@Cc}Fp*55?Hx7`=EC>i?ENI(LvNpn1k`}CZqjyIv=(MIy^cj1}D!CG-T`qRSAB#cBNU{Rhw z5+F(V;@IL>EB=p%wPE%9!M_x8kS6m1v7K2*1Wd?s%1%o<&ooWwdnbTQM$ebxQeYq~ zr3O_KQ9=Xj%~Gk8?wOJF#pn!_{Q^zIG!`;M-*QTJGU+XB@_Osj7qbR4^Lta9n}|x3 z>KUivv)xb5HI#0aT>0RA*B=BQzMNQO^?^xLGOV-%80TIxF$^+HhG@jV0r5E!;$Rsa z^4vz~n%tr^6~K;r@EpR4vvXGEBhq(sB}(xDb`RUL!Nc6P$i%XaCtHLT>CtbPt9+i( z9V4+~A3bO1cZkmY@G7!wns%|J@;8_MUF-k(NW~ww4dax}T$6kwy2COE=+uvAKfwab3P%>UM3O;sQ>!Y2IS|R<*85Y1C1o-z0dbS zmxiw=bE@8F%8g3;gGIZtgXt6`fgdPTuK@Pv2_Lc%NYOP~Ql}sL6aBz|>u`a#O z8@S67X@NC)Hi%aQw|)QE?x8EI+y{UQ=(db_pcu*gfGP&JHJ^V>KbNWpYCgrSGwYNm zW~7x0uhkXJIo#;})Um=}8D469tF>@Q1dSy(7N-ml%EKT3@H6f-k#e!(2qVm#_pKeT0DWf4pSJ0 zIdX$LF8E8bWtq22w5C5Z4CHN+w382vHR`Noz1hF9)9_uSqYmNEt&XD97B>Kyg`QS| z)w#J;P>)IQzCZulzT6;U#R6Q7j^U7>Q+u4lw^4xFDL!G61lEab+>rd8`g5vYdwHnHfI4MqQZ^f!k@fHpy*5x|TlC+1CBLOpn1U~0Ega2QxdMTdzWwz7O!*u2W3Uvxd7 z+)99AXPPf@Yo@ro;m7y>GE9@vGuK&8%}KXUvgdKFX{2P9&xQ__dy!|YpLz~nOL zI+`#m0QMz76-0701Mc?izbD!AQ$}8%p2!3xb5COA-+xd8gocEwrtq@oQJL zcpMTr{qi;0jRGJ#n9@!qgiyPuc)$NfPzkJkS@b?#{|UWGF>iBhEnSdlwR&W#TBh{h zaHOR-Lj({#WJbx!qZYzUW^JJ~BnPA9m$$A{HS^hJ6KmyKXj6@nkFYb3gMm1))0NM~ zb9>|9h}iVX0QI6x^i^t5Vu1a$&He>jpteVMWi_UoRCWDk$ZVwscM`Dn6W&^axkA~T zjgx%gul5O!70@#_r;X&!AwVqewA2_5D7jH+o~?-nYgX{_X5Wedr}nlIx~pBNW%rcdy5T5PMj<@Qi~Dl8_=6Nh7tG6^0>i_cUEmmkKi<-JlXgv9 zd<|bS({RpFGb&eer0D*T@mS(*ucYwWgXU2g?zBU`NQ==z(0@~E;MG#fz$UF4o|N%G zVogMS(kjXC*@65HSBhT@nt;-s(u0MK;%0-m_nqeA*A%(%>Z0~_>3+%Zl&P`PY(0x5 zhm3jV(zcs&=Iiy-K_MR99^LgY$_Ss^d1dLkCY-&DV5j<0t6lz|1544w5tCaFQYX<^ z)}6&I{Xr5;oj3Z($snW9g8xU@>AN7Ar-2hwieb0&YfV!1ekO-&k^b@>;TzeM@-O3w zk&f#IG@q*NnSQ+v(ngwc8fW@QuoqbLt{wr4)lT|syheb$UZ;+QZ#i4W;(%b_KhXSYYzd1V|Fwq&|i?a zv4KSITn;^?bKYVH+z5ZXn;K#g(>S^7G?LL*pOiK;rPWPUfzT~+%48B+*)Y;M^iH5| zg?U8AqkX$a_MCceoy#Lh^|-}qey^ZzAi)jgh>P{Da$FX*#}?qKoN<3x)E>i=%1o<4 zB;L%i#MFq=voj7l*uyz8&;-u8H7d90bqQS>-@@{`gCE>`KZD~Ox|UYE^QNSEDQ1tq zsy6_To5{_&)T+|Po$Cxd0?`$Yh)e6+TorH_s&cII#7SyW2w@C`G}B5y(1PuFlVv|! zNWP#j=Kj;5<2ML5PP=WT;6$mwB0X{=#cAJ^6xdnWrDtb6+^Y=qZDYWHKEALEbMj-vbq;haz$)vJGLbu%#CAT0I`~_ zVk;MBBpJ36LEIg9w+5wO0DR8p8v|x^hU*F0 zP`GCul|{u>ujk3ZTI<~@mrX(3r(ZtO_RA82Hen|TxwhsB+?InDK+_Z!Qj<@j!vYN! z7u!?A3{sb)IHWb9X*6GYF=f=#M8}k@r-{nBw+q_3fm?R;n!=Wz5#Ip6cD@Nu;>9ZC z2?J@T!Oes!b-;w46vd!|mIp=(kTc*Ib!UH?7zI`j6_0HFO0Ba|==%%JvwTl2Z%YN2 znrEZt1%%hH_lQg6qwZJn4_Y9cMFJFWtlM`A z%nMmSq8KGNvUk!<%;Ll0xrcMy@VFdJxGJV9Nbv=e1K4*=dlRD`3|nRknb?6nO+&O} zY+_1%ep3FcU4L7mdJrujO@qB&e(32JI9gU33V(5tW%J+tjMtzaGYu3FRwal#i#??J z8!nUz0+81XIb!G%0`hx-1N_z}&S}aZh@O>fDOOJhSoIcxp5TRmm0oGSmLvIQ!E%)+eS;zkFVM$ngu_1!{f?r?cP|x{%;=iDG}T zI@Hpy>`5RIP~$> zaD<$Z99EQ&PPSRaup9cWmGOY|fxcw zS4^af?rK1?2L|TWknI$hpwbUJn#G+k1)4<WE!L!3vZ@9n z8K=zevfgAQM89eYs$$%y35+_-RG8kK`9^c;>!b!P@$Om1{+l|+F7qjokM0dWzC%L= zXIe4wn0zL<&pyw-vTcYCi@nv0V&7Kinql7-{EwpC)chN3oR5{x{((tw$QKI4$_K#D zjR=i5=9Eo>9jA^<1b(Oz%FiRbc!N){M~>lYPsnun<#ayJCmR~xB~`Vp z5wR=f0ED2~5o1gU&ldYe)p{eSa$Je>p4iJ92HRHp$ShXUQ6VMF6EnS7gHtA_gG2W1 z_HC5L*{v^0-e!Li+%1JR;6Z%roG3`s~ zn&dJqL;tc-OAp`)!C;SZ(kSYB^wDC3t{nC_*lmabH2)0E{H`L+? zwQxM(L5xM6Xh0RzRo|tBilwt+q-Z!#4rD^~ay}31p^c7ulQX1G`~he4tn9e&nq9<5 zjMC(ILPzB{VukGkg4XN2xDcJWV%222{C(FBav8gL9z=arl*A~{tu40^_@z`hG-(Az%)ubPUwK(=nO4>Q2 z51#iI^~Hu2<-v$ak=`1f582qCej(!VPH!aUBe3J^aV!%iba;9vN;i6bR;_S;OUl)Q zndJ#O`he$im}Bb95st53HWHHR{Vr|bJ08ZKipWzv8BfwK{_oH<6W$xSi)y~wROOoSPSG2#x|8zrdNc}5Rg@};*>Sl!HMHFf*}b=O z;x4mTLIjmQqGoE^vESrF59BGGn_9xh_ot#-v(J5LK>15yPut6tDF?iA%Z039dK%5d zu86l*R}+mbjckN$3bw>;>yNpppGR?$jWzt+)AP3K*Bk7L^yQ>S6Qs*x9y;2vVr=Fw zm*v9-1-6XEx1&&^~sG=O!uGYu@ zH|V~@jKXi3&yUBZ+74zmMFI+3#@nQ(0{Fn#vPY)`V-*p0;6wQ*^6UZLxV*)~%_Lxb zA!0t*fB&l$T442a(PMybEF*3-SJP%sAY$Y$YwXgvXw>RoE$UID4w?}Oj`*6Ntor7P zf$0UeL16RMx$a}GOo{^k)IF?$fdC9Y*WhNSN%~vQ}^Id-KxO2&oL7YNvGKTwb&?NSsgqUv=YACCPXRNZL<~{Z~&n#Wf zTHxw_W#|>(d9_dMxC}zAc}gEkaz=a8Jje}?M6@iioLhKNAG0UU_aJ)?Q6Ll7_)wzs z_{;L?SrFXUEMa};9_O$y@~D5Jo35y&JS`&HD#fW~AAY`UeJL^1=-hn1_4ES1HPbw$ zM9cY0@X+`E_x3U|&$o_Bg{5YdX3qr8okvM+LRR;TCdt)nw|;O}tz1Ss>;}iVHhS%X zvO>FfSBqw={z3wIB_L6w)%Z%uu%%sl-_t7+ zeGaLdR9!5p!d;K^_o72D>-1;xgR4%30{(#DPzL$ji$~%FS~a z)#ep+=);8hE8llWaYMe=YxbcuhZ;-08kCRSa8xl;;fFN-V&-S>&C?a;ol(jg^03Dg zy)~(>K|;cJQvgy@6xJxr8OG`|=! z0MxL}-dgr#ePQFAP{MDy0MVZJvlEzmw5Jd4Ts;mvD;B0Bl|gj={Xp9|{Ej-v47r(P z$Jsg>j!=xz>>foZJ5c$P%ttim+-VsR0`V}cQ!d-*7in{&b{tq;`PvpIwarGNcyt+l zM0<+UpdV#Pu6VdJ!`-aUBm4Lu#OaJi=&MJ0$onufY zKkrMvVzIMMVKXSX$~0;d$E(z=*QVDJ@G6Ipo;h$oz})={W0dMoSgzjjMA7ZdEp$PB z?bO6hJnbvz(JALGgIg=%GN{Z_Y|Uonz3+{yFC6Pw8fiP{!p!BHa@zovPT^D_RyWew zSZJLR*hZo&%a4u7`}f68eIT4WuUDUJHR(3$P0tBgP2)>NwtPWYZl05@Q9k0KDT+FF-XTg-jkHVx?o^KNW$ddYy7LIMpwZBZxpOQ6xcZ{5(LqveF;X!S6rC)0 zm1pS`KR=|miUd{~)yV)`)yjv=R+AhG17Kg!P*3(sq6D~dXgqKAvxVJv{DC5BTtshDad!3!t(FOW= z`KqnZv}GT+%r>(gD*(J}Y*bb&OfE>8$~Eo+jH*f-_#_H=rmD7nn#Zk(H92Ph{-#l> zrzHkrKN#Ao>aVm+W=%vUi9x$4;u=% zpZZMc0F%o^>woG2`}0|QA9q5_n+^}l(@HZ2v<&f;zUa+z;Ap)_N6Ek13EH4;O92OQ zI3J}i-hMHaZ(UGLpM=2kN?3j$lthXc>Po$W<}W@V@g(w835e#qX7c`NuD4%d%lpT^ zji5Cdp)?JPg)(d>m9*_HTvD#iMDyY1HDQNh0kJN)vaw%`Baawg$FuLVR!H9}T z=-I%cfG^K_Qwdm14dhJm#JZH0(xG#J-xk}`i=-fRuRFMVRR0J6kgHkVI%dUEC3Lq;}HBWWEfYmHC z_~2QA_hJ-{!JydDv1V61bNA&~A)>KHJ6pzI&BYw5HEw#4$;uo?2mzKs02>BZt%xy( z1@{7fAZmi(XNSbT^zUF=0Hg$L`?g56!WMibbbzzdo_20qKCtKmRI%}xm;=a!s7!J| zL=B?=Lxd(l&c)S6)S1ZCFQ4F-oBT9jZV7IPBPs~2MiJ6Sq*m+?xEG1$s20)P6>abOF)4QcBBVQ!Dmo z>jarSg_J|XTcFv5MRe%5A|D(7GTYb^+jv^e_z5kq(sb5K=KJk=8xK7J`ZWxAXh}#= z#^IobF+Z}S$^!*5_ac9J6`Lvus&CWxf13GwBf(!@H2~n3>RBe~2Snwlj`h``D!)CU z1#MNQ{9K#to5ZPSx9-8M>%=lEBED(%)rwr;|AnJHRM8s)Oo$cm+JTkjo%ovv!I9%L zU<>#4RTfPdUv1P&zWbYM#g_`+^VUyOf>Xd^^RvlzjwmlNAC3}jT{Lx|ZK)!OAN$1L zxyQ!-es{KDV~w)jiYpkdLcR-XbLNE)E|C~9shA;V)&H|Yq!xI5F@F9 zs+P3Qb#r5{vn8_P2NnfSQVzZ) zx^QY=)_zGFLecNZtSq23zyYG(FPS&>BTEBim{N#vfL4%=8SEnsv%KboKZ<{vs2hq} zaLWA~q>*K;C1_7VQ)t*tD42ka;DcwSxm&d$9Olk>;qAAa(~{qjx9@X$mp*l)R+F9@ z${ByO>dJbT{66k#o8e=-bl{<_8Z|8S(5s zP-Z4%Etn?nv91m(RY$FULpO51_pA$8PHh5y7)Wlt{o`yz-}4*f&Q<23shEJJCQ3`9 z2a}Kr?}`2Qh`BtXv_2B)=uZO?nVp`ZC1zX$^!GnFQr!QrH{@9L@|bm|;aDUfAo{!|U84WAcR;!*EL!OH0BFD7~{^&962SP;#BkzPsrf+fE%*0-~BJuxO#F{^a6A zo((Am3^0$Vg7S#9|CWYhIB_88t%?b7rk@>Q+L+A8;(XO-KL6ylZE7OLf~^L2Vd$1@N9`Fi{2vj z;oo5!2MR`?GVA@-bu3#rqXmZh`!tOm7Ty`~Y#~W)4Bp7xPEEcQ_xKqcY1UXA&Szlp z`Ib3J0q7jV$p1tQ=PBX#_z0YU76!0o`4?TMEw)8CMr1&*m{6c#tWZYz z1}m>i&k@*)%1_hgf%JM=9e7(tb;_F)LYiTxcc^`nuL0krAQ^(E%(9wEL#}PI^-hmaCJ%$Ro zss}rD(~7IVacqX}x-Rxux;7ch%_t}Ya_INRfg_?JCJIC+f;3#G){%>trWaU-?hxBc z#0MD9rbR!m5~L@B;No>cup}XkfBFvFmlXWDdDSVsY57L^HvIl4$bkP176%Bj_i2TN zAHi^e0xr^*cau~x61GH=Zwul&vs#~tQxr|+Vcr0YmK>T&aQVxR!|q*bduONiVRckN z3*Sdr{UqO(`+5rt(OvE>UL4*I*P=`WCwX!`HXV2{JWq?#yy(=&zZtClA5ZTA4QKkt zeJ2qiBudmQqeP-aC+g@WIzbYhXpxEDMkj)d=whNo3kD&&(QEV)B)ZWOZ7_!Do%iy8 z-sd@I_w1hClXG_Eo_ntA_xpZ79}j)@e`k_Joe*0fBE14MvnE;PQKWETrSiX&lOJ?$ z=R3@)Earwmh!yObTMWQ=Ja7VGw}=e?Mj4 zwX_xc!c`d9=b$8j^~D>0E8u0FBFsP?sp~7hV7XqCbEjRXX7|+149L~4UKxCP)4OSU zSQ;vglpF3EKwa}?cbJbx7n@R768E2*9wIdZj7% zoVi?hI~=#m!-Hb|pB^}Jkqiyj==lE}l{gliAH==O=4Ee=@#gJ3Jz6|En0kj^3|i0O z4=y*2U6+829gM8rROlET?aN{#TDA__59&=la7f7Xy=+(_*z!dbSwOlnr_DdSr!vu; zls9A@pw{P6d~XR!Ea&a|8dB6wJ>1__G6F|612afLSsXl+(tENydu!ZzeDT)tE!Zvb zmyn!wJ+4Z_E|45|p>P#vPQz6X&?B6Sm8Y+VL#gxRmLP-EVCXEp*D7RG?h*Y_5sgr7 z9b?D0uIw``m3Ny1r<+$VLH~FU!~8kxabG23X|$MK0Ql%^Y761%&CdAcpH&*?9J_4lt6|{2wC|(h(D7o zA(||$_xkm{pa06*Ca*Nih($-T(Jc@?`*+TRciThEw10z=fCn0Y8@*wN>fvZ` zI3VH@V+MQvcx4Jmlc=*ZAhmQ@e=RYDk%rZ-Edh=&&{&vl= z_bw#vYtVyLAm38JixuhTE%UyyQTtNB9ZxhOd`JMv9*oOZ+e7DYp5R9GjoM@^Xa2{= z-;P^2{L4M)Y8ZqKry9Q0DgEdZJf(=6cY{RN<68EnO}n=?-zLil%danJ=@t$^Z}n%a z2BO?a@cp4tmn>emX83`Q_Z^;NFPUS1^4jj7S|-FP;5y~znhC1lZX6ZofN*kBZf7F+ zM<|FbWc&SK!aZP7<2J)k_G!de6IptFbA5Xy0P)hr1S3b=L?U2s8F*Umq09=-SHLM& zeTD`_cr$}it>Ia1_Ome&9p_@a$ihLg;rjBl*t%c;LH;of|G{tc-&D(VhQM){|d3BG+@B3XZK4idGIEez)OKUgONYR96;5nF>& zI@+vOiS0C32UYPHd(giHeQRhVQIW~cwTL%Gx(YU5({Vd5Di(r?0Cg_l2sEhFuIfz9 z4v4dV*)%)cEf>zq1tBzUXT~{++rC1U;Z)L(0d<02&oyPqv&De(NEzd8V{$V~!? z)+aLSX^=P3HmFilzDx4#CMD5z5CpY_hWU!+jG`+dl#kuRH`mT zCE~9*UrfJcLf=@l5igJtLW+J7+)Ozzh`Wez#hFX_w&fA&WW+OgM!OyDO+Dj!c`EeP z%k)&A{q(&iNIxuP^RmucsjEqTy64HHbk7&otqO{%oEsFj6GZ_zx2Qj^LgFzQmQ-FH zq)??lBK9p*Rxx_9J2AUo3+-NgsI9b>7R}yRP;H>+U*+5=;!W^K6RO`-f4I)KUP&A* z5Gj#AME%FXvF69}?#a*VFt36vgBF#en7^m@A}T1*M!KY`66uH2<*!Ja#ptQ-QNqPn zd;;=<%f7eL=ZeTrE?a|1bZ=JQbqPa}SIX?1c(S>T!Q6D6&xG{Y|K+nG!S>SfzziW+ z-fJo?zoEp>bf(A{FD@8jJ0vbo_N(eTH{mx%gLV>Uh*w_LYbku+O zJoBX0SC`}mluMBJWqmeWwHN!JIp*^xpyw)pw`_iXfR{pgw);{c9)=k1y4?k@h3JLB z8b3Wei0H`ifUXh&(hJpnD|jHARArAyG6Y;d!93nOtBVtS`UTY!{+zTvd4w0Ja@_NN z)wNCZ5acMQ%j>;{nH1cN>~4bohnE`j>&DgYrjQEo;%8`g0&Fp|s3b@5#pDrHvFp+l zTd_MlxH!$ZsnEcMtToDxXI&&{qSt1wLX)ItLN{+&`UnZjV*)`<(|8V%3Y zd5B+Fv(~aSJ7r!S0@NsLDE6fDdTb$c9C;_ke}%bJ8;+GQt_=^P!yZs82kAFGRc++! z>iF!0{a9+`kRaQ=itK-P`s_VriB8r3jscrC7B2b2n<$wgJ@j%L?>+ZQd6>bq&z2$I z8m5P1^m3E;+~;Sl_{#U(;sO)XnF|&_TghyRUHESzNA2GYZ{@h~9@#%?ek~A-fy~^Si<$6IEy$^d>~<0o$6(oKz68 zw9+jFz?&hnB7YydL#gYn!EBnhYi~1Vt7FtA*a-UCe{>A&jNH=>{~ zrrzq`xT+_Kpw`E0Qr`iolfVKWI3Oy5C)%jc!6YcY3?M`)998@Y4O@ZsN}O0S>iP%O z9Cu%SqChDDa#VWm=<7BRs+KUC7v9sNtP4YGP>cPNc~qG2IJ_*R>^t-Q&nvEY4lNz^ z{5P_4egYI%vn)J`k?f+0jx@)7Kwt}_th>3nxcBoGzZ#qQ@&sVw&_!(H1j1B9%0kj` zsjbPLDW)UMIwU3ho#}u;Kn}LoS7SOD0%`aw&zV{mt`&m8jt>nVPZTPJgxu*CVq0irf2x$_VZL;0+s z?`+Y4{o~8lN7fxiUGz=)(HRpJoZ~G?+hFz@b&q7LDwJE(H3!(&`Au;=ZNPS`Yjz-V zT1eDU$$XC-Lg!(HR6Jo3XPDm_b}CVzM#35UW7y3jmjW*ZpjwO6w_c<+;s=sI3OBF| zjC)H8GDUHoOeD}dND`iUrzbsH+jJ*Is=h&${GH5)>ijuX+Leyq63T7URv{rM#au5~JgDK{2WZSImb8ZF6ummf0TPIv>`~HlmQz~i85RlJa2)`M% zdqUJTexsX#C{lb};Omf^@b|th#!{Tf&fCfei&&Bhu&uNNc~i(TseGameF)F_j8~0e zxM4jV(sy8Q*8#S0etxP(>1+`(+U%vi?y26A*(UP0l$pFV*KqV$G^ltWDPh2udDvZi zrm)2mLnl5a#feR=Vgr63yHfKcDvp?5tn9h#F-ObM$j&aae+y5`R#k=5n$T3WPlE&3 zJTGoM(c~duFeN`2CQ|_2ZL8?E7+vpVW8^F*x-N~I@WHy_|5>*7i?es3Lqe_Bx!Kl1 zC}YHyb)!$zvC7?6iK$uYfE#d)wZK=$-z{C5v9M z4C%D|UZ(mv7NQb`(Xnajc(06h0|J#2(Z2ZpyM!g<{gks4dXB;|b8paV+a?2DANyz} zjK}PlT3&-uiSDmw%D-Q zDar6iCkcImEc#nVhXDr6j@X|#j9{5>uwf3QCn z_jzZGBlD9!U8&(irW-d|{!(}%K;9kQT)?%KK02ZL&eOa;H(6^q9$CZ|UeZ1pK;KUO z^%^4o1=N-o6Z>{NP&en`<2q4Sm4!@Rz?Lq7)m`hMtYZ07!O2^%m|pp9E=FoBt(DH6 z*VS@Ah%F2G3ZkK=#yraqrP;9qnMKJ^vm|pwUlp0D`}yB5_G?Lzz7`$gNb0uQt`&l1 z!5bxVU>! zEjY=UKYwQ0)>Z7zRnERv0>4@Dwj!!b(U>RV+0yW4=VR%2?U4=0Z@d1b8V#e0^1-?Z za2nq5TJA(R4$xW{ zWUxhbbnS!0iBX98`G)>5nf1)|hz124GXM%H0*}W{;PJ9-pq1VP33WYd?gozi>$avP ztB0$fWKeQo5G*FBh)MZ3go0$R-{HVN^MC&n&@{UM-)S+~CEr9Ti3?=1@*ErVtoWR; zk|p_QML(VmPH8D~3P#7#f=#hh^zM;rgVa4Ku2ns18!gHy`?(UdHO4L~_6g9^ZidyX zrE4b_`CV<38$Sx0CEauMq5`N9|I1T`Jk6PMPDB#?slup_UiM(ZN$Q{h=KfUehizff zQeE@P(&sR->AHDZ(m22xUv&GO$M_x31%Umcaq!NC%}o%be0?o!R)ZB!f4rgQ=vA7G z_tYPn6Wo?*Wv-+yxME!GQ-AQ|)N0hZdb5;Hfl<0=`PX(C*J%auxuOX+ zXKmwc;ymNL%zLi4-0A(ml}oSphV^gtnn%NC3qicEWT#LEV<^+Ob;PP?Z>V&(qKa{A}_RXcCCXAHG3}WX2FL~W{vvu4=L*##$v{_CY%Xs*^;*I~*L$EV-oD*^y5Yb=4S?7GSuSG$ry0TaDJ@qSf zsA~Oz8Xm`)tde>gidPhYWrp7)yAdNdlXW*6oa$UmBBVA$9QCg}$N<|mVpo&Z-AV%R`ac-WAQ zEn1382{79$+*I;D+9z+lV4YxkC`__Oe_i%#<*4)m=Z4HUGM*5 z{_oubs^(uEN1;6(s2s7MoQItldj2Bd@uD&Teg<=&LVZ zceOR9=wb!CP$Dpx{^>R}T>R-TA0L$hU|QM3+381Cv^V=Y61qm&-_i9~&87Km#{~W; zz-Po2mZ;T@Nx&8-SSvOay1%7O9J`A$lW0GiVJ(blBTI8m6^gr|q3{^M*-Y67&nDgE zQH1Z2A^xPGGNbBf|GL2FbK8IY3<56KZ zsAg`k-T)ov*F3zWnY!E9x|YBv9FOoT5B3ia!BvJZ!^~X!=&a*%uR|Dlsq@SGv_VU6 zCRh^#v8NXzdBCp@240THSy&kT`W&$P?@`%wC-vTFQrl*RBb7! zLPi!dtMpMZJ{ z9{rm7WlXqg82r}I#FM@{ZiA&ikwd)(nMW2oL@no~%OP9d2@Zz!hA(B&;yq}sX2XdY#!7uz3J&zAWQ$vW{p0l_56ZOU`Kpi23dLmwo)5HpIg?+!MpAPP2Nz$^$%l<-u;%YxBuE=tz@n5%}A14c_gjX{x zw=O@H@Gmwevv5QvU~UI(>!s7=%f*wZLZgDbO!NPAjNKxDl|_~9{`QpV1J|h?va}MI zf$_3~R%%))utDS5m&J2Cc0ciTj&1kk`@ zXlxRf&UWj2_XB0xvQlG`d4$%!g*D7THF^MLb{MC7Tizy{Qb}!``?#n24_eZnor>Z^jzJadS#~t}CEEY#QHOmEdWPKk; zl9tbM)g}BFilp{ut{-=KWmLLuICy8=#@k2P2R)#2ld#5MTLq-)Elk#w;v1vLdZh1I zAd7Lo&jG?KAR&w5Rya^CV(a&tJhilFqRs3GMTPuB%_!iQ!(T%;DFH1r=C}KG9{YJ) z`uEzh2wkpwp5>!#pcN0-4B~w(6O1+_Zg5f>CR|VjV=j&Ov2#}IQm=K9Z*rq%j?4l^ zN%___d#PnPMeS(A8BgqQ$7CXU{Y_Kpn{Js-Apvbt-1RqjOwfRcC>*y!!m_CPjo4(8 zeQvyKpx>M$O+$wd&%=B0RENoyNbPW=O2+5JxKzqB*CeC8*@1h;^ z=gCMKc2C*|!W*6g-piI2Ke&gyPx1uH?zaSh>*~tz6;1lvt#Vf#&|k_3xG0Hgb>60P zaIH&eg9#~-Ak9@$UmjFT2I;=YEir&&kr~M7vW#y&a#w2**Ggp30+x7hpYAqlK=5DS zdxWQ#R)MLM-H{;T#DhnMY2qahUf?BDs9B{IxOJLx>{${Ol;yaUC~nb6lEV;fB0f(_ z7Osq^G?F}kCaCKSR$@yG%jr6ixo7}?M!Mwws~B{Krk16~qC>>9URin|>AcLZsxB?E zGf6Js7e4AVRlxXI^)7{(mPe6v;Pi*@`j@Ih`C9Z)v!*DeagE;ZW|;I*B4ByF_HcUk z6a3iq!M1#(gId*))``)U(+_NC?fK^&f85oZ*-mlp?Y=0LP0Tzl_v+0t5$j)9ChzN_`OceN;;<+>Rco1w zOv0BvpE9h_9lTDP(kfN0_$1wqqsy-!WpU>qxJXe62|&9<{2C2VaxmAK8$!HhiVqmqAe%}tI)L&jflb?1&rXZ({YIW_;TCk zMQ6oEGm&kt{Z`Vft%)r*&rJi{>DTI0WZbMRS~Pa}vRXgzcp^x@`Jhd{?%6!MO6f#T zB-W`X>$|60W1%#vi#^wD(JUUW8Y^uuZLW6(7eqlo-?@#<+Y%dGq#^&mH!(I##H}qKyJU!=T>r&|4;tmnEj=yGa)+&O(|n+ z`a;23`W$o174TJh%B$lkVa#KP!;?HZ{^!#>+d6@|&F6d9CEz>RQl|@oQ$a^jQeOX1 zQrpYUeWVDTh-OVbpg17a#pbMWF6p%mD*CAO5(N`+ZpoE46Y+0o{>u9Llzrn`_BwHd zqd)~2dd&KATyr*qX|O@ZVG_}2JrpH=)$Qz9}~1 z#T#m`z`zga5p2}6vTPMTtNWjA_Kyii`cE9*?-^dv~We+Ozs|98{#Bk;;dsxpo3d zlYns_RT4r^5NB;ZNm&w9_s2&ULrDw`;P&ZrP@nP9TNvy?LG)j5i)Gce&ofhc25u<# z*}St2a2kTqr;RgLahcdnxKEUsht!ghhH+_5a)H-n=I6emHsOdaxk)3>wHUzw)$Wj! z+BxB_rAC>?Qk=uopQ@F|K@%2c=er$NEG)1E_s{3!7-eIwE zJ`tyvO$IA^_-I`U5X=D*`Rc~>4y{Ju$Km*1UE&K~9gxJVA@rk=Jyj*0^EhsjVw zTgwUXdM!6yRmIsR_2+JxjGX?M|d^fNwuAs#;}@R0`Q^ zn{-JXcP<|_?BOG+fBpn84mxH^c%e&w9UE*8$J6VI6d6D+CP<3*AZ+!z%Oj9g4b|J`@DQy2-Nf%>TwIOY}HuHbf(8 zxt@$?Y(KIJ!c%w2>Q_nuFY=9a@2dNg#v(nD=$tTrqH}3pD99^ZCjpN?KADMBR|SRz?{&QYXj*S=Ufj;Q{E0o^vXENa z@^{B33}U0Vcf^WolM`3*o*JYTxl!=cVZP72ue*OO%423X(&Gwc@WSiD5_wqdv5M`VUaYdy4M)DD+WAiq_SURn}ABzufJ zi)}d#^*`vJ|CDbo&d$MI(w{KI_$mJol2Gc8^*P4H2EF8)E2NPoTpPPU&@_dlF)&n) z8s@cC#}1+#l}@AY7q_#0aNeDUzs2TjK&`IndP?hej=fs!sW%5m1WJX ztAi6<`G)0x4p4iU8kC+VN#Ysuzl~i)=RV{Phbu)0<)$M*abe9>8r}o zX05}eT&LslWu`?2I>}{wI>{v*7P|Z$D;YJxQUe#gD!lP;w!QoFO$OS4Ui5|w0!;yS z$Z|#TCKPD+R9w3S@sIx_Qbea;7>2l?umGi+hf$x{%aBJ7I=w(&)4%|+u3WG+Q~#BV zX~nBHctgSgxCSJ_cC*Qra6}5h1QpLkz%4Uoci^HCz28IFG~>-qaorv+{3UF?_k$>gkip6pv`XzukQr7>ecC&o@Q zmL8G3rdxsr;Q-PF{Vl-Tjl1t@5a+@)-{p8#&9N^9CKvtnNKRIy3pJemRT?Vi8(TT3 z>1*`X`~Pgvyedvns)0JyKZX5p(7EX;KfV_!3I-tC@ZGY$lrS{u3+trNJ;QW`QOcfr<l6 zv;UzV(3Z`1FHc$9p{?g1U~vu0brB}FVG}&xMEw?g6Vkxcw7V26($&XvLuVCo0VK;D zv#iI*3f6v+!Du#+YjV%+_T>^|0E!hy3NLy#^6ua}N+?LKncQg<*vO3-p96