From 511d76196c25f5b56b418757239d87a58868a774 Mon Sep 17 00:00:00 2001 From: xiahoulu <335611722@qq.com> Date: Mon, 18 Apr 2022 13:29:40 +0800 Subject: [PATCH] first commit --- .gitignore | 11 + BaseMvvm/.gitignore | 1 + BaseMvvm/build.gradle.kts | 72 +++++ BaseMvvm/consumer-rules.pro | 25 ++ BaseMvvm/proguard-rules.pro | 21 ++ BaseMvvm/src/main/AndroidManifest.xml | 20 ++ BaseMvvm/src/main/assets/req_loading.json | 1 + .../base/activity/BaseActivity.kt | 182 +++++++++++ .../holo/architecture/base/bean/BaseBean.kt | 20 ++ .../base/fragment/BaseFragment.kt | 180 +++++++++++ .../base/repository/IRepository.kt | 16 + .../base/viewmodel/BaseViewModel.kt | 16 + .../holo/architecture/ext/BaseCommonExt.kt | 110 +++++++ .../java/com/holo/architecture/ext/GsonExt.kt | 16 + .../java/com/holo/architecture/ext/Intents.kt | 141 +++++++++ .../java/com/holo/architecture/ext/LogExt.kt | 16 + .../holo/architecture/ext/NavigationExt.kt | 42 +++ .../holo/architecture/ext/SystemServiceExt.kt | 64 ++++ .../java/com/holo/architecture/ext/ViewExt.kt | 187 ++++++++++++ .../ext/lifecycle/ActivityStack.kt | 85 ++++++ .../ext/lifecycle/LifecycleCallBack.kt | 45 +++ .../initializer/BaseInitializer.kt | 32 ++ .../java/com/holo/architecture/logger/KLog.kt | 284 ++++++++++++++++++ .../com/holo/architecture/logger/KLogUtil.kt | 23 ++ .../holo/architecture/logger/klog/BaseLog.kt | 40 +++ .../holo/architecture/logger/klog/FileLog.kt | 59 ++++ .../holo/architecture/logger/klog/JsonLog.kt | 42 +++ .../holo/architecture/logger/klog/XmlLog.kt | 56 ++++ .../holo/architecture/network/AppException.kt | 25 ++ .../holo/architecture/network/BaseResponse.kt | 20 ++ .../architecture/network/ExceptionHandle.kt | 63 ++++ .../holo/architecture/network/HoloError.kt | 47 +++ .../holo/architecture/network/ListState.kt | 46 +++ .../network/NetworkStateCallback.kt | 77 +++++ .../network/NetworkStateManager.kt | 18 ++ .../com/holo/architecture/network/State.kt | 43 +++ .../holo/architecture/utils/DeviceIdUtil.kt | 157 ++++++++++ .../architecture/utils/ViewBindingUtil.kt | 76 +++++ .../ApplicationScopeViewModelProvider.kt | 33 ++ .../utils/flowbus/EventBusCore.kt | 121 ++++++++ .../architecture/utils/flowbus/EventUtils.kt | 105 +++++++ .../utils/flowbus/ObserveEvent.kt | 145 +++++++++ .../architecture/utils/flowbus/PostEvent.kt | 37 +++ .../architecture/utils/netstatus/NetType.kt | 23 ++ .../architecture/utils/netstatus/NetUtils.kt | 117 ++++++++ .../com/holo/architecture/widget/TitleBar.kt | 128 ++++++++ .../holo/architecture/widget/TransBehavior.kt | 120 ++++++++ .../main/res/anim/fragment_close_enter.xml | 40 +++ .../src/main/res/anim/fragment_close_exit.xml | 41 +++ .../src/main/res/anim/fragment_fade_enter.xml | 20 ++ .../src/main/res/anim/fragment_fade_exit.xml | 22 ++ .../anim/fragment_fast_out_extra_slow_in.xml | 18 ++ .../src/main/res/anim/fragment_open_enter.xml | 42 +++ .../src/main/res/anim/fragment_open_exit.xml | 41 +++ BaseMvvm/src/main/res/drawable/ic_back.xml | 10 + .../src/main/res/layout/dialog_loading.xml | 21 ++ .../src/main/res/layout/layout_title_bar.xml | 95 ++++++ BaseMvvm/src/main/res/values/attrs.xml | 48 +++ BaseMvvm/src/main/res/values/colors.xml | 5 + BaseMvvm/src/main/res/values/dimens.xml | 6 + BaseMvvm/src/main/res/values/styles.xml | 47 +++ README.md | 1 + app/.gitignore | 1 + app/build.gradle.kts | 121 ++++++++ app/proguard-rules.pro | 21 ++ .../wanandroid/ExampleInstrumentedTest.kt | 24 ++ app/src/main/AndroidManifest.xml | 57 ++++ .../main/java/com/holo/wanandroid/Constant.kt | 14 + .../main/java/com/holo/wanandroid/WanApp.kt | 18 ++ .../holo/wanandroid/data/dto/ArticleBean.kt | 56 ++++ .../holo/wanandroid/data/dto/BannerBean.kt | 18 ++ .../holo/wanandroid/data/dto/CategoryBean.kt | 27 ++ .../holo/wanandroid/data/dto/CollectBean.kt | 37 +++ .../wanandroid/data/dto/CollectUrlBean.kt | 17 ++ .../holo/wanandroid/data/dto/IntegralBean.kt | 21 ++ .../wanandroid/data/dto/IntegralInfoBean.kt | 18 ++ .../wanandroid/data/dto/NavigationBean.kt | 13 + .../holo/wanandroid/data/dto/ProjectBean.kt | 51 ++++ .../com/holo/wanandroid/data/dto/TreeBean.kt | 27 ++ .../holo/wanandroid/data/dto/UserInfoBean.kt | 33 ++ .../wanandroid/data/remote/UserRemoteData.kt | 34 +++ .../wanandroid/data/remote/WanRemoteData.kt | 60 ++++ .../holo/wanandroid/di/DispatcherModule.kt | 26 ++ .../com/holo/wanandroid/di/NetworkModule.kt | 80 +++++ .../com/holo/wanandroid/event/LoginEvent.kt | 13 + .../com/holo/wanandroid/event/LogoutEvent.kt | 12 + .../com/holo/wanandroid/ext/CustomViewExt.kt | 195 ++++++++++++ .../com/holo/wanandroid/ext/LoadServiceExt.kt | 88 ++++++ .../com/holo/wanandroid/ext/NetworkExt.kt | 153 ++++++++++ .../wanandroid/initializer/StarInitializer.kt | 28 ++ .../holo/wanandroid/network/ApiResponse.kt | 24 ++ .../wanandroid/network/CacheInterceptor.kt | 22 ++ .../com/holo/wanandroid/network/PageBean.kt | 17 ++ .../com/holo/wanandroid/network/WanApi.kt | 69 +++++ .../com/holo/wanandroid/network/WanService.kt | 232 ++++++++++++++ .../converter/MyGsonConverterFactory.java | 64 ++++ .../converter/RequestBodyConverter.java | 41 +++ .../converter/ResponseBodyConverter.java | 71 +++++ .../wanandroid/repository/UserRepository.kt | 33 ++ .../wanandroid/repository/WanRepository.kt | 61 ++++ .../com/holo/wanandroid/ui/MainActivity.kt | 99 ++++++ .../com/holo/wanandroid/ui/WebActivity.kt | 88 ++++++ .../ui/discovery/DiscoveryViewModel.kt | 94 ++++++ .../ui/discovery/NavDiscoveryFragment.kt | 53 ++++ .../ui/discovery/NavigationAdapter.kt | 48 +++ .../ui/discovery/NavigationFragment.kt | 60 ++++ .../wanandroid/ui/discovery/PlazaFragment.kt | 90 ++++++ .../wanandroid/ui/discovery/QAFragment.kt | 92 ++++++ .../wanandroid/ui/discovery/TreeAdapter.kt | 47 +++ .../wanandroid/ui/discovery/TreeFragment.kt | 64 ++++ .../ui/discovery/tree/TreeInfoActivity.kt | 52 ++++ .../ui/discovery/tree/TreeInfoFragment.kt | 86 ++++++ .../holo/wanandroid/ui/home/ArticleAdapter.kt | 49 +++ .../wanandroid/ui/home/BannerImgAdapter.kt | 20 ++ .../holo/wanandroid/ui/home/HomeViewModel.kt | 64 ++++ .../wanandroid/ui/home/NavHomeFragment.kt | 124 ++++++++ .../holo/wanandroid/ui/login/LoginActivity.kt | 59 ++++ .../holo/wanandroid/ui/login/LoginFragment.kt | 40 +++ .../wanandroid/ui/login/RegisterFragment.kt | 48 +++ .../wanandroid/ui/mine/CollectViewModel.kt | 88 ++++++ .../wanandroid/ui/mine/NavMineFragment.kt | 103 +++++++ .../holo/wanandroid/ui/mine/UserViewModel.kt | 84 ++++++ .../ui/mine/collect/CollectAdapter.kt | 62 ++++ .../ui/mine/collect/MyCollectActivity.kt | 68 +++++ .../ui/mine/integral/IntegralAdapter.kt | 39 +++ .../mine/integral/IntegralDetailsAdapter.kt | 26 ++ .../mine/integral/IntegralRankListActivity.kt | 45 +++ .../integral/MyIntegralDetailsActivity.kt | 45 +++ .../ui/projects/NavProjectsFragment.kt | 53 ++++ .../wanandroid/ui/projects/ProjectsAdapter.kt | 39 +++ .../ui/projects/ProjectsFragment.kt | 101 +++++++ .../ui/projects/ProjectsViewModel.kt | 48 +++ .../ui/publicnum/NavPublicNumFragment.kt | 53 ++++ .../ui/publicnum/PublicArticleFragment.kt | 105 +++++++ .../com/holo/wanandroid/util/CacheUtil.kt | 21 ++ app/src/main/res/color/nav_color_text.xml | 5 + app/src/main/res/drawable/bg_click_button.xml | 22 ++ app/src/main/res/drawable/shape_gradient.xml | 8 + app/src/main/res/drawable/tab_indicator.xml | 12 + .../layout/activity_integral_rank_list.xml | 15 + app/src/main/res/layout/activity_login.xml | 23 ++ app/src/main/res/layout/activity_main.xml | 123 ++++++++ .../main/res/layout/activity_my_collect.xml | 15 + .../layout/activity_my_integral_details.xml | 15 + .../main/res/layout/activity_tree_info.xml | 55 ++++ app/src/main/res/layout/activity_web.xml | 63 ++++ app/src/main/res/layout/dialog_login.xml | 80 +++++ app/src/main/res/layout/fragment_login.xml | 79 +++++ .../res/layout/fragment_nav_discovery.xml | 27 ++ app/src/main/res/layout/fragment_nav_home.xml | 48 +++ app/src/main/res/layout/fragment_nav_mine.xml | 187 ++++++++++++ .../main/res/layout/fragment_nav_projects.xml | 26 ++ .../res/layout/fragment_nav_publicnum.xml | 27 ++ .../main/res/layout/fragment_navigation.xml | 10 + app/src/main/res/layout/fragment_plaza.xml | 10 + app/src/main/res/layout/fragment_projects.xml | 11 + .../res/layout/fragment_public_article.xml | 9 + app/src/main/res/layout/fragment_qa.xml | 10 + app/src/main/res/layout/fragment_register.xml | 74 +++++ app/src/main/res/layout/fragment_tree.xml | 10 + .../main/res/layout/fragment_tree_info.xml | 9 + app/src/main/res/layout/item_article.xml | 143 +++++++++ .../main/res/layout/item_article_shimmer.xml | 90 ++++++ app/src/main/res/layout/item_integral.xml | 66 ++++ .../main/res/layout/item_integral_details.xml | 43 +++ .../layout/item_integral_details_shimmer.xml | 39 +++ .../main/res/layout/item_integral_shimmer.xml | 51 ++++ app/src/main/res/layout/item_projects.xml | 98 ++++++ .../main/res/layout/item_projects_shimmer.xml | 105 +++++++ app/src/main/res/layout/item_tree.xml | 38 +++ app/src/main/res/layout/item_tree_in.xml | 27 ++ app/src/main/res/layout/item_tree_shimmer.xml | 85 ++++++ .../main/res/layout/layout_loadsir_empty.xml | 25 ++ .../main/res/layout/layout_loadsir_failed.xml | 37 +++ .../res/layout/layout_loadsir_loading.xml | 19 ++ .../main/res/layout/layout_recycler_view.xml | 23 ++ .../main/res/layout/view_custom_toolbar.xml | 24 ++ app/src/main/res/layout/view_toolbar.xml | 19 ++ .../main/res/layout/view_toolbar_trans.xml | 17 ++ .../main/res/layout/view_toolbar_white.xml | 17 ++ app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 9668 bytes app/src/main/res/mipmap-xxhdpi/ic_collect.png | Bin 0 -> 2571 bytes .../res/mipmap-xxhdpi/ic_default_avatar.png | Bin 0 -> 49454 bytes app/src/main/res/mipmap-xxhdpi/ic_github.png | Bin 0 -> 3799 bytes .../main/res/mipmap-xxhdpi/ic_img_default.jpg | Bin 0 -> 103929 bytes .../main/res/mipmap-xxhdpi/ic_integral.png | Bin 0 -> 2565 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9898 bytes app/src/main/res/mipmap-xxhdpi/ic_logo.png | Bin 0 -> 16927 bytes .../main/res/mipmap-xxhdpi/ic_rank_list.png | Bin 0 -> 1108 bytes .../main/res/mipmap-xxhdpi/ic_rank_no1.png | Bin 0 -> 4116 bytes .../main/res/mipmap-xxhdpi/ic_rank_no2.png | Bin 0 -> 4440 bytes .../main/res/mipmap-xxhdpi/ic_rank_no3.png | Bin 0 -> 4790 bytes .../main/res/mipmap-xxhdpi/ic_reg_arrow.png | Bin 0 -> 1414 bytes .../main/res/mipmap-xxhdpi/ic_right_arrow.png | Bin 0 -> 842 bytes app/src/main/res/mipmap-xxhdpi/icon_back.png | Bin 0 -> 648 bytes .../res/mipmap-xxhdpi/nav_icon_discovery.png | Bin 0 -> 2870 bytes .../main/res/mipmap-xxhdpi/nav_icon_home.png | Bin 0 -> 3828 bytes .../main/res/mipmap-xxhdpi/nav_icon_mine.png | Bin 0 -> 2902 bytes .../res/mipmap-xxhdpi/nav_icon_project.png | Bin 0 -> 2260 bytes .../res/mipmap-xxhdpi/nav_icon_public.png | Bin 0 -> 3679 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 21415 bytes app/src/main/res/navigation/nav_login.xml | 23 ++ app/src/main/res/values/colors.xml | 36 +++ app/src/main/res/values/dimens.xml | 20 ++ app/src/main/res/values/strings.xml | 11 + app/src/main/res/values/styles.xml | 110 +++++++ app/src/main/res/values/themes.xml | 25 ++ .../main/res/xml/network_security_config.xml | 4 + .../com/holo/wanandroid/ExampleUnitTest.kt | 17 ++ build.gradle.kts | 38 +++ buildSrc/.gitignore | 1 + buildSrc/build.gradle.kts | 9 + buildSrc/src/main/kotlin/AndroidX.kt | 100 ++++++ buildSrc/src/main/kotlin/Depends.kt | 114 +++++++ buildSrc/src/main/kotlin/ModuleConfig.kt | 15 + buildSrc/src/main/kotlin/ModulePlugin.kt | 16 + gradle.properties | 25 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++ gradlew.bat | 89 ++++++ settings.gradle.kts | 3 + 222 files changed, 10605 insertions(+) create mode 100644 .gitignore create mode 100644 BaseMvvm/.gitignore create mode 100644 BaseMvvm/build.gradle.kts create mode 100644 BaseMvvm/consumer-rules.pro create mode 100644 BaseMvvm/proguard-rules.pro create mode 100644 BaseMvvm/src/main/AndroidManifest.xml create mode 100644 BaseMvvm/src/main/assets/req_loading.json create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/base/activity/BaseActivity.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/base/bean/BaseBean.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/base/fragment/BaseFragment.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/base/repository/IRepository.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/base/viewmodel/BaseViewModel.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/BaseCommonExt.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/GsonExt.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/Intents.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/LogExt.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/NavigationExt.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/SystemServiceExt.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/ViewExt.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/ActivityStack.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/LifecycleCallBack.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/initializer/BaseInitializer.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/logger/KLog.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/logger/KLogUtil.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/logger/klog/BaseLog.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/logger/klog/FileLog.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/logger/klog/JsonLog.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/logger/klog/XmlLog.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/AppException.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/BaseResponse.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/ExceptionHandle.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/HoloError.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/ListState.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateCallback.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateManager.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/network/State.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/DeviceIdUtil.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/ViewBindingUtil.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ApplicationScopeViewModelProvider.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventBusCore.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventUtils.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ObserveEvent.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/PostEvent.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetType.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetUtils.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/widget/TitleBar.kt create mode 100644 BaseMvvm/src/main/java/com/holo/architecture/widget/TransBehavior.kt create mode 100644 BaseMvvm/src/main/res/anim/fragment_close_enter.xml create mode 100644 BaseMvvm/src/main/res/anim/fragment_close_exit.xml create mode 100644 BaseMvvm/src/main/res/anim/fragment_fade_enter.xml create mode 100644 BaseMvvm/src/main/res/anim/fragment_fade_exit.xml create mode 100644 BaseMvvm/src/main/res/anim/fragment_fast_out_extra_slow_in.xml create mode 100644 BaseMvvm/src/main/res/anim/fragment_open_enter.xml create mode 100644 BaseMvvm/src/main/res/anim/fragment_open_exit.xml create mode 100644 BaseMvvm/src/main/res/drawable/ic_back.xml create mode 100644 BaseMvvm/src/main/res/layout/dialog_loading.xml create mode 100644 BaseMvvm/src/main/res/layout/layout_title_bar.xml create mode 100644 BaseMvvm/src/main/res/values/attrs.xml create mode 100644 BaseMvvm/src/main/res/values/colors.xml create mode 100644 BaseMvvm/src/main/res/values/dimens.xml create mode 100644 BaseMvvm/src/main/res/values/styles.xml create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/holo/wanandroid/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/holo/wanandroid/Constant.kt create mode 100644 app/src/main/java/com/holo/wanandroid/WanApp.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/ArticleBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/BannerBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/CategoryBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/CollectBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/CollectUrlBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/IntegralBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/IntegralInfoBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/NavigationBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/ProjectBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/TreeBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/dto/UserInfoBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/remote/UserRemoteData.kt create mode 100644 app/src/main/java/com/holo/wanandroid/data/remote/WanRemoteData.kt create mode 100644 app/src/main/java/com/holo/wanandroid/di/DispatcherModule.kt create mode 100644 app/src/main/java/com/holo/wanandroid/di/NetworkModule.kt create mode 100644 app/src/main/java/com/holo/wanandroid/event/LoginEvent.kt create mode 100644 app/src/main/java/com/holo/wanandroid/event/LogoutEvent.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ext/CustomViewExt.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ext/LoadServiceExt.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ext/NetworkExt.kt create mode 100644 app/src/main/java/com/holo/wanandroid/initializer/StarInitializer.kt create mode 100644 app/src/main/java/com/holo/wanandroid/network/ApiResponse.kt create mode 100644 app/src/main/java/com/holo/wanandroid/network/CacheInterceptor.kt create mode 100644 app/src/main/java/com/holo/wanandroid/network/PageBean.kt create mode 100644 app/src/main/java/com/holo/wanandroid/network/WanApi.kt create mode 100644 app/src/main/java/com/holo/wanandroid/network/WanService.kt create mode 100644 app/src/main/java/com/holo/wanandroid/network/converter/MyGsonConverterFactory.java create mode 100644 app/src/main/java/com/holo/wanandroid/network/converter/RequestBodyConverter.java create mode 100644 app/src/main/java/com/holo/wanandroid/network/converter/ResponseBodyConverter.java create mode 100644 app/src/main/java/com/holo/wanandroid/repository/UserRepository.kt create mode 100644 app/src/main/java/com/holo/wanandroid/repository/WanRepository.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/MainActivity.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/WebActivity.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/DiscoveryViewModel.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/NavDiscoveryFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/PlazaFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/QAFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/TreeAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/TreeFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoActivity.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/home/ArticleAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/home/BannerImgAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/home/HomeViewModel.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/home/NavHomeFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/login/LoginActivity.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/login/LoginFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/login/RegisterFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/CollectViewModel.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/NavMineFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/UserViewModel.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/collect/CollectAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/collect/MyCollectActivity.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralDetailsAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralRankListActivity.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/mine/integral/MyIntegralDetailsActivity.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/projects/NavProjectsFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsAdapter.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsViewModel.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/publicnum/NavPublicNumFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/ui/publicnum/PublicArticleFragment.kt create mode 100644 app/src/main/java/com/holo/wanandroid/util/CacheUtil.kt create mode 100644 app/src/main/res/color/nav_color_text.xml create mode 100644 app/src/main/res/drawable/bg_click_button.xml create mode 100644 app/src/main/res/drawable/shape_gradient.xml create mode 100644 app/src/main/res/drawable/tab_indicator.xml create mode 100644 app/src/main/res/layout/activity_integral_rank_list.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_my_collect.xml create mode 100644 app/src/main/res/layout/activity_my_integral_details.xml create mode 100644 app/src/main/res/layout/activity_tree_info.xml create mode 100644 app/src/main/res/layout/activity_web.xml create mode 100644 app/src/main/res/layout/dialog_login.xml create mode 100644 app/src/main/res/layout/fragment_login.xml create mode 100644 app/src/main/res/layout/fragment_nav_discovery.xml create mode 100644 app/src/main/res/layout/fragment_nav_home.xml create mode 100644 app/src/main/res/layout/fragment_nav_mine.xml create mode 100644 app/src/main/res/layout/fragment_nav_projects.xml create mode 100644 app/src/main/res/layout/fragment_nav_publicnum.xml create mode 100644 app/src/main/res/layout/fragment_navigation.xml create mode 100644 app/src/main/res/layout/fragment_plaza.xml create mode 100644 app/src/main/res/layout/fragment_projects.xml create mode 100644 app/src/main/res/layout/fragment_public_article.xml create mode 100644 app/src/main/res/layout/fragment_qa.xml create mode 100644 app/src/main/res/layout/fragment_register.xml create mode 100644 app/src/main/res/layout/fragment_tree.xml create mode 100644 app/src/main/res/layout/fragment_tree_info.xml create mode 100644 app/src/main/res/layout/item_article.xml create mode 100644 app/src/main/res/layout/item_article_shimmer.xml create mode 100644 app/src/main/res/layout/item_integral.xml create mode 100644 app/src/main/res/layout/item_integral_details.xml create mode 100644 app/src/main/res/layout/item_integral_details_shimmer.xml create mode 100644 app/src/main/res/layout/item_integral_shimmer.xml create mode 100644 app/src/main/res/layout/item_projects.xml create mode 100644 app/src/main/res/layout/item_projects_shimmer.xml create mode 100644 app/src/main/res/layout/item_tree.xml create mode 100644 app/src/main/res/layout/item_tree_in.xml create mode 100644 app/src/main/res/layout/item_tree_shimmer.xml create mode 100644 app/src/main/res/layout/layout_loadsir_empty.xml create mode 100644 app/src/main/res/layout/layout_loadsir_failed.xml create mode 100644 app/src/main/res/layout/layout_loadsir_loading.xml create mode 100644 app/src/main/res/layout/layout_recycler_view.xml create mode 100644 app/src/main/res/layout/view_custom_toolbar.xml create mode 100644 app/src/main/res/layout/view_toolbar.xml create mode 100644 app/src/main/res/layout/view_toolbar_trans.xml create mode 100644 app/src/main/res/layout/view_toolbar_white.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_collect.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_default_avatar.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_github.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_img_default.jpg create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_integral.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_logo.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_rank_list.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_rank_no1.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_rank_no2.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_rank_no3.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_reg_arrow.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_right_arrow.png create mode 100644 app/src/main/res/mipmap-xxhdpi/icon_back.png create mode 100644 app/src/main/res/mipmap-xxhdpi/nav_icon_discovery.png create mode 100644 app/src/main/res/mipmap-xxhdpi/nav_icon_home.png create mode 100644 app/src/main/res/mipmap-xxhdpi/nav_icon_mine.png create mode 100644 app/src/main/res/mipmap-xxhdpi/nav_icon_project.png create mode 100644 app/src/main/res/mipmap-xxhdpi/nav_icon_public.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/navigation/nav_login.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/test/java/com/holo/wanandroid/ExampleUnitTest.kt create mode 100644 build.gradle.kts create mode 100644 buildSrc/.gitignore create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/kotlin/AndroidX.kt create mode 100644 buildSrc/src/main/kotlin/Depends.kt create mode 100644 buildSrc/src/main/kotlin/ModuleConfig.kt create mode 100644 buildSrc/src/main/kotlin/ModulePlugin.kt create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7987daa --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +/release/ diff --git a/BaseMvvm/.gitignore b/BaseMvvm/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/BaseMvvm/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/BaseMvvm/build.gradle.kts b/BaseMvvm/build.gradle.kts new file mode 100644 index 0000000..8ef0697 --- /dev/null +++ b/BaseMvvm/build.gradle.kts @@ -0,0 +1,72 @@ +plugins { + id("com.android.library") + kotlin("android") + kotlin("kapt") +} + +android { + compileSdk = ModuleConfig.compileSdkVersion + + defaultConfig { + minSdk = ModuleConfig.minSdkVersion + targetSdk = ModuleConfig.targetSdkVersion + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + buildFeatures { + viewBinding = true + dataBinding = true + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + // Some libs (such as androidx.core:core-ktx 1.2.0 and newer) require Java 8 + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + // To avoid the compile error: "Cannot inline bytecode built with JVM target 1.8 + // into bytecode that is being built with JVM target 1.6" + kotlinOptions { + val options = this as org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions + options.jvmTarget = "1.8" + } +} + +dependencies { + // Android + implementation(Android.appcompat) + implementation(Android.startup) + implementation(Android.coreKtx) + implementation(Android.constraintLayout) + implementation(Android.material) + + // Navigation + implementation(Navigation.uiKtx) + implementation(Navigation.fragmentKtx) + + // Architecture Components + implementation(Lifecycle.runtimeKtx) + + // ImmersionBar + api(Depends.immersionBar) + api(Depends.immersionBarKtx) + + // Retrofit + implementation(Retrofit.retrofit) + + // Gson + implementation(Depends.gson) + + implementation(Depends.unPeekLiveData) + + implementation(MaterialDialogs.core) + implementation(Depends.lottie) + api(Depends.shimmer) +} \ No newline at end of file diff --git a/BaseMvvm/consumer-rules.pro b/BaseMvvm/consumer-rules.pro new file mode 100644 index 0000000..9c5bda3 --- /dev/null +++ b/BaseMvvm/consumer-rules.pro @@ -0,0 +1,25 @@ +# Android jetpack去混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** + + +# Glide 混淆配置 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# for DexGuard only +-keepresourcexmlelements manifest/application/meta-data@value=GlideModule \ No newline at end of file diff --git a/BaseMvvm/proguard-rules.pro b/BaseMvvm/proguard-rules.pro new file mode 100644 index 0000000..ff59496 --- /dev/null +++ b/BaseMvvm/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/BaseMvvm/src/main/AndroidManifest.xml b/BaseMvvm/src/main/AndroidManifest.xml new file mode 100644 index 0000000..21834b0 --- /dev/null +++ b/BaseMvvm/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/assets/req_loading.json b/BaseMvvm/src/main/assets/req_loading.json new file mode 100644 index 0000000..e0dff7c --- /dev/null +++ b/BaseMvvm/src/main/assets/req_loading.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":23.9759979248047,"ip":0,"op":119.999989613637,"w":400,"h":400,"nm":"boyanimation","ddd":0,"assets":[{"id":"image_0","w":469,"h":284,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAAEcCAYAAACRXi6LAAAgAElEQVR4Xu2de5RdVX3H9z733pmbeeY1M3kaQiRgIgRDgBoFDKQEIgi2mGJFKVbtQ8uqtbYuHwVb+1q0yLK1q7FUirXWFWkrRSLYlMijUXDkJSG8QoA8JskkM5nM+3HO7rohQBJm5p7Hb7/O75t/s89v/87n99vn+z37nHtGCvwDARAAARAAARAgISBJoiAICIAACIAACICAgKiiCUAABEAABECAiABElQgkwoAACIAACIAARBU9AAIgAAIgAAJEBCCqRCARBgRAAARAAAQgqugBEAABEAABECAiAFElAokwIAACIAACIABRRQ+AAAiAAAiAABEBiCoRSIQBARAAARAAAYgqegAEQAAEQAAEiAhAVIlAIgwIgAAIgAAIQFTRAyAAAiAAAiBARACiSgQSYUAABEAABEAAoooeAAEQAAEQAAEiAhBVIpAIAwIgAAIgAAIQVfQACIAACIAACBARgKgSgUQYEAABEAABEICoogdAAARAAARAgIgARJUIJMKAAAiAAAiAAEQVPQACIAACIAACRAQgqkQgEQYEQAAEQAAEIKroARAAARAAARAgIgBRJQKJMCAAAiAAAiAAUUUPgAAIgAAIgAARAYgqEUiEAQEQAAEQAAGIKnoABEAABEAABIgIQFSJQCIMCIAACIAACEBU0QMgAAIgAAIgQEQAokoEEmFAAARAAARAAKKKHgABEAABEAABIgIQVSKQCAMCIAACIAACEFX0AAiAAAiAAAgQEYCoEoFEGBAAARAAARCAqKIHQAAEQAAEQICIAESVCCTCgAAIgAAIgABEFT0AAiAAAiAAAkQEIKpEIBEGBEAABEAABCCq6AEQAAEQAAEQICIAUSUCiTAgAAIgAAIgAFFFD4AACIAACIAAEQGIKhFIhAEBEAABEAABiCp6AARAAARAAASICEBUiUAiDAiAAAiAAAhAVNEDIAACIAACIEBEAKJKBBJhQAAEQAAEQACiih4AARAAARAAASICEFUikAgDAiAAAiAAAhBV9AAIgAAIgAAIEBGAqBKBRBgQAAEQAAEQgKiiB0AABEAABECAiABElQgkwoAACIAACIAARBU9AAIgAAIgAAJEBCCqRCARBgRAAARAAAQgqugBEAABEAABECAiAFElAokwIAACIAAC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","e":1},{"id":"image_1","w":252,"h":253,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":44,"h":49,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAxCAYAAAChzEtEAAAE1ElEQVRoQ+1ZS2xbRRQ9M3Zsx/k5tFBRVDWVkCohQROJLTRhQZO0Cd4gFsWQJ7ElmE0l2CTdVWKBMUsWryEqC1jUuM2nCKlpxRKpAQmkSJWaiKpVS5La+djOi/0GXSfPcWw/v5nYEarkWXruvXPeuefe+ZjhORvsOcOLBuDDzliD4QbDJQzYSiJ4Ww9sZxABQ3DXZ05wjE+/q81bMQZn9BEP5++f8Le/3eH2tbrYTrgVI208TK/9apjmTx4fYrE+LVGJ+cFf9G6eQyALLM4OaIsy2bEFfH5Wnz/mbTnjYhyp3DYS2xmKlxQcvS6BLlMg4mL85OnWF+B3NZWtlRMCCxsr5JsUAuHpAe0qGRER2QzCgiEMoMNyFAx3TBMjTsArAibmXvQ2613+QAHIetbA/c1nyAnTAOChidfajlYEazkZZg5/rS+TDyAwIVyIMBMxACctGy93wcNdoPhESJMXXXYZIYOKgC/M6ONHvM1jxYDJmJhe2FjNAzjqaUbpfKWUPsps4FFmvfAN9LGUtWPelnwMAkuDMvIglUDCyExMDWgjdvKwBcw5H3uj/SVYurQCPNnaxD/pNdCctVg17RGQP9ee7rAMINDkwyl/oCwuzRHLCxsryal+bS+1MkXXP6N3uRgekDZPtx4pC04ACLDsuL+5isT2lmNWqE5IdlP9mm1t2U6QjhmDTqBfbencl7plI5VPqez410hh1UjnP77aoCIllg8EmAIP3dKD1A2oSHb05sZ6dgvHfW1oc+frTmpQ8S0baRz3tdraL6YSeRvqFtPntF4lDRcbW/Io/u3NwMtSQIuNSPcnmtvL/IhRmqOCpiE4eop7famD41niwozeKxhu1wr47/XlfFao6KwCI81aQKmlcYaRG+c0anu2QwbwuGAYsyJQ33xdoeAsP0ufFZAsMYGrbh8i1fqv5acMmFhyKp5K9JQBFpjIAeNOO9tBJLGP4XoBZgKXbw5o46rFoMxwvSRxmIDrUnSlkjg0wHQEZCbu1dol7iWfFLZnisUE+m4OaHN1lwQFPD+ri+LAsueIYp/fE4/3YWvyolOmKygXHTkM3tLnmMBZy5m6hMpOR72W+nDRWJrq17pU2c1nppqTHg4G3KZJaTtzkOBVfRhtFLz3YiRWuMHIrFEV8OToMAWrP9i9XSAZ+iZue5Ss9AFOgPdpV4YBVZtQNO7YWotjNgA3GC5hoCGJ/1US3386NMIY01VBKNhPhKJx2yu9clsjh68unn2Y2dp+RQGElKnX405e+uGuUg923OnI4MoHb11Pbqat9zUpMDJGbX7f/Jc//tYjYyvdh8nw64/e+eTp6tp3qoGd7Ds7/FcuXbv7hZNd6bzULjM5Olz3HS/L+SktEpN6sVRimIwnR4fpAFQ4ramyUm7PlkLRn+t/WrMWmhwdprtX4eZcO2Aod4e985LE6pPhoSBMdl3CVMqECfH5h9/eoBcl5SGl4d1z8TPl6DYOnPMe1XOwEsM7On5vERCFh+hawKseKZWLbrfw6Mn/41qA7vreCUXjto99TvGlJEFB6rhNXw5F48oPKMqSuBYOdpumue+678RGxXnO+0KRmPL1XhlwXhafDScg9v75OQjgLOedWiRW8W8wmXjSkqjTBvJHKBrvlgFmZ6MEuJaF6uX7H/Hd8kHfn0TWAAAAAElFTkSuQmCC","e":1},{"id":"image_3","w":12,"h":26,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAaCAYAAACD+r1hAAABO0lEQVQ4T82UwVHDMBBF//oCN7IVkA4wFZBUQOggHWDnQOwTySkMh1gd0AJUgNMBVICpAHKEGbKMpCRIxjKTQ2bYk63R09/9+jYBwNttEuMrGnA+n+j3tiID3KT3AM5BcsFjpZ+DtQFkvWOJA+lyqt5DRB0ABAvOi95fgG1pU0LT0DxWYZb0QPTonRrJKV+pp7qSASyUliCc/ajgFYcS1+dxgKQLopfaiQ+cFQN3bQus7VUALj2IKOXxXK+b8oEi6eCDKgBHDrSESMy50us+YGcZTUBy7ak4VnsKjgEVCMc+JH3OVRkARkOQ3DUZEAAa7gV45qyIQwq/5wDAWUH/DIBIP2Srn6ttivcOEKU7tkTTtovTX6EbQkACgAmh/vWsqPSgNsBANu4aOjFGCRaNLbmhM9BnNMQKHQDVN4dblA640HRRAAAAAElFTkSuQmCC","e":1},{"id":"image_4","w":12,"h":6,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAYAAAD37n+BAAAAeElEQVQoU3WOwRWCQAxEZ7JnlE60AygBO7AEOoASbMEObMEOoBP0bsYDy3v7YDfHn5/JEPsJVWdiK/KarihN7t+eGzQ7jQJ6AOdDSASibgTqmkEvSM1R1LwyXkC+9eOdMXnYZAJPd3sAy5T7lB585NaWxCSw1DjP/6AWJJfe/KMJAAAAAElFTkSuQmCC","e":1},{"id":"image_5","w":12,"h":6,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAGCAYAAAD37n+BAAAAeElEQVQoU3WOwRWCQAxEZ7JnlE60AygBO7AEOoASbMEObMEOoBP0bsYDy3v7YDfHn5/JEPsJVWdiK/KarihN7t+eGzQ7jQJ6AOdDSASibgTqmkEvSM1R1LwyXkC+9eOdMXnYZAJPd3sAy5T7lB585NaWxCSw1DjP/6AWJJfe/KMJAAAAAElFTkSuQmCC","e":1},{"id":"image_6","w":7,"h":10,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAKCAYAAAB4zEQNAAAAmklEQVQoU2XQwRGCUAwE0N3gFaQES6AErUA6UDuwA7ES6UA6sAS1BDtg4EzW+Z8DDOwxbzOTCRGTF2Z+lZDL1GDo6zBlAJq/x9IYAnf3rqJZVgs4zRHAT97tSGYNiOMCIe8YNisBtxWaHYgkLSk+V0hdiE2+p/trieEoxussawFs5wXFzZAkPVN8TKivvC9GnB5ROvXB0Ddh9Acc3DXRlT5BzAAAAABJRU5ErkJggg==","e":1},{"id":"image_7","w":7,"h":10,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAKCAYAAAB4zEQNAAAAmklEQVQoU2XQwRGCUAwE0N3gFaQES6AErUA6UDuwA7ES6UA6sAS1BDtg4EzW+Z8DDOwxbzOTCRGTF2Z+lZDL1GDo6zBlAJq/x9IYAnf3rqJZVgs4zRHAT97tSGYNiOMCIe8YNisBtxWaHYgkLSk+V0hdiE2+p/trieEoxussawFs5wXFzZAkPVN8TKivvC9GnB5ROvXB0Ddh9Acc3DXRlT5BzAAAAABJRU5ErkJggg==","e":1},{"id":"image_8","w":95,"h":113,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAABxCAYAAACz6n+zAAATgklEQVR4Xu1dC4xdxXn+Zs65z72v9XONH6wN2GATsg4NTYGWtWqaNoQUYmgkwLA0EVWoVEzrtEmNYyc0USIIGEVRmyhp1iTpAwIYhaRqK4W1mgoSVLK0IQQMeG0MxrvG7N31vnzvnan+c9/3nsecc+65u9dipKsF33n8880/3/zzzz9zGd5L84YAm7eW32sYZyf4WnKAS9YvGetlUg4JwQ8A48MLbbwXEPiZDLRCfwm0Pkh5VRNYjB2UUh6A4IPA+HjT91ryOibZPgDnNn7HgIeEmNixkAZg/sEnwAQbAMMfuwAmK5kcQGHyQLFMJsO52CeB2+zqYMB+ISYGXLQTaNb5A99GS1V7LJm8HQXtAOOFIYC9X6UcA74gxMRelbxB55kH8DO9TJODprTirbdHzGjGriop+FpgfKQ0a3pLdNdL/y+YHEFhctCbKO5KtRd8PdPPhCCqSLsTs8W5JZ6UDEMMoDWgaX0A5AtSaP2m60oLRWkf+FpygEn23RbKHmxVNEBy4rogG2kP+J0GfAlxyfkW5MeHghqANoCf6WNc/DKoDgRaL5m2hWx/UG0EDH4mw7ighW1+Od4HelLwzZUNmjGDaZ1g79e00EuR+KLRwlz+ttnZw7Tou06Bgs9Y6oBL+911B4IuUN4bcJ6ifcRd5fa60udAC0UhRT6fmz19y8zpkX91K0tw4Bft+CfcCrQA82cl59cxIZ4uyxaOpRHtWlwRVUohpyfHrsrPHv8vN/IHBj7jKaIbEzPOjXgLJm+2TJ1c09GVWQXGeEW4Qm4WU9m3jkjB+6rmaaa3upcw70cw4HeodeM01AR4nOhGD9dlnc4eRz43Q17KkvuiaGQ4WUuBgH+WaX0F6FhyKUKRZB3w+TNTmJ44UaUgY4HGOOPisJMzr/Xgnz1cXwdyJN4N+tQmKQWmxo9BFPKVfy5rv6GAjI3YmaotB/9ssHAa6ScUTSKWWNrESrNT7+DMDC0H9UkK3s00eYD8V1JMWGLsGvxYovcTc9OnLmpsUHA+hDyGGRfvOnFnJ31vBXwj3dTNCCZv55L1SmBPS8CPp9d9Ww/Fb2Nc12dOjyE3O9lJGHqS1YxqqCKim9Onjhp/zRJxPfG+b/Cj0bXn6vHosKZHMrUNEdcV8mc8dWqhFyKrJppY3LS4luV27DtjB+n40hf4BHyoK/4S10KxJl6TAtPZt866ASA7PpbsaTIny/1XmvVF8EfoZM0z7XRl1v9SD8f7rDSVpt3ZNADE77Rzrd1A1fadFldaZB0TYwchhcEUUkxa4me54MZSvTvC0cyDTg2dDQNA2k6g6+Euy+7m5iYxMznmBEfxe4afQ+K3Pdv5ie4Lj2uhaI9KazQAJBhZAJ2USMPJT0MfK22n/rgCvgjAywA2eNrhEtdHUunSGac6nHPT74I+nZCIYsia4Vy3FdcD8FTfLIATUkwY58JWyZR2yKwMRVKf9AIiOZlmTo/W7fq81BNEGdJuPdKlBLpHja+ILZm8vhraYt4bU/C70hcM6ZGu5qAlRUSIhmhxWiizgBxh5JMhbbejl9ruKS+uZpgonv+agp9YdNG7jXa9Iu512YTIGwMwHxsyWkRpASXQG72QTn1RMifNK5EAe0sKdrFK5EOg4JflK88E4s9aJ5QTCG6/10Mx6OE4aFviFnBqqwWWW04KfplqXGhbwK8FkXbFZBXR2kA+cK+JwOV6BJoWhkZ/Q1GvVRnlSC7as1i5DJwrZ5Ba9H+QO/FbznmLOerAZ1p6SDK2N5Fa8UQraEdFCOq0FLnKTtlwWdT4TLgervA0aTYY96TVdrL4ttKYBqmFAdpczb2tHO1QDz5PSYpljGdW3tUu8FUGKKg8tCbN0v7ExwyUPATQp6jK/sCHxJOxzIqLQ6HYeUF1eiHUW7bGvNNMsRdSiwBMawH4WnqIfBJ6OPFsLLn0z1TNsoUApqoMRGtzU+/40vbatqROPscKgezHmbeVQ9DraIfz1KDhieN8i8b403bePdXOLpR8pOHE7WYnT35klHq8Upxr2kNi5k3lCxj11g5P7WDAgwQ+xakYp/WpHt+WhJ/O+S1bNnMJdL8U0yQL42ThVP45Eop9Z27q8KdUZW4wNTO95VN3KdFbjjYjjx85nzopBQp6GQimF62cUorF04/NjL98gypOTXZ+KewDksm9tSHdZOZFk0sdHVGqDQeVry2gl4SXPAzUOObS3T0HsyeGvZmaRp1l6mHy9tLlsorKq7pggwLWrl7atJ2Zm/Ttyrh49RIcPTmJiZk5x24YlFOKXGOMIZVens2ODtcdt9pVYrLDLUUWMzZcPodsrID8JuSObQwgcpS2xRnITie/kRe3RSoWwSVrluDKDavwuxtWYc3iFNYsSSE7PYc1f/EPCpIyFC2dYtL1MLoSi5AdHVaOCDHNyHlqr3H4C/w5A75sFeJdngnkLXTyiyv0RilL2T1huChcHuCvXpzERzefZ3wIdLP0s5eP4Zr7HnOWhYdgbLBKKRKJIxpL0UTYMv72sNKFCotRqsTVQwJ/y4BvOElTdtt6dWpZ1U90UsjPIU9/czOuLRbS8JuvuAg3X7ER71vdHPjU2K4a+KT1ZOVU4YvGkohEuloBPoBK2J98AYyPu7k9SDOCnF3kl6EZQf9NiWl60wyp9eUQyLRgEuBSFlxrdi2QV25YiZsu32iA7iYdPTmB933W4epYg9ZT/UQ5RD2M4e7xE8N0Edsx2fJT+UIAA/5ZAh/phBsmN11+ET73sQ8Z/O01XXPfD/Gzl980L95g25czpdLLDAcg+cbGR4eV7vk6Lg7lXS8kfgQGOt3y3iuvaDiUI2q58+o+3Ll1M9Lx4ixTTSyiA5wBQlaKZKdm8UdfegS/eqMhWsEAnupv2JtyDclUkdIk8OTE6LDSLUZH8KnCygAArwA4B0BCtXNB5qMFlGjFC+iGXBoDT5gPVnZqDk899wqOjGbx+M9fx2/ePFV1oDV0qmzpFLkVyra+EvhGpSX7H8BpALTMu1OxFo4CgU7U4pbPG0XgXWFAr94wsRLxiV+8ju0P/tiyB5FoAtFoRR+PZEeHbaMWyhWpg2+UyPQxTe4rLb4UHuHv+MjlgNAi+umtmw1T0W9iYQ0sVjUVnepL3fQNCIvA2Fg8jXC4avOr2vouwS+JWHMl0knoVnxPi+idV29WMhWV2rOhG6vym3f+Cw69aR6xlkguhqZVB5JxrB1/e9gx7skb+CUJ46m1g/nc3G05ilST1QVLCQCHTLTNv7lkKrpdRG2rZoBBN5oz3dTW8+wrJ7B1zyOmVacz9YF9qhstX+BnlvUZO2GSyPCtzE4YGyJRyHnCn2jlmr7iDtSPqWjXOFENUY6X9Hu7H8fzr9aboJqmI5FcUlcdk7h9fGzY8eUSf+D39PVLgcr91LIExkYpP2cMiHFALgvQOccHe+vvNJX9KeRbsdruewHJqoxbnm+s59g7p3Hpzn/C1GzV6UZcT5xfm1Rt/UDAt+r8G1+5tpVYuqrLL/C1jX30y0/hv196A7l8Hg2WjpFNSjw0MTbseKLlC3xqKL2sT4nsP7RuMR6943JXgLUsMy2wXXTQ3bIaKxXd8MAQnjnUuBlTs/V9i7PgwQ8QeBoBM/BVd7mtAJ+eTHR83+zGS1fjgRstL2m0XiWpxoCBpya+9tSLeODHv27k/OvHR4dLj+9Zd80/+Mv7hiANn49tIuBpANqW2gC8FfiPXXP+tVu/+8OnnPrqG/zU0r59jFWfQjFrMBkN4dm/+X2kXOwonQS3+56FOFiMwvf81KJW9plXxnDDg9Wzkwu7o/jRtReQkycrgX3hPN/XvW+w+Q3QJvecWnt1uWptfavid29dj7/cusFD7e6LtNKqUWm9EfzLlnfhBx9eV1OUZcF4/7L7BptetPWtG5mlfQOSwfL04ZNXrMPeazep9MNfHgawqPcNlJ/GV3760UrxZvDpK/MB8A++xUaLQP/UlWuxqrsa0eWng7Zlid+J0ly6DFolz9Vf+k/8+liRWbauTuHvt5g9M8SyoTzvraWgVoDfKwUON3akXQssHYawqP2ltlaBbFXPI8+M4O6HnzO+Ntf8ckm5f9n936/EcvoGn6o1s/UD53mdgxPo86TtjQOx59FhfPunhxzABwq6tnbFVwYNj2erwG+y9QOz6zmDoe0enWNBz4KZ5w5B5guWzTDg7qX3f884YG8J+JmePqIeGoCKh6nl7oQFDnoZ7bkXj6IwMW0zxlXqaQn41FKjyblxRQr/fpfj3stZEXUOFtIWrKY3dmDu5TdROGX7HM7BZfd/z4jnbB34Re2vW3g9ezE1VgQ8pBUjCzoo5Y6dRO6Nk3YS+wd/9DPbB2C8rkp+HbJjMXjdf4zc/OLxicrJgjL4RCl0kE1armstVIn2j1p+LIszrx4PhnZGPzPQx2ThgDR5M/Nbb8yM3ff0q5WYPEfw53FjFNSwiIlpzL54tPUL7om/uuU6xuj3SqTpTYnnThdw0+NFD98fbOzBd279oHUf2+T4Cgpkq3rlXA4zz79m2awnU5M0HlIMWQFPrWnpLqz7+rMgRxodnGw6xyK4jQ6xKVipw/hcdSCnn/mNRVaPm6zRndvJdedovnz/lMAfbuqxdSsshF2pKpBe8s3+7wjEFIU11SaP7oWxnbf0S7Cmg3IzwaIbzz0DsPr3butkAHiSbnR46VZnlGm29X041kZ33jIIMNufQSrDEt2wahSavswKJsPXHrcem4UIL22aRHYaPB0Hj0eKFplNImuHrJ5i8ulSHtu5nV7KU3oRPHLByjEWClneQugkyiHqoE0TLaLlxDSO8PkroC2qf1O5diyKtv47rTlMGd25XSlCgQQIrVwCLW0dxOwnaKmds4IAn33hMGTB/OHS6CW94F3moapiemZ/avvfOd5EV2JeN+DrSzOgj1VSjQxuJ9BmbZ0ZOYH8cev34rRFCUQs7nVJ4AvJbbscL0i0HHwyN0Mrre8+ke/duJAwD0nrOQ9yZhIiO+rYOm2UaMNkuXZpHLHL1pt+3WrwlcxMY3mJhhFZR/cnzNN8cr6+ehMgCsgfP2T8tUsLBvyxndt3SMDxgdNyZ6Ibbe4G0CEIRQnbJLIu8sdPGRYGdA1aKo7Q6iVgEfV4erPqDfApnG9qHIVTFneuSgWdaEdfmjYWXrMkhdiSvHG343VQJdp5d8dAJqfTTy6ZuxUaBYisXwWmW1MLT1vfqbByTJGVEdm0xnKRc+QRuqi88kKAawb1FE5a+1+MAbJZcJ1kaSn4JMyJnbfuZZBGOLhTipy/EixsraVWiy6dAM0+/5qlhUHxltFL1jo1b015sSSYHoaYGnekHarE1NSMhIqmZso6MCCxbZeSUitlKvdG1cXgaG5aXMlxdscCdiae51FxKEiDUDY57UAvVXMksW1X6+9kEf3k9QI9iGT7w8HaohRCPYusu8QZeLL5Ph0dQtAGxS4R9SgAENQ4ONYrJZ5M3rCrdVdBG1ssLsBsr9UaQNvvyHr7uEyeaL6ao6L5sQ+c53vhJT6noz4xNQcxlzMOcmhAadfqd1EH5N2Jbff4v4HuNMyGf5/zfkhZDT9mbFgKMRS7eO2DoAeTLJJZWJ8j56fiiG5a4ySW5fcEOs2uqt+lOWtkw0pb14FT4xrna2PXf87xMhzV44rznRqu/X5icM9XIcRfW69+5t5N0kjypzQmJwvDSTYyXc+MVDdXVF+tptOA0ODYmZBObdCPGCe23aMcBx8Y+JODuzdJgV/ZCWy14SprKFECJaIEfUW3ozfRqq1aLyOBHlq73AC5MdH+gkdCPqhHnXIC1XyqfGLw8/8HIS92q/3OGqaegwAl/7oxiIsSCJ+3wvMgOrWa47nu7uv3moaDm5UNTPOpscnB3XdIgW960X6njqp+b8yi46eM7OHe5arF3Odjcn/i4/c4ejJrKw4UfEP7/3E33Rarv6jaIMHZcJ7rZqEtdz9w8JW0vwNPt+qmhgetD5zzywI6cj+ZXfFQMUKt81JW47xP1bxsK+0Y3P/w7qtkHvZevg4NJ1H13bd9wa1tcGJwzzchxB22it1xgVTu7PrGvgfO+fUD4GB6Ev24fAdnHlkqC47+xPW7mi66qcrUVvAnH96zTObpXABNv7VYx4WdMQC3J7btcnxZxNbMVh2lVuUr8f+/dfIA+OH5ti+4jQOntAATBbXxMrOycnk0K+d1wW0agOLul1yvthRkvJ8wj9c8W2HPWw1sWznfYgY4UhD5Xg0n3DyFnBhyMzyU+Pguxzd0lGdQkC5lVSEM76fEU3a+/0pdNAuiIaXnGFXbV8hHQZc7/C6uC4p2aoUhK0gIfJ0J8ScKYBjgc5oFCm9iKtVnmUm+AM4G/JiTC8rasRNmcvDz26SQ9Hi9tSOutgK6y0VmaQAX58iiyfPcPjcuYrcDPa+cbyassRcQuBdCbHdcjBsHgmaCxsE05u5mekFA0lvKBUmvgP9Ci4U/4cVX0/HglzvgeRAaDWm75wHyNRHInD3DgK8lB76o8MsFbmE2z7/gNN9MzImH934WQnwMQv5Oa7pdqeWk5PynHOKLyYF7X2xx3Y7VdQT4dbMB7E9ZQfRLKS9VXhuqMMyAs9cA9hPGxU+St9570BGhADN0FPhmOEz9YM9HJHi3YPIDpuac5Ic5Cq/noR9K37z7UIBYuq6648F33eMFVOA98OdxMP4fKEtO2/U94iMAAAAASUVORK5CYII=","e":1},{"id":"image_9","w":35,"h":28,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAcCAYAAADr9QYhAAADMElEQVRYR8WXz08TQRTHv7Pd7bblR8ESD1wENUaJiU3swZscTPQkG2+UiyQevNmbR+tfIJ6NUQ/WeHL9C2xiCE2AUBItSAK2iSkKaUspzdofO2OmsG23hXYpFebUzbwfn743b94bsqYoXkoxgy6uxFb6slYo9Rgme13y4zuz4Y/tXJDVCWUHgLud4HH2135tY08rVFVcsrSjLM0NtrPBYZghJPT1gUgi6G4OrFxup3vk/olhbEMe2Ny1AJWTm6Ca1hFQI4xTlspasTQLSuJMQLgoldTpaJRnxLSqkbGPjgCCUN3UMxno6Uy3YKAVSjVbBFkGEpj6Pv+23kEN5tJFk+P/CmN4YuSdf2X+ofF5WjD7aQK8YOZiYcDzqdhCkAOdCoxRTW+83gF7UQwQ4JkpPVQcnVyNxE8VxgAIXfMFQPCiBsRe+mOLgTOB4RChsZtRgNw4AEr4YwsjZwbzfswXrE+XP7ZAzgzmw3XfOKP4YqTqTGFaRkYaHgZxOqpnqry1DZrLdeXSO6w3hcZ8cQAXGs/MfqMUBIhDHhBRAs3noWezHYFwpeX1JHRKj2yUjVEBjGq6r4RBcLtjzw2KHILD1K/6e0Yu2oIAeVLdJ8gSXfTu3zNdhtnZ07CxmTLB9DjsxXyhOAfW/KcZIdNGjyKrijIDhhrpCUPU2LG5uV6nbJpvqq2prhVU2sEPRVEYw6cTMlTUi6UyvsV/N5mS7SIKRdN8lABjAf/KompqC/yjW9PeejKFbN48A0mijZZ0/Sv3wxjChLFoI0S1a/MfK4oSJMzcvI4bqdRuHok/zfOPp7/39d1I+JEVe4QL/VSUgQJDtK7urehWZfjgxM9KfTnzTYdd1B5EIy6rxiowfFVeCQxLVhUNuZxWwEYy1QRiEwTmcbsmrbwKTGnikfkLeAkj9wD21AoQZQyZnIb0bv5QcY+7JzTY73rlAKKjqto07x6mRCopouAXn9HOrbBYl2FYlgWMWwHi94wKhgnr1juQJPh8VVWVdprk4KyEu/2Qq3OcFQjGr6gqL5CWq3KAOZAOtCTXCqVblLLzuk7PcR2bTUgLAtlyylKklQcboFoB4Tb+ASLIATv6FDmXAAAAAElFTkSuQmCC","e":1},{"id":"image_10","w":90,"h":79,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABPCAYAAABrs9IqAAACTklEQVR4Xu3cvYoTYQCF4fOtP9EmM8HsCtuoyLqVMHgDbrGVoJcgewfaW7hegV6Cna0gbh37LUarxc5GJJslE/GHYNaRiSj+u5PMd5q8qQJJvpd5OASSYsJwOEzLw8nDz1IqHo0KLElFOHZ8q9PpFOFgMHgglbcaLXDYd4FSetbtLm+EwWC/F6Sr1SvJ/Zv6dPGKPty4reRgS5MTa3rfvqO7r9/o5XisRxfOQTiDwJnucvgJurX7VJPVSzpcXVPr4870yPHpa3oyejt9fj1pz5DhI79BQxJHYAq9fnlzr9U6eSpOglMrgRe7O+dDspKVcMQVGPXzAHRc4+npQBuQgTYhAw20UcCU4jsaaJOAKcOigTYJmDIsGmiTgCnDooE2CZgyLBpok4Apw6KBNgmYMiwaaJOAKcOigTYJmDIsGmiTgCnDooE2CZgyLBpok4Apw6KBNgmYMiwaaJOAKcOigTYJmDIsGmiTgCnDooE2CZgyLBpok4Apw6KBNgmYMiwaaJOAKcOigTYJmDIsGmiTgCnDooE2CZgyLBpok4Apw6KBNgmYMiwaaJOAKfNt0UNxp92Y5K9G/Xx6g8E9SesxS4t8dpDuFf18OyRns57Kr3fbrfGYKOi5pHc1PrNwbw2lehVydeGzQI9CqY1iP88XTm6OC64LDfKM2HWgQZ4Ruc5XB8hzIB8VGuQ5kY8CDXIDyP+DBrkh5H9Bg9wg8t+gQW4Y+U/QIEdA/hUa5EjIP0Jn/KyOqFz919FeyR4vldrmv4vI0GmapUWRF3EznP4FiECWXypnWgEAAAAASUVORK5CYII=","e":1},{"id":"image_11","w":381,"h":297,"u":"","p":"data:image/png;base64,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","e":1},{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 24","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[68.063,3.15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662546255074,0.382559922162,0.969393382353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.282,-120.425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":86.9999924698869,"op":119.999989613637,"st":29.9999974034093,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 23","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.229,99.536,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[45.954,3.102],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.382559922162,0.770204491709,0.969393382353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.977,-113.699],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":88.9999922967808,"op":119.999989613637,"st":31.9999972303032,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 22","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100.437,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20.174,2.707],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969393382353,0.879534553079,0.382559922162,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.462,-113.021],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":88.9999922967808,"op":119.999989613637,"st":31.9999972303032,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 21","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[56.143,3.64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.384313755409,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.697,-104.68],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":91.9999920371218,"op":119.999989613637,"st":34.9999969706441,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 20","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,199.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[62.165,3.358],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.384313755409,0.768627510819,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[106.832,-96.321],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94.9999917774627,"op":119.999989613637,"st":37.9999967109851,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 19","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100.276,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[22.938,2.995],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.968627510819,0.878431432387,0.384313755409,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.969,-89.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":97.9999915178036,"op":119.999989613637,"st":40.999996451326,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 18","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[33.727,3.095],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.384313755409,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.363,-89.203],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":97.9999915178036,"op":119.999989613637,"st":40.999996451326,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 17","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[41.743,2.937],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.384313755409,0.768627510819,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[97.622,-80.782],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":100.999991258145,"op":119.999989613637,"st":43.9999961916669,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[68.063,3.15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662546255074,0.382559922162,0.969393382353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.282,-120.425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42.99999627822,"op":81.999992902652,"st":-7.9999993075758,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.229,99.536,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[45.954,3.102],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.382559922162,0.770204491709,0.969393382353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.977,-113.699],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":44.9999961051139,"op":81.999992902652,"st":-5.99999948068185,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100.437,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20.174,2.707],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969393382353,0.879534553079,0.382559922162,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.462,-113.021],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":44.9999961051139,"op":81.999992902652,"st":-5.99999948068185,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[56.143,3.64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.384313755409,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.697,-104.68],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.9999958454548,"op":81.999992902652,"st":-2.99999974034093,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Layer 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,199.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[62.165,3.358],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.384313755409,0.768627510819,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[106.832,-96.321],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":50.9999955857958,"op":81.999992902652,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100.276,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[22.938,2.995],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.968627510819,0.878431432387,0.384313755409,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.969,-89.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":53.9999953261367,"op":81.999992902652,"st":2.99999974034093,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[33.727,3.095],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.384313755409,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.363,-89.203],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":53.9999953261367,"op":81.999992902652,"st":2.99999974034093,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[41.743,2.937],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.384313755409,0.768627510819,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[97.622,-80.782],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":56.9999950664776,"op":81.999992902652,"st":5.99999948068185,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[41.743,2.937],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.384313755409,0.768627510819,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[97.622,-80.782],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20.9999981823865,"op":37.9999967109851,"st":-29.9999974034093,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[33.727,3.095],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.384313755409,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.363,-89.203],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17.9999984420456,"op":37.9999967109851,"st":-32.9999971437502,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100.276,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[22.938,2.995],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.968627510819,0.878431432387,0.384313755409,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.969,-89.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17.9999984420456,"op":37.9999967109851,"st":-32.9999971437502,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,199.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[62.165,3.358],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.384313755409,0.768627510819,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[106.832,-96.321],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":14.9999987017046,"op":37.9999967109851,"st":-35.9999968840911,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[56.143,3.64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662745098039,0.384313755409,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.697,-104.68],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":11.9999989613637,"op":37.9999967109851,"st":-38.9999966244321,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100.437,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20.174,2.707],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969393382353,0.879534553079,0.382559922162,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.462,-113.021],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8.99999922102278,"op":37.9999967109851,"st":-41.999996364773,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[99.229,99.536,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[45.954,3.102],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.382559922162,0.770204491709,0.969393382353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.977,-113.699],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8.99999922102278,"op":37.9999967109851,"st":-41.999996364773,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[68.063,3.15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.005913000013,0.005768999866,0.005768999866,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.662546255074,0.382559922162,0.969393382353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.282,-120.425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6.99999939412883,"op":37.9999967109851,"st":-43.9999961916669,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"light2","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[46]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[63]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[73]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":93,"s":[52]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":103,"s":[100]},{"t":111.999990306061,"s":[51]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[198,179.5,0],"ix":2},"a":{"a":0,"k":[234.5,142,0],"ix":1},"s":{"a":0,"k":[33.902,33.902,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"light","refId":"image_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[45]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[88]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[56]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[57]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":93,"s":[23]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":103,"s":[100]},{"t":111.999990306061,"s":[59]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199,282,0],"ix":2},"a":{"a":0,"k":[126,126.5,0],"ix":1},"s":{"a":0,"k":[32.323,32.323,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"flower","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[78.684,318.243,0],"ix":2},"a":{"a":0,"k":[19.623,46.1,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"finger","refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0.88]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":55,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":58,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":69,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":86,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":98,"s":[12.307]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":101,"s":[-0.007]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":111,"s":[12.307]},{"t":113.999990132955,"s":[-0.007]}],"ix":10},"p":{"a":0,"k":[235.192,165.108,0],"ix":2},"a":{"a":0,"k":[7.92,23.571,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"leftbrowe","parent":9,"refId":"image_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[36.704,62.945,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[36.704,67.945,0],"to":[0,0,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":8,"s":[36.704,62.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[36.704,62.945,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[36.704,67.945,0],"to":[0,0,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":32,"s":[36.704,62.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":53,"s":[36.704,62.945,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[36.704,67.945,0],"to":[0,0,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":61,"s":[36.704,62.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[36.704,62.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":83,"s":[36.704,67.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":87,"s":[36.704,62.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[36.704,62.945,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":107,"s":[36.704,67.945,0],"to":[0,0,0],"ti":[0,0,0]},{"t":110.999990392614,"s":[36.704,62.945,0]}],"ix":2},"a":{"a":0,"k":[5.897,2.794,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"rightbrowe","parent":9,"refId":"image_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[70.486,54.976,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[70.486,59.976,0],"to":[0,0,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":8,"s":[70.486,54.976,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[70.486,54.976,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[70.486,59.976,0],"to":[0,0,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":32,"s":[70.486,54.976,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":53,"s":[70.486,54.976,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":57,"s":[70.486,59.976,0],"to":[0,0,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":61,"s":[70.486,54.976,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[70.486,54.976,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":83,"s":[70.486,59.976,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":87,"s":[70.486,54.976,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[70.486,54.976,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[70.486,59.976,0],"to":[0,0,0],"ti":[0,0,0]},{"t":110.999990392614,"s":[70.486,54.976,0]}],"ix":2},"a":{"a":0,"k":[5.897,2.794,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"lefteye","parent":9,"refId":"image_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.674,73.055,0],"ix":2},"a":{"a":0,"k":[3.414,4.87,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":28,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":53,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":61,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":79,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":83,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":104,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":107,"s":[100,0,100]},{"t":110.999990392614,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"right eye","parent":9,"refId":"image_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[71.895,68.173,0],"ix":2},"a":{"a":0,"k":[3.414,4.869,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":28,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":53,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":61,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":79,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":83,"s":[100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":104,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":107,"s":[100,0,100]},{"t":110.999990392614,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"head","refId":"image_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1.216]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[7.186]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[-0.035]},"t":16,"s":[5.937]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[0.992]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[0.573]},{"i":{"x":[0.667],"y":[1.236]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[7.868]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[-0.136]},"t":52,"s":[4.11]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":59,"s":[-0.463]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":66,"s":[5.12]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":76,"s":[1.555]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":82,"s":[5.892]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":91,"s":[2.622]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":97,"s":[5.811]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":106,"s":[3.98]},{"t":112.999990219508,"s":[0.794]}],"ix":10},"p":{"a":0,"k":[201.124,162.967,0],"ix":2},"a":{"a":0,"k":[55.113,109.357,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"cup","refId":"image_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[324.484,290.727,0],"ix":2},"a":{"a":0,"k":[34.103,-1.214,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"codescroll","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,200,0],"ix":2},"a":{"a":0,"k":[200,200,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":400,"h":400,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":2,"nm":"code","refId":"image_10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[266.532,145.04,0],"ix":2},"a":{"a":0,"k":[0.553,79.236,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1.19,1.19,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":4.99999956723488,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":2,"nm":"backgorund","refId":"image_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[202.825,191.457,0],"ix":2},"a":{"a":0,"k":[190.393,148.102,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":119.999989613637,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/base/activity/BaseActivity.kt b/BaseMvvm/src/main/java/com/holo/architecture/base/activity/BaseActivity.kt new file mode 100644 index 0000000..0f6d430 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/base/activity/BaseActivity.kt @@ -0,0 +1,182 @@ +package com.holo.architecture.base.activity + +import android.graphics.Color +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.viewbinding.ViewBinding +import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.customview.customView +import com.gyf.immersionbar.ktx.immersionBar +import com.gyf.immersionbar.ktx.navigationBarHeight +import com.holo.architecture.R +import com.holo.architecture.ext.showErrToast +import com.holo.architecture.logger.KLog +import com.holo.architecture.network.ListState +import com.holo.architecture.network.NetworkStateManager +import com.holo.architecture.network.State +import com.holo.architecture.utils.ViewBindingUtil +import com.holo.architecture.utils.netstatus.NetType +import com.holo.architecture.widget.TransBehavior +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch + +/** + * @Desc Activity基类 + * @Author holo + * @Date 2022/1/7 + */ +abstract class BaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + private var loadingDialog: MaterialDialog? = null + private var dialogJob: Job? = null + + /** + * 供子类初始化view + * @param savedInstanceState Bundle? + */ + abstract fun initView(savedInstanceState: Bundle?) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ViewBindingUtil.inflateWithGeneric(this, layoutInflater) + setContentView(binding.root) + immersionBar { + transparentBar() + titleBar(R.id.title_bar) + statusBarDarkFont(true) + navigationBarColor(R.color.transparent) + navigationBarDarkIcon(true) + fullScreen(true) + } + if (bottomPaddingView() != null) { + bottomPaddingView()!!.setPadding(0, 0, 0, navigationBarHeight) + } else { + binding.root.setPadding(0, 0, 0, navigationBarHeight) + } + + initView(savedInstanceState) + observeViewModel() + NetworkStateManager.mNetworkStateCallback.observe(this) { netType -> + onNetworkStateChanged(netType) + } + initData() + } + + open fun initData() {} + + /** + * 虚拟导航栏是否需要自动padding + * @return Boolean + */ + open fun bottomPaddingView(): View? = null + + /** + * 网络变化监听 子类重写 + */ + open fun onNetworkStateChanged(netType: @NetType String) {} + + /** + * 创建LiveData数据观察者 + */ + abstract fun observeViewModel() + + protected fun observer(flow: Flow>, showLoading: Boolean = true, success: (t: T) -> Unit, error: ((code: Int) -> Unit)? = null) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + when (state) { + is State.Loading -> if (showLoading) showLoading() + is State.Success -> { + hideLoading() + success.invoke(state.data) + } + is State.Error -> { + hideLoading() + showErrToast(state.err) + error?.invoke(state.err.errCode) + } + } + } + } + } + } + + protected fun observer(flow: Flow>, loading: () -> Unit, success: (t: T) -> Unit, error: (() -> Unit)? = null) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + when (state) { + is State.Loading -> loading.invoke() + is State.Success -> { + hideLoading() + success.invoke(state.data) + } + is State.Error -> { + hideLoading() + showErrToast(state.err) + error?.invoke() + } + } + } + } + } + } + + protected fun observer(flow: Flow>, action: (t: T?) -> Unit) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + when (state) { + is State.Success -> action.invoke(state.data) + is State.Error -> action.invoke(null) + is State.Loading -> {} + } + } + } + } + } + + protected fun observerList(flow: Flow>, action: (st: ListState) -> Unit) { + lifecycleScope.launchWhenCreated { + repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + action.invoke(state) + } + } + } + } + + fun showLoading() { + if (loadingDialog == null) { + loadingDialog = MaterialDialog(this, TransBehavior) + .customView(R.layout.dialog_loading) + .cancelOnTouchOutside(false) + .cancelable(false) + } + if (loadingDialog?.isShowing != true) { + dialogJob?.cancel() + dialogJob = lifecycleScope.launch { + delay(1000) + loadingDialog?.show() + delay(5000) + KLog.d("Holo", "5s超时隐藏") + hideLoading() + } + } + } + + fun hideLoading() { + dialogJob?.cancel() + dialogJob = null + if (isDestroyed || isFinishing) return + loadingDialog?.dismiss() + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/base/bean/BaseBean.kt b/BaseMvvm/src/main/java/com/holo/architecture/base/bean/BaseBean.kt new file mode 100644 index 0000000..79bd96a --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/base/bean/BaseBean.kt @@ -0,0 +1,20 @@ +package com.holo.architecture.base.bean + +import com.google.gson.Gson + +/** + * + * + * @Author holo + * @Date 2022/1/15 + */ +open class BaseBean { + + /** + * 重写toString方法,对象直接打印json串 + * @return String + */ + override fun toString(): String { + return Gson().toJson(this) + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/base/fragment/BaseFragment.kt b/BaseMvvm/src/main/java/com/holo/architecture/base/fragment/BaseFragment.kt new file mode 100644 index 0000000..e629f62 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/base/fragment/BaseFragment.kt @@ -0,0 +1,180 @@ +package com.holo.architecture.base.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.viewbinding.ViewBinding +import com.holo.architecture.base.activity.BaseActivity +import com.holo.architecture.ext.showErrToast +import com.holo.architecture.network.ListState +import com.holo.architecture.network.State +import com.holo.architecture.utils.ViewBindingUtil +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch + +/** + * @Desc + * @Author holo + * @Date 2022/1/7 + */ +abstract class BaseFragment : Fragment() { + + //是否第一次加载 + protected var isFirst: Boolean = true + + private var _binding: VB? = null + protected val binding: VB get() = _binding!! + protected var bindNotNull = false + + /** + * 供子类初始化view + * @param savedInstanceState Bundle? + */ + abstract fun initView(savedInstanceState: Bundle?) + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + _binding = ViewBindingUtil.inflateWithGeneric(this, inflater, container, false) + bindNotNull = true + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + isFirst = true + initView(savedInstanceState) + initData() + observeViewModel() + } + + override fun onDestroyView() { + super.onDestroyView() + bindNotNull = false + _binding = null + } + + /** + * 创建观察者 + */ + abstract fun observeViewModel() + + protected fun observer(flow: Flow>, showLoading: Boolean = true, success: (t: T) -> Unit, error: (() -> Unit)? = null) { + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + when (state) { + is State.Loading -> if (showLoading) showLoading() + is State.Success -> { + hideLoading() + success.invoke(state.data) + } + is State.Error -> { + hideLoading() + showErrToast(state.err) + error?.invoke() + } + } + } + } + } + } + + protected fun observer(flow: Flow>, loading: () -> Unit, success: (t: T) -> Unit, error: (() -> Unit)? = null) { + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + when (state) { + is State.Loading -> loading.invoke() + is State.Success -> { + hideLoading() + success.invoke(state.data) + } + is State.Error -> { + hideLoading() + showErrToast(state.err) + error?.invoke() + } + } + } + } + } + } + + protected fun observer(flow: Flow>, action: (t: T?) -> Unit) { + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + when (state) { + is State.Success -> action.invoke(state.data) + is State.Error -> action.invoke(null) + is State.Loading -> {} + } + } + } + } + } + + protected fun observerObj(flow: Flow, action: (t: T?) -> Unit) { + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { action.invoke(it) } + } + } + } + + protected fun observerList(flow: Flow>, action: (st: ListState) -> Unit) { + lifecycleScope.launchWhenCreated { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + flow.collect { state -> + action.invoke(state) + } + } + } + } + + private fun showLoading() { + if (activity is BaseActivity<*>) { + (activity as BaseActivity<*>).showLoading() + } + } + + private fun hideLoading() { + if (activity is BaseActivity<*>) { + (activity as BaseActivity<*>).hideLoading() + } + } + + /** + * Fragment执行onViewCreated后触发的方法 + */ + open fun initData() {} + + /** + * 懒加载 + */ + open fun lazyLoadData() {} + + override fun onResume() { + super.onResume() + onVisible() + } + + /** + * 是否需要懒加载 + */ + private fun onVisible() { + if (lifecycle.currentState == Lifecycle.State.STARTED && isFirst) { + //延迟加载0.12秒加载 避免fragment跳转动画和渲染ui同时进行,出现些微的小卡顿 + view?.postDelayed({ + lazyLoadData() + isFirst = false + }, 120) + } + } + +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/base/repository/IRepository.kt b/BaseMvvm/src/main/java/com/holo/architecture/base/repository/IRepository.kt new file mode 100644 index 0000000..5aa6d80 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/base/repository/IRepository.kt @@ -0,0 +1,16 @@ +package com.holo.architecture.base.repository + +/** + * @Desc + * @Author holo + * @Date 2022/1/6 + */ + +/** + * Repository 是用于配置基本存储库类的接口。 + */ +interface IRepository + +interface IRemoteData + +interface ILocalData \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/base/viewmodel/BaseViewModel.kt b/BaseMvvm/src/main/java/com/holo/architecture/base/viewmodel/BaseViewModel.kt new file mode 100644 index 0000000..b3acc3d --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/base/viewmodel/BaseViewModel.kt @@ -0,0 +1,16 @@ +package com.holo.architecture.base.viewmodel + +import androidx.lifecycle.ViewModel + +/** + * @Desc + * @Author holo + * @Date 2022/1/6 + */ +open class BaseViewModel : ViewModel() { + + /** + * 分页请求,页码 + */ + protected var pageNo: Int = 1 +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/BaseCommonExt.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/BaseCommonExt.kt new file mode 100644 index 0000000..049a6f5 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/BaseCommonExt.kt @@ -0,0 +1,110 @@ +package com.holo.architecture.ext + +import android.content.Context +import android.content.res.Resources +import android.text.Html +import android.text.Spanned +import android.util.TypedValue +import android.widget.Toast +import androidx.annotation.StringRes +import androidx.fragment.app.Fragment +import com.holo.architecture.BuildConfig +import com.holo.architecture.network.AppException + +/** + * @Desc 一些基础的扩展函数 + * @Author holo + * @Date 2022/1/10 + */ + +/** + * dp值转换成px + * + * @return + */ +fun Float.dp2px(): Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics) + +/** + * sp值转换成px + * + * @return + */ +fun Float.sp2px(): Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics) + +/** + * dp值转换成px + * + * @return + */ +fun Int.dp2px(): Int = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt() + +/** + * sp值转换成px + * + * @return + */ +fun Int.sp2px(): Int = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics).toInt() + +/** + * 显示toast + * @receiver Context + * @param message CharSequence? + */ +fun Context.showToast(message: CharSequence?) { + message?.let { + Toast.makeText(this, it, Toast.LENGTH_SHORT).show() + } +} + +/** + * 显示toast + * @receiver Context + * @param message Int + */ +fun Context.showToast(@StringRes message: Int) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() +} + +fun Context.showErrToast(err: AppException) { + val msg = if (BuildConfig.DEBUG) "${err.errorMsg} Code:[${err.errCode}]" else err.errorMsg + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() +} + +/** + * Fragment中显示toast + * @receiver Fragment + * @param message CharSequence? + */ +fun Fragment.showToast(message: CharSequence?) { + activity?.run { + message?.let { + Toast.makeText(this, it, Toast.LENGTH_SHORT).show() + } + } +} + +/** + * Fragment中显示toast + * @receiver Fragment + * @param message Int + */ +fun Fragment.showToast(@StringRes message: Int) { + activity?.run { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } +} + +fun Fragment.showErrToast(err: AppException) { + activity?.run { + val msg = if (BuildConfig.DEBUG) "${err.errorMsg} Code:[${err.errCode}]" else err.errorMsg + Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() + } +} + +fun String.toHtml(flag: Int = Html.FROM_HTML_MODE_LEGACY): Spanned { + return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + Html.fromHtml(this, flag) + } else { + Html.fromHtml(this) + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/GsonExt.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/GsonExt.kt new file mode 100644 index 0000000..5de9d52 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/GsonExt.kt @@ -0,0 +1,16 @@ +package com.holo.architecture.ext + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +/** + * Gson拓展 + * + * @Author holo + * @Date 2022/3/4 + */ + +fun Gson.typedToJson(src: T): String = toJson(src) + +inline fun Gson.fromJson(json: String): T = + fromJson(json, object : TypeToken() {}.type) diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/Intents.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/Intents.kt new file mode 100644 index 0000000..9d096ca --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/Intents.kt @@ -0,0 +1,141 @@ +package com.holo.architecture.ext + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.Parcelable +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import com.holo.architecture.network.AppException +import java.io.Serializable + +/** + * 启动新的Activity,同[Activity.startActivity] + * + * 请注意,如果从 [android.app.Activity] 上下文外部调用此方法,则 Intent 必须包含 [Intent.FLAG_ACTIVITY_NEW_TASK] 启动标志。 + * 这是因为,如果不是从现有的 Activity 开始,就没有现有的任务可以放置新的 Activity,因此需要将其放置在自己的单独任务中。 + * + * ``` + * 示例: + * //不携带参数 + * startActivity() + * + * //携带参数(可连续多个键值对) + * startActivity("Key" to "Value") + * ``` + * + * @param params extras键值对 + * @receiver Context + * @param params Array> + */ +inline fun Context.startActivity(vararg params: Pair) = + this.startActivity(Intent(this, T::class.java).putExtras(params)) + + +/** + * Fragment启动新的Activity,同[Activity.startActivity] + * + * ``` + * 示例: + * //不携带参数 + * startActivity() + * + * //携带参数(可连续多个键值对) + * startActivity("Key" to "Value") + * ``` + * + * @param params extras键值对 + * @receiver Context + * @param params Array> + */ +inline fun Fragment.startActivity(vararg params: Pair) = + this.startActivity(Intent(this.activity, T::class.java).putExtras(params)) + +/** + * 启动新的Activity并返回结果 + * + * ``` + * 示例: + * //不携带参数 + * startActivityForResult{resultCode, result -> } + * + * //携带参数(可连续多个键值对) + * startActivityForResult("Key" to "Value"){resultCode, result -> } + * ``` + * + * @param params extras键值对 + * @param callback 目标[Activity.setResult]之后回调 + * @receiver Context + * @param params Array> + */ +inline fun AppCompatActivity.startActivityForResult( + vararg params: Pair, + crossinline callback: ((resultCode: Int, result: Intent?) -> Unit) +) = this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + callback.invoke(it.resultCode, it.data) +}.launch(Intent(this, T::class.java).putExtras(params)) + + +/** + * Fragment启动新的Activity并返回结果 + * + * ``` + * 示例: + * //不携带参数 + * startActivityForResult{resultCode, result -> } + * + * //携带参数(可连续多个键值对) + * startActivityForResult("Key" to "Value"){resultCode, result -> } + * ``` + * + * @param params extras键值对 + * @param callback 目标[Activity.setResult]之后回调 + * @receiver Context + * @param params Array> + */ +inline fun Fragment.startActivityForResult( + vararg params: Pair, + crossinline callback: ((resultCode: Int, result: Intent?) -> Unit) +) = this.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + callback.invoke(it.resultCode, it.data) +}.launch(Intent(this.activity, T::class.java).putExtras(params)) + + +fun Intent.putExtras(params: Array>): Intent { + if (params.isEmpty()) return this + params.forEach { + when (val value = it.second) { + null -> putExtra(it.first, null as Serializable?) + is Int -> putExtra(it.first, value) + is Long -> putExtra(it.first, value) + is CharSequence -> putExtra(it.first, value) + is String -> putExtra(it.first, value) + is Float -> putExtra(it.first, value) + is Double -> putExtra(it.first, value) + is Char -> putExtra(it.first, value) + is Short -> putExtra(it.first, value) + is Boolean -> putExtra(it.first, value) + is Serializable -> putExtra(it.first, value) + is Bundle -> putExtra(it.first, value) + is Parcelable -> putExtra(it.first, value) + is Array<*> -> when { + value.isArrayOf() -> putExtra(it.first, value) + value.isArrayOf() -> putExtra(it.first, value) + value.isArrayOf() -> putExtra(it.first, value) + else -> throw AppException("Intent extra ${it.first} has wrong type ${value.javaClass.name}") + } + is IntArray -> putExtra(it.first, value) + is LongArray -> putExtra(it.first, value) + is FloatArray -> putExtra(it.first, value) + is DoubleArray -> putExtra(it.first, value) + is CharArray -> putExtra(it.first, value) + is ShortArray -> putExtra(it.first, value) + is BooleanArray -> putExtra(it.first, value) + else -> throw AppException("Intent extra ${it.first} has wrong type ${value.javaClass.name}") + } + return@forEach + } + return this +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/LogExt.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/LogExt.kt new file mode 100644 index 0000000..d2ec4b7 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/LogExt.kt @@ -0,0 +1,16 @@ +package com.holo.architecture.ext + +import com.holo.architecture.logger.KLog + +/** + * @Desc + * @Author holo + * @Date 2022/1/10 + */ + +fun String.logV(tag: String? = null) = KLog.v(tag, this) +fun String.logD(tag: String? = null) = KLog.d(tag, this) +fun String.logI(tag: String? = null) = KLog.i(tag, this) +fun String.logW(tag: String? = null) = KLog.w(tag, this) +fun String.logE(tag: String? = null) = KLog.e(tag, this) +fun String.logA(tag: String? = null) = KLog.a(tag, this) \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/NavigationExt.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/NavigationExt.kt new file mode 100644 index 0000000..c7965f6 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/NavigationExt.kt @@ -0,0 +1,42 @@ +package com.holo.architecture.ext + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import androidx.navigation.NavController +import androidx.navigation.Navigation +import androidx.navigation.fragment.NavHostFragment + +/** + * + * + * @Author holo + * @Date 2022/2/18 + */ +fun Fragment.nav(): NavController { + return NavHostFragment.findNavController(this) +} + +fun nav(view: View): NavController { + return Navigation.findNavController(view) +} + +var lastNavTime = 0L + +/** + * 防止短时间内多次快速跳转Fragment出现的bug + * @param resId 跳转的action Id + * @param bundle 传递的参数 + * @param interval 多少毫秒内不可重复点击 默认0.5秒 + */ +fun NavController.navigateAction(resId: Int, bundle: Bundle? = null, interval: Long = 500) { + val currentTime = System.currentTimeMillis() + if (currentTime >= lastNavTime + interval) { + lastNavTime = currentTime + try { + navigate(resId, bundle) + }catch (ignore:Exception){ + //防止出现 当 fragment 中 action 的 duration设置为 0 时,连续点击两个不同的跳转会导致如下崩溃 #issue53 + } + } +} diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/SystemServiceExt.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/SystemServiceExt.kt new file mode 100644 index 0000000..26d4ed2 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/SystemServiceExt.kt @@ -0,0 +1,64 @@ +package com.holo.architecture.ext + +import android.app.* +import android.app.job.JobScheduler +import android.content.ClipboardManager +import android.content.Context +import android.hardware.SensorManager +import android.location.LocationManager +import android.media.AudioManager +import android.media.MediaRouter +import android.net.ConnectivityManager +import android.net.wifi.WifiManager +import android.os.BatteryManager +import android.os.PowerManager +import android.os.Vibrator +import android.os.storage.StorageManager +import android.telephony.CarrierConfigManager +import android.telephony.SubscriptionManager +import android.telephony.TelephonyManager +import android.view.LayoutInflater +import android.view.WindowManager +import android.view.accessibility.AccessibilityManager +import android.view.inputmethod.InputMethodManager +import androidx.core.content.ContextCompat + +/** + * @Desc 系统服务扩展 + * @Author holo + * @Date 2022/1/12 + */ + +/** + * Return system service which type is [T] + */ +inline fun Context.getSystemService(): T? = + ContextCompat.getSystemService(this, T::class.java) + +val Context.windowManager get() = getSystemService() +val Context.clipboardManager get() = getSystemService() +val Context.layoutInflater get() = getSystemService() +val Context.activityManager get() = getSystemService() +val Context.powerManager get() = getSystemService() +val Context.alarmManager get() = getSystemService() +val Context.notificationManager get() = getSystemService() +val Context.keyguardManager get() = getSystemService() +val Context.locationManager get() = getSystemService() +val Context.searchManager get() = getSystemService() +val Context.storageManager get() = getSystemService() +val Context.vibrator get() = getSystemService() +val Context.connectivityManager get() = getSystemService() +val Context.wifiManager get() = getSystemService() +val Context.audioManager get() = getSystemService() +val Context.mediaRouter get() = getSystemService() +val Context.telephonyManager get() = getSystemService() +val Context.sensorManager get() = getSystemService() +val Context.subscriptionManager get() = getSystemService() +val Context.carrierConfigManager get() = getSystemService() +val Context.inputMethodManager get() = getSystemService() +val Context.uiModeManager get() = getSystemService() +val Context.downloadManager get() = getSystemService() +val Context.batteryManager get() = getSystemService() +val Context.jobScheduler get() = getSystemService() +val Context.accessibilityManager get() = getSystemService() + diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/ViewExt.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/ViewExt.kt new file mode 100644 index 0000000..ec7e960 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/ViewExt.kt @@ -0,0 +1,187 @@ +package com.holo.architecture.ext + +import android.app.Service +import android.text.Editable +import android.text.TextWatcher +import android.view.View +import android.view.animation.CycleInterpolator +import android.view.inputmethod.InputMethodManager +import android.widget.Button +import android.widget.EditText +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.annotation.StringRes +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView + +/** + * + * + * @Author holo + * @Date 2022/2/14 + */ + +fun View.showKeyboard() { + this.requestFocus() + (this.context.getSystemService(Service.INPUT_METHOD_SERVICE) as? InputMethodManager) + ?.showSoftInput(this, 0) +} + +fun View.hideKeyboard() { + (this.context.getSystemService(Service.INPUT_METHOD_SERVICE) as? InputMethodManager) + ?.hideSoftInputFromWindow(this.windowToken, 0) +} + +fun T.isVisible(): Boolean { + return if (this is Button) { + this.visibility == View.VISIBLE && this.text.trim().isNotBlank() + } else { + this.visibility == View.VISIBLE + } +} + +fun T.isNotVisible(): Boolean = !isVisible() + +fun View.toVisible(visible: Boolean = true) { + this.visibility = if (visible) View.VISIBLE else View.GONE +} + +fun View.toGone() { + this.visibility = View.GONE +} + +fun View.toInvisible(visible: Boolean = true) { + this.visibility = if (visible) View.VISIBLE else View.INVISIBLE +} + +/** + * Extension function to simplify setting an afterTextChanged action to EditText components. + */ +fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) { + this.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(editable: Editable?) { + afterTextChanged.invoke(editable.toString()) + } + + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} + }) +} + +fun RecyclerView.onChildViewDetachedFromWindow(childViewDetached: (view: View) -> Unit) { + this.addOnChildAttachStateChangeListener(object : RecyclerView.OnChildAttachStateChangeListener { + override fun onChildViewAttachedToWindow(view: View) { + + } + + override fun onChildViewDetachedFromWindow(view: View) { + childViewDetached.invoke(view) + } + }) +} + +/** + * 检查EditText输入框是否没有输入内容 + * + * @param message 提示语 + * @return + */ +fun TextView.checkBlank(activity: AppCompatActivity, message: String): String? { + val text = this.text.toString() + if (text.isBlank()) { + activity.showToast(message) + return null + } + return text +} + +/** + * 检查EditText输入框是否没有输入内容 + * + * @param message 提示语 + * @return + */ +fun TextView.checkBlank(activity: AppCompatActivity, @StringRes message: Int): String? { + return checkBlank(activity, context.getString(message)) +} + +/** + * 检查EditText输入框是否没有输入内容 + * + * @param message 提示语 + * @return + */ +fun TextView.checkBlank(fragment: Fragment, message: String): String? { + val text = this.text.toString() + if (text.isBlank()) { + fragment.activity?.showToast(message) + return null + } + return text +} + +/** + * 检查EditText输入框是否没有输入内容 + * + * @param message 提示语 + * @return + */ +fun TextView.checkBlank(fragment: Fragment, @StringRes message: Int): String? { + return checkBlank(fragment, context.getString(message)) +} + +fun EditText.isBlank(): Boolean = this.text?.isBlank() == true + +fun EditText.isNotBlank(): Boolean = this.text?.isNotBlank() == true + + +typealias OnBackPressedTypeAlias = () -> Boolean + +/** + * 解决 Fragment 中 OnBackPressed 事件, 默认结束当前Fragment依附的Activity + * @param type true:结束当前Activity,false:响应callback回调 + */ +fun Fragment.setOnHandleBackPressed(type: Boolean = true, callback: OnBackPressedTypeAlias? = null) { + requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (type) { + requireActivity().finish() + } else { + if (callback?.invoke() == true) { + requireActivity().finish() + } + } + } + }) +} + +/** + * 防止重复点击事件 默认0.5秒内不可重复点击 + * @param interval 时间间隔 默认0.2秒 + * @param action 执行方法 + */ +var lastClickTime = 0L +fun View.clickNoRepeat(interval: Long = 200, action: (view: View) -> Unit) { + setOnClickListener { + val currentTime = System.currentTimeMillis() + if (lastClickTime != 0L && (currentTime - lastClickTime < interval)) { + return@setOnClickListener + } + lastClickTime = currentTime + action(it) + } +} + +/** + * View左右抖动动画 + * @receiver View + */ +fun View.shakeAnimate() { + this.animate() + .translationX(20f) + .setDuration(500) + .setInterpolator(CycleInterpolator(3f)) + .start() +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/ActivityStack.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/ActivityStack.kt new file mode 100644 index 0000000..cbcd156 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/ActivityStack.kt @@ -0,0 +1,85 @@ +package com.holo.architecture.ext.lifecycle + +import android.app.Activity +import java.util.* + +/** + * @Desc + * @Author holo + * @Date 2022/1/10 + */ +object ActivityStack { + + private val mActivityList = Stack() + + /** + * 获取当前栈顶的activity + */ + val currentActivity: Activity? + get() = + if (mActivityList.isEmpty()) null + else mActivityList.last() + + /** + * 栈中activity数量 + */ + val size: Int + get() = + mActivityList.size + + /** + * activity入栈 + */ + fun pushActivity(activity: Activity) { + if (mActivityList.contains(activity)) { + if (mActivityList.last() != activity) { + mActivityList.remove(activity) + mActivityList.add(activity) + } + } else { + mActivityList.add(activity) + } + } + + /** + * activity出栈 + */ + fun popActivity(activity: Activity) { + mActivityList.remove(activity) + } + + /** + * 关闭当前activity + */ + fun finishCurrentActivity() { + currentActivity?.finish() + } + + /** + * 关闭传入的activity + */ + fun finishActivity(activity: Activity) { + mActivityList.remove(activity) + activity.finish() + } + + /** + * 关闭传入的activity类名 + */ + fun finishActivity(clazz: Class<*>) { + for (activity in mActivityList) + if (activity.javaClass == clazz) + activity.finish() + } + + /** + * 关闭所有的activity + */ + fun finishAllActivity() { + for (activity in mActivityList) { + activity.finish() + } + mActivityList.clear() + } + +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/LifecycleCallBack.kt b/BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/LifecycleCallBack.kt new file mode 100644 index 0000000..74b3cf9 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/ext/lifecycle/LifecycleCallBack.kt @@ -0,0 +1,45 @@ +package com.holo.architecture.ext.lifecycle + +import android.app.Activity +import android.app.Application +import android.os.Bundle +import com.holo.architecture.logger.KLog + +/** + * @Desc + * @Author holo + * @Date 2022/1/10 + */ +internal class LifecycleCallBack : Application.ActivityLifecycleCallbacks { + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + ActivityStack.pushActivity(activity) + KLog.d(this::class.java.simpleName, "onActivityCreated : ${activity.localClassName}") + } + + override fun onActivityStarted(activity: Activity) { +// KLog.d(this::class.java.simpleName, "onActivityStarted : ${activity.localClassName}") + } + + override fun onActivityResumed(activity: Activity) { +// KLog.d(this::class.java.simpleName, "onActivityResumed : ${activity.localClassName}") + } + + override fun onActivityPaused(activity: Activity) { +// KLog.d(this::class.java.simpleName, "onActivityPaused : ${activity.localClassName}") + } + + + override fun onActivityDestroyed(activity: Activity) { + ActivityStack.popActivity(activity) + KLog.d(this::class.java.simpleName, "onActivityDestroyed : ${activity.localClassName}") + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { +// KLog.d(this::class.java.simpleName, "onActivitySaveInstanceState : ${activity.localClassName}") + } + + override fun onActivityStopped(activity: Activity) { + KLog.d(this::class.java.simpleName, "onActivityStopped : ${activity.localClassName}") + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/initializer/BaseInitializer.kt b/BaseMvvm/src/main/java/com/holo/architecture/initializer/BaseInitializer.kt new file mode 100644 index 0000000..4b9c896 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/initializer/BaseInitializer.kt @@ -0,0 +1,32 @@ +package com.holo.architecture.initializer + +import android.app.Application +import android.content.Context +import android.net.NetworkRequest +import androidx.startup.Initializer +import com.holo.architecture.ext.connectivityManager +import com.holo.architecture.ext.lifecycle.LifecycleCallBack +import com.holo.architecture.network.NetworkStateCallback + +val appContext: Application by lazy { BaseInitializer.app } + +/** + * @Desc + * @Author holo + * @Date 2022/1/10 + */ +class BaseInitializer : Initializer { + internal companion object { + lateinit var app: Application + } + + override fun create(context: Context) { + app = context.applicationContext as Application + app.registerActivityLifecycleCallbacks(LifecycleCallBack()) + + //监听网络变化状态 + appContext.connectivityManager?.registerNetworkCallback(NetworkRequest.Builder().build(), NetworkStateCallback(app)) + } + + override fun dependencies(): List>> = emptyList() +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/logger/KLog.kt b/BaseMvvm/src/main/java/com/holo/architecture/logger/KLog.kt new file mode 100644 index 0000000..e56a5ee --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/logger/KLog.kt @@ -0,0 +1,284 @@ +package com.holo.architecture.logger + +import android.text.TextUtils +import android.util.Log +import com.holo.architecture.logger.klog.BaseLog.printDefault +import com.holo.architecture.logger.klog.FileLog.printFile +import com.holo.architecture.logger.klog.JsonLog +import com.holo.architecture.logger.klog.XmlLog +import java.io.File +import java.io.PrintWriter +import java.io.StringWriter + +/** + * Created on 2020/8/11. + * @author Holo8 + */ +object KLog { + + internal val LINE_SEPARATOR = System.getProperty("line.separator") + internal const val NULL_TIPS = "Log with null object" + + private const val PARAM = "Param" + private const val NULL = "null" + private const val TAG_DEFAULT = "KLog" + + internal const val JSON_INDENT = 4 + + internal const val V = 0x1 + internal const val D = 0x2 + internal const val I = 0x3 + internal const val W = 0x4 + internal const val E = 0x5 + internal const val A = 0x6 + + private const val JSON = 0x7 + private const val XML = 0x8 + + private const val STACK_TRACE_INDEX_5 = 5 + private const val STACK_TRACE_INDEX_4 = 4 + + private var mGlobalTag: String? = null + private var mIsGlobalTagEmpty = true + private var IS_SHOW_LOG = true + + fun init(isShowLog: Boolean, tag: String? = null) { + IS_SHOW_LOG = isShowLog + mGlobalTag = tag + mIsGlobalTagEmpty = mGlobalTag.isNullOrEmpty() + } + + fun v(msg: String?) { + printLog(V, null, msg) + } + + fun v(tag: String?, vararg objects: String?) { + printLog(V, tag, *objects) + } + + fun d(msg: String?) { + printLog(D, null, msg) + } + + fun d(tag: String?, vararg objects: String?) { + printLog(D, tag, *objects) + } + + fun i(msg: String?) { + printLog(I, null, msg) + } + + fun i(tag: String?, vararg objects: String?) { + printLog(I, tag, *objects) + } + + fun w(msg: String?) { + printLog(W, null, msg) + } + + fun w(tag: String?, vararg objects: String?) { + printLog(W, tag, *objects) + } + + fun e(msg: String?) { + printLog(E, null, msg) + } + + fun e(tr: Throwable) { + e(null, "", tr) + } + + fun e(tag: String?, msg: String, tr: Throwable) { + printLog(E, tag, msg.plus("\n").plus(tr.message).plus("\n").plus(Log.getStackTraceString(tr))) + } + + fun e(tag: String?, vararg objects: String?) { + printLog(E, tag, *objects) + } + + fun a(msg: String?) { + printLog(A, null, msg) + } + + fun a(tag: String?, vararg objects: String?) { + printLog(A, tag, *objects) + } + + fun json(jsonFormat: String?) { + printLog(JSON, null, jsonFormat) + } + + fun json(tag: String?, jsonFormat: String?) { + printLog(JSON, tag, jsonFormat) + } + + fun xml(xml: String?) { + printLog(XML, null, xml) + } + + fun xml(tag: String?, xml: String?) { + printLog(XML, tag, xml) + } + + fun file(targetDirectory: File, msg: String) { + printFile(null, targetDirectory, null, msg) + } + + fun file(tag: String?, targetDirectory: File, msg: String) { + printFile(tag, targetDirectory, null, msg) + } + + fun file(tag: String?, targetDirectory: File, fileName: String?, msg: String) { + printFile(tag, targetDirectory, fileName, msg) + } + + fun debug(msg: String?) { + printDebug(null, msg) + } + + fun debug(tag: String?, vararg objects: String?) { + printDebug(tag, *objects) + } + + fun trace() { + printStackTrace() + } + + private fun printStackTrace() { + if (!IS_SHOW_LOG) { + return + } + val tr = Throwable() + val sw = StringWriter() + val pw = PrintWriter(sw) + tr.printStackTrace(pw) + pw.flush() + val message = sw.toString() + val traceString = message.split("\\n\\t".toRegex()).toTypedArray() + val sb = java.lang.StringBuilder() + sb.append("\n") + for (trace in traceString) { + if (trace.contains("at KLog")) { + continue + } + sb.append(trace).append("\n") + } + val contents = wrapperContent(STACK_TRACE_INDEX_4, null, sb.toString()) + val tag = contents[0] + val msg = contents[1] + val headString = contents[2] + printDefault(D, tag, headString + msg) + } + + private fun printLog(type: Int, tagStr: String?, vararg messages: String?) { + if (!IS_SHOW_LOG) { + return; + } + val contents: Array = wrapperContent(STACK_TRACE_INDEX_5, tagStr, *messages) + val tag = contents[0] + val msg = contents[1] + val headString = contents[2] + when (type) { + V, D, I, W, E, A -> { + printDefault(type, tag, headString + msg) + } + JSON -> JsonLog.printJson(tag, msg, headString) + XML -> XmlLog.printXml(tag, msg, headString) + } + } + + private fun wrapperContent( + stackTraceIndex: Int, + tagStr: String?, + vararg messages: String? + ): Array { + val stackTrace = Thread.currentThread().stackTrace + val targetElement = stackTrace[stackTraceIndex] + + val fileName = targetElement.fileName + var className = targetElement.className + val suffix = fileName.substring(fileName.lastIndexOf(".")) + val classNameInfo = className.split("\\.".toRegex()) + + if (classNameInfo.isNotEmpty()) { + className = classNameInfo[classNameInfo.size - 1] + suffix + } + + if (className.contains("$")) { + className = className.split("\\$".toRegex())[0] + suffix + } + + val methodName = targetElement.methodName + var lineNumber = targetElement.lineNumber + + if (lineNumber < 0) { + lineNumber = 0 + } + + var tag = tagStr ?: className + + if (mIsGlobalTagEmpty && TextUtils.isEmpty(tag)) { + tag = TAG_DEFAULT + } else if (!mIsGlobalTagEmpty) { + tag = mGlobalTag + } + + val msg = getObjectsString(*messages) + val headString = "[ ($className:$lineNumber)#$methodName ] " + return arrayOf(tag, msg, headString) + } + + private fun getObjectsString(vararg messages: String?): String { + when { + messages.isNullOrEmpty() -> { + return NULL_TIPS + } + messages.size > 1 -> { + val stringBuilder = StringBuilder() + stringBuilder.append("\n") + for (i in messages.indices) { + val msg = messages[i] + if (msg == null) { + stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append( + NULL + ).append("\n") + } else { + stringBuilder.append(PARAM).append("[").append(i).append("]").append(" = ").append(msg.toString()).append("\n") + } + } + return stringBuilder.toString() + } + else -> { + return messages[0].toString() + } + } + } + + private fun printDebug(tagStr: String?, vararg messages: String?) { + val contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, *messages) + val tag = contents[0] + val msg = contents[1] + val headString = contents[2] + printDefault(D, tag, headString + msg) + } + + private fun printFile( + tagStr: String?, + targetDirectory: File, + fileName: String?, + objectMsg: String + ) { + if (!IS_SHOW_LOG) { + return + } + val contents = wrapperContent(STACK_TRACE_INDEX_5, tagStr, objectMsg) + val tag = contents[0] + val msg = contents[1] + val headString = contents[2] + printFile(tag, targetDirectory, fileName, headString, msg) + } + + internal fun apiLog(cmdId: Int, msg: String) { + d("Request cmdId:$cmdId, body:$msg") + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/logger/KLogUtil.kt b/BaseMvvm/src/main/java/com/holo/architecture/logger/KLogUtil.kt new file mode 100644 index 0000000..cc4071d --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/logger/KLogUtil.kt @@ -0,0 +1,23 @@ +package com.holo.architecture.logger + +import android.text.TextUtils +import android.util.Log + +/** + * Created on 2020/8/11. + * @author Holo + */ +internal object KLogUtil { + + fun isEmpty(line: String): Boolean { + return TextUtils.isEmpty(line) || line == "\n" || line == "\t" || TextUtils.isEmpty(line.trim { it <= ' ' }) + } + + fun printLine(tag: String?, isTop: Boolean) { + if (isTop) { + Log.d(tag, "╔═══════════════════════════════════════════════════════════════════════════════════════") + } else { + Log.d(tag, "╚═══════════════════════════════════════════════════════════════════════════════════════") + } + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/BaseLog.kt b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/BaseLog.kt new file mode 100644 index 0000000..7349b64 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/BaseLog.kt @@ -0,0 +1,40 @@ +package com.holo.architecture.logger.klog + +import android.util.Log +import com.holo.architecture.logger.KLog + +/** + * Created on 2020/8/11. + * @author Holo + */ +internal object BaseLog { + + private const val MAX_LENGTH = 4000 + + fun printDefault(type: Int, tag: String, msg: String) { + var index = 0 + val length = msg.length + val countOfSub = length / MAX_LENGTH + if (countOfSub > 0) { + for (i in 0 until countOfSub) { + val sub = msg.substring(index, index + MAX_LENGTH) + printSub(type, tag, sub) + index += MAX_LENGTH + } + printSub(type, tag, msg.substring(index, length)) + } else { + printSub(type, tag, msg) + } + } + + private fun printSub(type: Int, tag: String, sub: String) { + when (type) { + KLog.V -> Log.v(tag, sub) + KLog.D -> Log.d(tag, sub) + KLog.I -> Log.i(tag, sub) + KLog.W -> Log.w(tag, sub) + KLog.E -> Log.e(tag, sub) + KLog.A -> Log.wtf(tag, sub) + } + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/FileLog.kt b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/FileLog.kt new file mode 100644 index 0000000..c0362d2 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/FileLog.kt @@ -0,0 +1,59 @@ +package com.holo.architecture.logger.klog + +import android.util.Log +import java.io.* +import java.util.* + +/** + * Created on 2020/8/11. + * @author Holo + */ +internal object FileLog { + + private const val FILE_PREFIX = "KLog_" + private const val FILE_FORMAT = ".log" + + fun printFile( + tag: String?, + targetDirectory: File, + fileName: String?, + headString: String, + msg: String + ) { + if (save(targetDirectory, fileName ?: getFileName(), msg)) { + Log.d(tag, headString + " save log success ! location is >>>" + targetDirectory.absolutePath + "/" + fileName) + } else { + Log.e(tag, headString + "save log fails !") + } + } + + private fun save(dic: File, fileName: String, msg: String): Boolean { + val file = File(dic, fileName) + return try { + val outputStream: OutputStream = FileOutputStream(file) + val outputStreamWriter = OutputStreamWriter(outputStream, "UTF-8") + outputStreamWriter.write(msg) + outputStreamWriter.flush() + outputStream.close() + true + } catch (e: FileNotFoundException) { + e.printStackTrace() + false + } catch (e: UnsupportedEncodingException) { + e.printStackTrace() + false + } catch (e: IOException) { + e.printStackTrace() + false + } catch (e: Exception) { + e.printStackTrace() + false + } + } + + private fun getFileName(): String { + val random = Random() + return FILE_PREFIX + java.lang.Long.toString(System.currentTimeMillis() + random.nextInt(10000)) + .substring(4) + FILE_FORMAT + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/JsonLog.kt b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/JsonLog.kt new file mode 100644 index 0000000..76c7e39 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/JsonLog.kt @@ -0,0 +1,42 @@ +package com.holo.architecture.logger.klog + +import android.util.Log +import com.holo.architecture.logger.KLog +import com.holo.architecture.logger.KLogUtil +import org.json.JSONArray +import org.json.JSONException +import org.json.JSONObject + +/** + * Created on 2020/8/11. + * @author Holo + */ +internal object JsonLog { + + fun printJson(tag: String?, msg: String, headString: String) { + var message: String = try { + when { + msg.startsWith("{") -> { + val jsonObject = JSONObject(msg) + jsonObject.toString(KLog.JSON_INDENT) + } + msg.startsWith("[") -> { + val jsonArray = JSONArray(msg) + jsonArray.toString(KLog.JSON_INDENT) + } + else -> { + msg + } + } + } catch (e: JSONException) { + msg + } + KLogUtil.printLine(tag, true) + message = headString + KLog.LINE_SEPARATOR + message + val lines = message.split(KLog.LINE_SEPARATOR!!).toTypedArray() + for (line in lines) { + Log.d(tag, "║ $line") + } + KLogUtil.printLine(tag, false) + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/XmlLog.kt b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/XmlLog.kt new file mode 100644 index 0000000..05516fc --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/logger/klog/XmlLog.kt @@ -0,0 +1,56 @@ +package com.holo.architecture.logger.klog + +import android.util.Log +import com.holo.architecture.logger.KLog +import com.holo.architecture.logger.KLogUtil.isEmpty +import com.holo.architecture.logger.KLogUtil.printLine +import java.io.StringReader +import java.io.StringWriter +import javax.xml.transform.OutputKeys +import javax.xml.transform.Source +import javax.xml.transform.TransformerFactory +import javax.xml.transform.stream.StreamResult +import javax.xml.transform.stream.StreamSource + +/** + * Created on 2020/8/11. + * @author Holo + */ +internal object XmlLog { + + fun printXml(tag: String?, xml: String?, headString: String) { + var xml = xml + if (xml != null) { + xml = formatXML(xml) + xml = """ + $headString + $xml + """.trimIndent() + } else { + xml = headString + KLog.NULL_TIPS + } + printLine(tag, true) + val lines = xml.split(KLog.LINE_SEPARATOR!!).toTypedArray() + for (line in lines) { + if (!isEmpty(line)) { + Log.d(tag, "║ $line") + } + } + printLine(tag, false) + } + + private fun formatXML(inputXML: String): String { + return try { + val xmlInput: Source = StreamSource(StringReader(inputXML)) + val xmlOutput = StreamResult(StringWriter()) + val transformer = TransformerFactory.newInstance().newTransformer() + transformer.setOutputProperty(OutputKeys.INDENT, "yes") + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2") + transformer.transform(xmlInput, xmlOutput) + xmlOutput.writer.toString().replaceFirst(">".toRegex(), ">\n") + } catch (e: Exception) { + e.printStackTrace() + inputXML + } + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/AppException.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/AppException.kt new file mode 100644 index 0000000..28d19c6 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/AppException.kt @@ -0,0 +1,25 @@ +package com.holo.architecture.network + +/** + * @Desc 自定义错误信息异常 + * + * @Author holo + * @Date 2022/1/11 + */ +data class AppException( + var errorMsg: String, //错误消息 + var errCode: Int = 0, //错误码 + var errorLog: String = "", //错误日志 + var throwable: Throwable? = null +) : RuntimeException(errorMsg) { + + constructor(msg: String, code: Int) : this(msg, code, "", null) + + constructor(error: HoloError, e: Throwable? = null) : this(error.getValue(), error.getKey(), e?.message ?: "", e) + + override fun toString(): String { + return "AppException(errorMsg='$errorMsg', errCode=$errCode, errorLog='$errorLog', throwable=${throwable?.message})" + } + + +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/BaseResponse.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/BaseResponse.kt new file mode 100644 index 0000000..42518fa --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/BaseResponse.kt @@ -0,0 +1,20 @@ +package com.holo.architecture.network + +/** + * @Desc 服务器返回数据的基类 + * 必须实现抽象方法,根据自己的业务判断返回请求结果是否成功 + * + * @Author holo + * @Date 2022/1/11 + */ +abstract class BaseResponse { + + //抽象方法,用户的基类继承该类时,需要重写该方法 + abstract fun isSuccess(): Boolean + + abstract fun getResponseData(): T + + abstract fun getResponseCode(): Int + + abstract fun getResponseMsg(): String +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/ExceptionHandle.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/ExceptionHandle.kt new file mode 100644 index 0000000..6afc0cc --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/ExceptionHandle.kt @@ -0,0 +1,63 @@ +package com.holo.architecture.network + +import android.net.ParseException +import com.google.gson.JsonParseException +import com.google.gson.stream.MalformedJsonException +import org.apache.http.conn.ConnectTimeoutException +import org.json.JSONException +import retrofit2.HttpException +import java.net.ConnectException + +/** + * @Desc 根据异常返回相关的错误信息工具类 + * + * @Author holo + * @Date 2022/1/11 + */ +object ExceptionHandle { + + fun handleException(e: Throwable?): AppException { + e?.printStackTrace() + val ex: AppException + e?.let { + when (it) { + is HttpException -> { + ex = AppException(HoloError.NETWORK_ERROR, e) + return ex + } + is JsonParseException, is JSONException, is ParseException, is MalformedJsonException -> { + ex = AppException(HoloError.PARSE_ERROR, e) + return ex + } + is ConnectException -> { + ex = AppException(HoloError.NETWORK_ERROR, e) + return ex + } + is javax.net.ssl.SSLException -> { + ex = AppException(HoloError.SSL_ERROR, e) + return ex + } + is ConnectTimeoutException -> { + ex = AppException(HoloError.TIMEOUT_ERROR, e) + return ex + } + is java.net.SocketTimeoutException -> { + ex = AppException(HoloError.TIMEOUT_ERROR, e) + return ex + } + is java.net.UnknownHostException -> { + ex = AppException(HoloError.TIMEOUT_ERROR, e) + return ex + } + is AppException -> return it + + else -> { + ex = AppException(HoloError.UNKNOWN, e) + return ex + } + } + } + ex = AppException(HoloError.UNKNOWN, e) + return ex + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/HoloError.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/HoloError.kt new file mode 100644 index 0000000..7483a9c --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/HoloError.kt @@ -0,0 +1,47 @@ +package com.holo.architecture.network + +/** + * @Desc 错误枚举类 + * + * @Author holo + * @Date 2022/1/11 + */ +enum class HoloError(private val code: Int, private val err: String) { + + /** + * 未知错误 + */ + UNKNOWN(1000, "请求失败,请稍后再试"), + /** + * 解析错误 + */ + PARSE_ERROR(1001, "解析错误,请稍后再试"), + /** + * 网络错误 + */ + NETWORK_ERROR(1002, "网络连接错误,请稍后重试"), + + /** + * 证书出错 + */ + SSL_ERROR(1004, "证书出错,请稍后再试"), + + /** + * 连接超时 + */ + TIMEOUT_ERROR(1006, "网络连接超时,请稍后重试"), + + /** + * 无网络 + */ + NO_NETWORK(1007,"请检查您的网络连接状态"); + + fun getValue(): String { + return err + } + + fun getKey(): Int { + return code + } + +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/ListState.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/ListState.kt new file mode 100644 index 0000000..f4af348 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/ListState.kt @@ -0,0 +1,46 @@ +package com.holo.architecture.network + +import com.holo.architecture.base.bean.BaseBean + +/** + * 分页查询数据通用base + * + * @Author holo + * @Date 2022/2/9 + */ +data class ListState( + /** + * 是否请求成功 + */ + val isSuccess: Boolean, + + /** + * 是否为刷新 + */ + val isRefresh: Boolean = true, + + /** + * 是否还有更多 + */ + val hasMore: Boolean = true, + + /** + * 是否没有数据 + */ + val isEmpty: Boolean = true, + + /** + * 列表数据 + */ + val listData: List = listOf(), + + /** + * 数据总条数 + */ + val total:Int = 0, + + /** + * 错误信息 + */ + val err: AppException = AppException("") +) : BaseBean() \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateCallback.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateCallback.kt new file mode 100644 index 0000000..357f97f --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateCallback.kt @@ -0,0 +1,77 @@ +package com.holo.architecture.network + +import android.app.Application +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import com.holo.architecture.logger.KLog +import com.holo.architecture.utils.netstatus.NetType +import com.holo.architecture.utils.netstatus.NetUtils + +/** + * @Desc + * + * @Author holo + * @Date 2022/1/13 + */ +class NetworkStateCallback(val application: Application) : ConnectivityManager.NetworkCallback() { + + private companion object { + const val TAG = "NetworkState" + } + + // 网络状态广播监听 + private val receiver = NetStatusReceiver() + + init { + val filter = IntentFilter() + filter.addAction("android.net.conn.CONNECTIVITY_CHANGE") + application.registerReceiver(receiver, filter) + post(NetUtils.getNetStatus(application)) + } + + override fun onAvailable(network: Network) { + super.onAvailable(network) + KLog.i(TAG, "net connect success! 网络已连接") + } + + override fun onLost(network: Network) { + super.onLost(network) + KLog.i(TAG, "net disconnect! 网络已断开连接") + post(NetType.NONE) + } + + override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { + super.onCapabilitiesChanged(network, networkCapabilities) + KLog.i(TAG, "net status change! 网络连接改变") + // 表明此网络连接成功验证 + val type = NetUtils.getNetStatus(networkCapabilities) + if (type == NetworkStateManager.mNetworkStateCallback.value) return + post(type) + } + + // 执行 + private fun post(str: @NetType String) { + NetworkStateManager.mNetworkStateCallback.postValue(str) + NetworkStateManager.netType = str + } + + /** + * Receiver方式监听网络状态变化 + * Android 7.0+动态监听还有效 + */ + inner class NetStatusReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context?, intent: Intent?) { + context ?: return + intent ?: return + val type = NetUtils.getNetStatus(context) + if (type == NetworkStateManager.mNetworkStateCallback.value) return + post(type) + } + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateManager.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateManager.kt new file mode 100644 index 0000000..2e3c592 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/NetworkStateManager.kt @@ -0,0 +1,18 @@ +package com.holo.architecture.network + +import com.holo.architecture.utils.netstatus.NetType +import com.kunminx.architecture.ui.callback.UnPeekLiveData + +/** + * 网络状态变化LiveData监听 + * + * @Author holo + * @Date 2022/1/14 + */ +object NetworkStateManager { + + val mNetworkStateCallback = UnPeekLiveData<@NetType String>() + + var netType: String = NetType.NONE + +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/network/State.kt b/BaseMvvm/src/main/java/com/holo/architecture/network/State.kt new file mode 100644 index 0000000..e9372e7 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/network/State.kt @@ -0,0 +1,43 @@ +package com.holo.architecture.network + +/** + * @Desc 包含请求状态的结果集密封类 + * + * @Author holo + * @Date 2022/1/12 + */ +sealed class State { + class Loading : State() + + data class Success(val data: T) : State() + + data class Error(val err: AppException) : State() + + fun isLoading(): Boolean = this is Loading + + fun isSuccessful(): Boolean = this is Success + + fun isFailed(): Boolean = this is Error + + companion object { + + /** + * Returns [State.Loading] instance. + */ + fun loading() = Loading() + + /** + * Returns [State.Success] instance. + * @param data Data to emit with status. + */ + fun success(data: T) = + Success(data) + + /** + * Returns [State.Error] instance. + * @param message Description of failure. + */ + fun error(message: AppException) = + Error(message) + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/DeviceIdUtil.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/DeviceIdUtil.kt new file mode 100644 index 0000000..e0f0f83 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/DeviceIdUtil.kt @@ -0,0 +1,157 @@ +package com.holo.architecture.utils + +import android.annotation.SuppressLint +import android.os.Build +import android.provider.Settings +import com.holo.architecture.initializer.appContext +import java.security.MessageDigest +import java.util.* + + +/** + * 计算设备唯一标识 + * + * @Author holo + * @Date 2022/3/23 + */ +object DeviceIdUtil { + /** + * 获得设备硬件标识 + * + * @return 设备硬件标识 + */ + fun getDeviceId(): String { + val sbDeviceId = StringBuilder() + + //获得AndroidId(无需权限) + val androidId = getAndroidId() + //获得设备序列号(无需权限) + val serial = getSERIAL() + //获得硬件UUID(根据硬件相关属性,生成UUID)(无需权限) + val uuid = getDeviceUUID().replace("-", "") + + //追加 AndroidId + if (androidId.isNotEmpty()) { + sbDeviceId.append(androidId) + sbDeviceId.append("|") + } + //追加serial + if (serial.isNotEmpty()) { + sbDeviceId.append(serial) + sbDeviceId.append("|") + } + //追加硬件uuid + if (uuid.isNotEmpty()) { + sbDeviceId.append(uuid) + } + + //生成SHA1,统一DeviceId长度 + if (sbDeviceId.isNotEmpty()) { + try { + val hash = getHashByString(sbDeviceId.toString()) + val sha1 = bytesToHex(hash) + if (sha1.isNotEmpty()) { + //返回最终的DeviceId + return sha1 + } + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + } + } + + //如果以上硬件标识数据均无法获得, + //则DeviceId默认使用系统随机数,这样保证DeviceId不为空 + return UUID.randomUUID().toString().replace("-", "") + } + + /** + * 获得设备的AndroidId + * + * @return 设备的AndroidId + */ + @SuppressLint("HardwareIds") + private fun getAndroidId(): String { + try { + return Settings.Secure.getString( + appContext.contentResolver, + Settings.Secure.ANDROID_ID + ) + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + } + return "" + } + + /** + * 获得设备序列号(如:WTK7N16923005607), 个别设备无法获取 + * Android 6.0及以上版本是需要动态申请READ_PHONE_STATE权限 + * + * @return 设备序列号 + */ + private fun getSERIAL(): String { + try { + return Build.SERIAL + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + } + return "" + } + + /** + * 获得设备硬件uuid + * 使用硬件信息,计算出一个随机数 + * + * @return 设备硬件uuid + */ + private fun getDeviceUUID(): String { + return try { + val dev = "3883756".plus(Build.BOARD.length % 10) + .plus(Build.BRAND.length % 10) + .plus(Build.DEVICE.length % 10) + .plus(Build.HARDWARE.length % 10) + .plus(Build.ID.length % 10) + .plus(Build.MODEL.length % 10) + .plus(Build.PRODUCT.length % 10) + .plus(Build.SERIAL.length % 10) + UUID( + dev.hashCode().toLong(), + Build.SERIAL.hashCode().toLong() + ).toString() + } catch (ex: java.lang.Exception) { + ex.printStackTrace() + "" + } + } + + /** + * 取SHA1 + * @param data 数据 + * @return 对应的hash值 + */ + private fun getHashByString(data: String): ByteArray { + return try { + val messageDigest: MessageDigest = MessageDigest.getInstance("SHA1") + messageDigest.reset() + messageDigest.update(data.toByteArray(charset("UTF-8"))) + messageDigest.digest() + } catch (e: Exception) { + "".toByteArray() + } + } + + /** + * 转16进制字符串 + * @param data 数据 + * @return 16进制字符串 + */ + private fun bytesToHex(data: ByteArray): String { + val sb = StringBuilder() + var stmp: String + for (n in data.indices) { + stmp = Integer.toHexString(data[n].toInt() and 0xFF) + if (stmp.length == 1) sb.append("0") + sb.append(stmp) + } + return sb.toString().toUpperCase(Locale.CHINA) + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/ViewBindingUtil.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/ViewBindingUtil.kt new file mode 100644 index 0000000..3f4f24f --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/ViewBindingUtil.kt @@ -0,0 +1,76 @@ +package com.holo.architecture.utils + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.ComponentActivity +import androidx.databinding.ViewDataBinding +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding +import java.lang.reflect.InvocationTargetException +import java.lang.reflect.ParameterizedType + +/** + * + * + * @Author holo + * @Date 2022/2/9 + */ +object ViewBindingUtil { + + @JvmStatic + fun inflateWithGeneric(genericOwner: Any, layoutInflater: LayoutInflater): VB = + withGenericBindingClass(genericOwner) { clazz -> + clazz.getMethod("inflate", LayoutInflater::class.java).invoke(null, layoutInflater) as VB + }.also { binding -> + if (genericOwner is ComponentActivity && binding is ViewDataBinding) { + binding.lifecycleOwner = genericOwner + } + } + + @JvmStatic + fun inflateWithGeneric(genericOwner: Any, parent: ViewGroup): VB = + inflateWithGeneric(genericOwner, LayoutInflater.from(parent.context), parent, false) + + @JvmStatic + fun inflateWithGeneric(genericOwner: Any, layoutInflater: LayoutInflater, parent: ViewGroup?, attachToParent: Boolean): VB = + withGenericBindingClass(genericOwner) { clazz -> + clazz.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java) + .invoke(null, layoutInflater, parent, attachToParent) as VB + }.also { binding -> + if (genericOwner is Fragment && binding is ViewDataBinding) { + binding.lifecycleOwner = genericOwner.viewLifecycleOwner + } + } + + @JvmStatic + fun bindWithGeneric(genericOwner: Any, view: View): VB = + withGenericBindingClass(genericOwner) { clazz -> + clazz.getMethod("bind", View::class.java).invoke(null, view) as VB + }.also { binding -> + if (genericOwner is Fragment && binding is ViewDataBinding) { + binding.lifecycleOwner = genericOwner.viewLifecycleOwner + } + } + + private fun withGenericBindingClass(genericOwner: Any, block: (Class) -> VB): VB { + var genericSuperclass = genericOwner.javaClass.genericSuperclass + var superclass = genericOwner.javaClass.superclass + while (superclass != null) { + if (genericSuperclass is ParameterizedType) { + genericSuperclass.actualTypeArguments.forEach { + try { + return block.invoke(it as Class) + } catch (e: NoSuchMethodException) { + } catch (e: ClassCastException) { + } catch (e: InvocationTargetException) { + throw e.targetException + } + } + } + genericSuperclass = superclass.genericSuperclass + superclass = superclass.superclass + } + throw IllegalArgumentException("There is no generic of ViewBinding.") + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ApplicationScopeViewModelProvider.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ApplicationScopeViewModelProvider.kt new file mode 100644 index 0000000..0a36082 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ApplicationScopeViewModelProvider.kt @@ -0,0 +1,33 @@ +package com.holo.architecture.utils.flowbus + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStore +import androidx.lifecycle.ViewModelStoreOwner +import com.holo.architecture.initializer.appContext + +/** + * Application级别的ViewModel功能 + * + * @Author holo + * @Date 2022/3/4 + */ +object ApplicationScopeViewModelProvider : ViewModelStoreOwner { + + private val eventViewModelStore: ViewModelStore = ViewModelStore() + + override fun getViewModelStore(): ViewModelStore { + return eventViewModelStore + } + + private val mApplicationProvider: ViewModelProvider by lazy { + ViewModelProvider( + ApplicationScopeViewModelProvider, + ViewModelProvider.AndroidViewModelFactory.getInstance(appContext) + ) + } + + fun getApplicationScopeViewModel(modelClass: Class): T { + return mApplicationProvider[modelClass] + } +} diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventBusCore.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventBusCore.kt new file mode 100644 index 0000000..d96600f --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventBusCore.kt @@ -0,0 +1,121 @@ +package com.holo.architecture.utils.flowbus + +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.holo.architecture.ext.logW +import com.holo.architecture.logger.KLog +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.launch +import kotlin.collections.set + +/** + * FlowBus核心类 + * + * @Author holo + * @Date 2022/3/4 + */ +class EventBusCore : ViewModel() { + + /** + * 正常事件 + */ + private val eventFlows: HashMap> = HashMap() + + /** + * 粘性事件 + */ + private val stickyEventFlows: HashMap> = HashMap() + + private fun getEventFlow(eventName: String, isSticky: Boolean): MutableSharedFlow { + return if (isSticky) { + stickyEventFlows[eventName] + } else { + eventFlows[eventName] + } ?: MutableSharedFlow( + replay = if (isSticky) 1 else 0, + extraBufferCapacity = Int.MAX_VALUE //避免挂起导致数据发送失败 + ).also { + if (isSticky) { + stickyEventFlows[eventName] = it + } else { + eventFlows[eventName] = it + } + } + } + + fun observeEvent( + lifecycleOwner: LifecycleOwner, + eventName: String, + minState: Lifecycle.State, + dispatcher: CoroutineDispatcher, + isSticky: Boolean, + onReceived: (T) -> Unit + ): Job { + "observe Event:$eventName".logW("FlowBus") + return lifecycleOwner.launchWhenStateAtLeast(minState) { + getEventFlow(eventName, isSticky).collect { value -> + this.launch(dispatcher) { + invokeReceived(value, onReceived) + } + } + } + } + + suspend fun observeWithoutLifecycle( + eventName: String, + isSticky: Boolean, + onReceived: (T) -> Unit + ) { + getEventFlow(eventName, isSticky).collect { value -> + invokeReceived(value, onReceived) + } + } + + + fun postEvent(eventName: String, value: Any, timeMillis: Long) { + "post Event:$eventName".logW("FlowBus") + listOfNotNull( + getEventFlow(eventName, false), + getEventFlow(eventName, true) + ).forEach { flow -> + viewModelScope.launch { + delay(timeMillis) + flow.emit(value) + } + } + } + + + fun removeStickEvent(eventName: String) { + stickyEventFlows.remove(eventName) + } + + fun clearStickEvent(eventName: String) { + stickyEventFlows[eventName]?.resetReplayCache() + } + + + private fun invokeReceived(value: Any, onReceived: (T) -> Unit) { + try { + onReceived.invoke(value as T) + } catch (e: ClassCastException) { + KLog.e("FlowBus", "class cast error on message received: $value", e) + } catch (e: Exception) { + KLog.e("FlowBus", "error on message received: $value", e) + } + } + + + fun getEventObserverCount(eventName: String): Int { + val stickyObserverCount = stickyEventFlows[eventName]?.subscriptionCount?.value ?: 0 + val normalObserverCount = eventFlows[eventName]?.subscriptionCount?.value ?: 0 + return stickyObserverCount + normalObserverCount + } + +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventUtils.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventUtils.kt new file mode 100644 index 0000000..3ae96aa --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/EventUtils.kt @@ -0,0 +1,105 @@ +package com.holo.architecture.utils.flowbus + +import androidx.lifecycle.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch + +/** + * 获取事件监听者数量 + * ``` + * getEventObserverCount(T::class.java) + * ``` + * @param event Class + * @return Int + */ +inline fun getEventObserverCount(event: Class): Int { + return ApplicationScopeViewModelProvider.getApplicationScopeViewModel(EventBusCore::class.java) + .getEventObserverCount(event.name) +} + +/** + * 获取事件监听者数量 + * ``` + * getEventObserverCount(fragment, T::class.java) + * getEventObserverCount(activity, T::class.java) + * ``` + * @param scope ViewModelStoreOwner + * @param event Class + * @return Int + */ +inline fun getEventObserverCount(scope: ViewModelStoreOwner, event: Class): Int { + return ViewModelProvider(scope).get(EventBusCore::class.java) + .getEventObserverCount(event.name) +} + + +/** + * 移除粘性事件 + *``` + * removeStickyEvent(T::class.java) + *``` + * @param event Class + */ +inline fun removeStickyEvent(event: Class) { + ApplicationScopeViewModelProvider.getApplicationScopeViewModel(EventBusCore::class.java) + .removeStickEvent(event.name) +} + +/** + * 移除粘性事件 + *``` + * removeStickyEvent(fragment, T::class.java) + * removeStickyEvent(activity, T::class.java) + *``` + * @param scope ViewModelStoreOwner + * @param event Class + */ +inline fun removeStickyEvent(scope: ViewModelStoreOwner, event: Class) { + ViewModelProvider(scope).get(EventBusCore::class.java) + .removeStickEvent(event.name) +} + + +/** + * 清除粘性事件缓存,粘性事件实例还在,但没有了ReplayCache,新观察者不会收到回调 + * ``` + * clearStickyEvent(T::class.java) + * ``` + * @param event Class + */ +inline fun clearStickyEvent(event: Class) { + ApplicationScopeViewModelProvider.getApplicationScopeViewModel(EventBusCore::class.java) + .clearStickEvent(event.name) +} + +/** + * 清除粘性事件缓存,粘性事件实例还在,但没有了ReplayCache,新观察者不会收到回调 + *``` + * clearStickyEvent(fragment, T::class.java) + * clearStickyEvent(activity, T::class.java) + *``` + * @param scope ViewModelStoreOwner + * @param event Class + */ +inline fun clearStickyEvent(scope: ViewModelStoreOwner, event: Class) { + ViewModelProvider(scope).get(EventBusCore::class.java) + .clearStickEvent(event.name) +} + + +/** + * 生命周期感知 + * @receiver LifecycleOwner + * @param minState State + * @param block [@kotlin.ExtensionFunctionType] SuspendFunction1 + * @return Job + */ +fun LifecycleOwner.launchWhenStateAtLeast( + minState: Lifecycle.State, + block: suspend CoroutineScope.() -> T +): Job { + return lifecycleScope.launch { + lifecycle.whenStateAtLeast(minState, block) + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ObserveEvent.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ObserveEvent.kt new file mode 100644 index 0000000..3b7605f --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/ObserveEvent.kt @@ -0,0 +1,145 @@ +package com.holo.architecture.utils.flowbus + +import androidx.activity.ComponentActivity +import androidx.annotation.MainThread +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStoreOwner +import kotlinx.coroutines.* + + +/** + * 监听Application全局范围事件 + * ``` + * //接收 App Scope事件 + * observeEvent { + * ... + * } + * ``` + * @receiver LifecycleOwner + * @param dispatcher CoroutineDispatcher 线程切换,默认主线程[Dispatchers.Main] + * @param minActiveState State 指定可感知的最小生命周期状态,默认[Lifecycle.State.STARTED] + * @param isSticky Boolean 是否粘性事件,默认false + * @param onReceived Function1 + * @return Job + */ +@MainThread +inline fun LifecycleOwner.observeEvent( + dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate, + minActiveState: Lifecycle.State = Lifecycle.State.STARTED, + isSticky: Boolean = false, + noinline onReceived: (T) -> Unit +): Job { + return ApplicationScopeViewModelProvider.getApplicationScopeViewModel(EventBusCore::class.java) + .observeEvent( + this, + T::class.java.name, + minActiveState, + dispatcher, + isSticky, + onReceived + ) +} + +/** + * 监听Fragment 范围事件 + * ``` + * //接收 Fragment Scope事件 + * observeEvent(scope = fragment) { + * ... + * } + * ``` + * @param scope Fragment 接收事件的fragment + * @param dispatcher CoroutineDispatcher 线程切换,默认主线程[Dispatchers.Main] + * @param minActiveState State 指定可感知的最小生命周期状态,默认[Lifecycle.State.STARTED] + * @param isSticky Boolean 是否粘性事件,默认false + * @param onReceived Function1 + * @return Job + */ +@MainThread +inline fun observeEvent( + scope: Fragment, + dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate, + minActiveState: Lifecycle.State = Lifecycle.State.STARTED, + isSticky: Boolean = false, + noinline onReceived: (T) -> Unit +): Job { + return ViewModelProvider(scope).get(EventBusCore::class.java) + .observeEvent( + scope, + T::class.java.name, + minActiveState, + dispatcher, + isSticky, + onReceived + ) +} + +/** + * Fragment 监听Activity 范围事件 + * ``` + * //接收 Activity Scope事件 + * observeEvent(scope = requireActivity()) { + * ... + * } + * ``` + * @param scope ComponentActivity Activity + * @param dispatcher CoroutineDispatcher 线程切换,默认主线程[Dispatchers.Main] + * @param minActiveState State 指定可感知的最小生命周期状态,默认[Lifecycle.State.STARTED] + * @param isSticky Boolean 是否粘性事件,默认false + * @param onReceived Function1 + * @return Job + */ +@MainThread +inline fun observeEvent( + scope: ComponentActivity, + dispatcher: CoroutineDispatcher = Dispatchers.Main.immediate, + minActiveState: Lifecycle.State = Lifecycle.State.STARTED, + isSticky: Boolean = false, + noinline onReceived: (T) -> Unit +): Job { + return ViewModelProvider(scope).get(EventBusCore::class.java) + .observeEvent( + scope, + T::class.java.name, + minActiveState, + dispatcher, + isSticky, + onReceived + ) +} + +@MainThread +inline fun observeEvent( + coroutineScope: CoroutineScope, + isSticky: Boolean = false, + noinline onReceived: (T) -> Unit +): Job { + return coroutineScope.launch { + ApplicationScopeViewModelProvider.getApplicationScopeViewModel(EventBusCore::class.java) + .observeWithoutLifecycle( + T::class.java.name, + isSticky, + onReceived + ) + } +} + +@MainThread +inline fun observeEvent( + scope: ViewModelStoreOwner, + coroutineScope: CoroutineScope, + isSticky: Boolean = false, + noinline onReceived: (T) -> Unit +): Job { + return coroutineScope.launch { + ViewModelProvider(scope).get(EventBusCore::class.java) + .observeWithoutLifecycle( + T::class.java.name, + isSticky, + onReceived + ) + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/PostEvent.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/PostEvent.kt new file mode 100644 index 0000000..bd89e72 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/flowbus/PostEvent.kt @@ -0,0 +1,37 @@ +package com.holo.architecture.utils.flowbus + +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelStoreOwner + +/** + * Application全局范围的事件 + * ``` + * 示例: + * postEvent(AppScopeEvent("form TestFragment")) + * ``` + * @param event T 事件 + * @param timeMillis Long 延迟发送,毫秒 + */ +inline fun postEvent(event: T, timeMillis: Long = 0L) { + ApplicationScopeViewModelProvider.getApplicationScopeViewModel(EventBusCore::class.java) + .postEvent(T::class.java.name, event!!, timeMillis) +} + + +/** + * 限定范围的事件 + * ``` + * 示例: + * //fragment 内部范围 + * postEvent(fragment,FragmentEvent("form TestFragment")) + * + * //Activity 内部范围 + * postEvent(requireActivity(),ActivityEvent("form TestFragment")) + * ``` + * @param event T 事件 + * @param timeMillis Long 延迟发送,毫秒 + */ +inline fun postEvent(scope: ViewModelStoreOwner, event: T, timeMillis: Long = 0L) { + ViewModelProvider(scope).get(EventBusCore::class.java) + .postEvent(T::class.java.name, event!!, timeMillis) +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetType.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetType.kt new file mode 100644 index 0000000..58335bc --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetType.kt @@ -0,0 +1,23 @@ +package com.holo.architecture.utils.netstatus + +/** + * 网络状态类型 + * + * @Author holo + * @Date 2022/1/14 + */ +@Target(AnnotationTarget.TYPE) +@kotlin.annotation.Retention(AnnotationRetention.SOURCE) +annotation class NetType { + + companion object { + // wifi + const val WIFI = "WIFI" + // 手机网络 + const val MOBILE_NET = "NET" + // 未识别网络 + const val NET_UNKNOWN = "NET_UNKNOWN" + // 没有网络 + const val NONE = "NONE" + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetUtils.kt b/BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetUtils.kt new file mode 100644 index 0000000..f637990 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/utils/netstatus/NetUtils.kt @@ -0,0 +1,117 @@ +package com.holo.architecture.utils.netstatus + +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.wifi.WifiManager +import android.os.Build +import com.holo.architecture.network.NetworkStateManager + +/** + * # 网络连接状态工具类 + * + * @author holo + * @since 2022/1/13 + */ +object NetUtils { + + /** + * 手机是否已经联网 + * @return Boolean + */ + fun isConnected(): Boolean { + return NetworkStateManager.netType != NetType.NONE + } + + /** + * 检查当前连接的网络是否为5G WI-FI + */ + fun is5GWifiConnected(context: Context): Boolean { + val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + val wifiInfo = wifiManager.connectionInfo ?: return false + // 频段 + var frequency = 0 + if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP) { + frequency = wifiInfo.frequency + } else { + val ssid = wifiInfo.ssid ?: return false + if (ssid.length < 2) return false + val sid = ssid.substring(1, ssid.length - 1) + for (scan in wifiManager.scanResults) { + if (scan.SSID == sid) { + frequency = scan.frequency + break + } + } + } + return frequency in 4900..5900 + } + + /** + * 获取当前连接Wi-Fi名 + * # 如果没有定位权限,获取到的名字将为 unknown ssid + */ + fun getConnectedWifiSSID(context: Context): String { + val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + val wifiInfo = wifiManager.connectionInfo ?: return "" + return wifiInfo.ssid.substring(1, wifiInfo.ssid.length - 1) + } + + /** + * 获取网络状态 + */ + fun getNetStatus(context: Context): @NetType String { + val manager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val net = manager.activeNetwork + val ties = manager.getNetworkCapabilities(net) ?: return NetType.NONE + return getNetStatus(ties) + } else { + val netInfo = manager.activeNetworkInfo + if (netInfo == null || !netInfo.isAvailable) { + return NetType.NONE + } + return when (netInfo.type) { + ConnectivityManager.TYPE_MOBILE -> NetType.MOBILE_NET + ConnectivityManager.TYPE_WIFI -> NetType.WIFI + else -> NetType.NET_UNKNOWN + } + } + } + + /** + * 获取网络状态 + */ + fun getNetStatus(ties: NetworkCapabilities): @NetType String { + return if (!ties.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { + NetType.NONE + } else { + if (ties.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || + ties.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE) + ) { + // 使用WI-FI + NetType.WIFI + } else if (ties.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || + ties.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) + ) { + // 使用蜂窝网络 + NetType.MOBILE_NET + } else { + // 未知网络,包括蓝牙、VPN、LoWPAN + NetType.NET_UNKNOWN + } + } + } + + /** + * 获取连接中的网络 + */ + fun getActiveNetwork(context: Context): Network? { + val manager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return manager.activeNetwork + } + return null + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/widget/TitleBar.kt b/BaseMvvm/src/main/java/com/holo/architecture/widget/TitleBar.kt new file mode 100644 index 0000000..95e42f2 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/widget/TitleBar.kt @@ -0,0 +1,128 @@ +package com.holo.architecture.widget + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Canvas +import android.graphics.Color +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.graphics.drawable.toDrawable +import com.holo.architecture.R +import com.holo.architecture.databinding.LayoutTitleBarBinding +import com.holo.architecture.ext.clickNoRepeat +import com.holo.architecture.ext.dp2px +import com.holo.architecture.ext.sp2px +import com.holo.architecture.ext.toVisible + +/** + * + * + * @Author holo + * @Date 2022/2/16 + */ +class TitleBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + ConstraintLayout(context, attrs, defStyleAttr) { + + private lateinit var binding: LayoutTitleBarBinding + + init { + initLayout(context, attrs) + } + + private fun initLayout(context: Context, attrs: AttributeSet?) { + val root = View.inflate(context, R.layout.layout_title_bar, this) + binding = LayoutTitleBarBinding.bind(root) + + val typed = context.obtainStyledAttributes(attrs, R.styleable.TitleBar) + val barBackground = typed.getDrawable(R.styleable.TitleBar_barBackground) ?: Color.WHITE.toDrawable() + + val navigationIcon = typed.getDrawable(R.styleable.TitleBar_navigationIcon) + val navigationIconTint = typed.getColor(R.styleable.TitleBar_navigationIconTint, Color.parseColor("#272727")) + + val title = typed.getString(R.styleable.TitleBar_title) + val titleTextColor = typed.getColor(R.styleable.TitleBar_titleTextColor, Color.parseColor("#272727")) + val titleTextSize = typed.getDimension(R.styleable.TitleBar_titleTextSize, 18f.sp2px()) + val titleCentered = typed.getBoolean(R.styleable.TitleBar_titleCentered, true) + + val menuIcon = typed.getDrawable(R.styleable.TitleBar_menuIcon) + + val menuTitle = typed.getString(R.styleable.TitleBar_menuTitle) + val menuTitleColor = typed.getColor(R.styleable.TitleBar_menuTitleColor, Color.parseColor("#272727")) + val menuTitleSize = typed.getDimension(R.styleable.TitleBar_menuTitleSize, 15f.sp2px()) + + val menuBtnTitle = typed.getString(R.styleable.TitleBar_menuBtnTitle) + val menuBtnTextColor = typed.getColor(R.styleable.TitleBar_menuBtnTextColor, Color.WHITE) + val menuBtnTextSize = typed.getDimension(R.styleable.TitleBar_menuBtnTextSize, 15f.sp2px()) + val menuBtnBackgroundColor = typed.getColor(R.styleable.TitleBar_menuBtnBackgroundColor, -1) + val menuBtnBackgroundDrawable = typed.getDrawable(R.styleable.TitleBar_menuBtnBackgroundDrawable) + val menuBtnCornerRadius = typed.getDimensionPixelSize(R.styleable.TitleBar_menuBtnCornerRadius, 5.dp2px()) + + val showDivider = typed.getBoolean(R.styleable.TitleBar_barShowDivider, false) + typed.recycle() + + binding.titleBar.background = barBackground + + navigationIcon?.let { icon -> + if (navigationIcon != null) { + binding.ivNavigation.setImageDrawable(icon) + } else { + binding.ivNavigation.setImageResource(R.drawable.ic_back) + } + } + binding.ivNavigation.imageTintList = ColorStateList.valueOf(navigationIconTint) + + binding.barTitle.text = title + binding.barTitle.setTextColor(titleTextColor) + binding.barTitle.paint.textSize = titleTextSize + binding.barTitle.gravity = if (titleCentered) Gravity.CENTER else Gravity.START + + binding.ivMenu.toVisible(menuIcon != null) + menuIcon?.let { icon -> + binding.ivMenu.setImageDrawable(icon) + } + + binding.tvMenu.toVisible(!menuTitle.isNullOrBlank()) + if (!menuTitle.isNullOrBlank()) { + binding.tvMenu.text = menuTitle + binding.tvMenu.setTextColor(menuTitleColor) + binding.tvMenu.paint.textSize = menuTitleSize + } + + binding.btnMenu.toVisible(!menuBtnTitle.isNullOrBlank()) + if (!menuBtnTitle.isNullOrBlank()) { + binding.btnMenu.text = menuBtnTitle + binding.btnMenu.setTextColor(menuBtnTextColor) + binding.btnMenu.paint.textSize = menuBtnTextSize + + if (menuBtnBackgroundColor != -1) { + binding.btnMenu.backgroundTintList = ColorStateList.valueOf(menuBtnBackgroundColor) + } + menuBtnBackgroundDrawable?.let { drawable -> + binding.btnMenu.background = drawable + binding.btnMenu.backgroundTintList = null + } + binding.btnMenu.cornerRadius = menuBtnCornerRadius + } + binding.barDivider.toVisible(showDivider) + } + + override fun onDraw(canvas: Canvas?) { + super.onDraw(canvas) + + val params = binding.barTitle.layoutParams as LayoutParams + params.marginStart = binding.clMenu.width + params.marginEnd = binding.clMenu.width + binding.barTitle.layoutParams = params + } + + fun setTitle(title: String) { + binding.barTitle.text = title + } + + fun init(title: String = "", backAction: () -> Unit) { + setTitle(title) + binding.ivNavigation.clickNoRepeat { backAction.invoke() } + } +} \ No newline at end of file diff --git a/BaseMvvm/src/main/java/com/holo/architecture/widget/TransBehavior.kt b/BaseMvvm/src/main/java/com/holo/architecture/widget/TransBehavior.kt new file mode 100644 index 0000000..8949939 --- /dev/null +++ b/BaseMvvm/src/main/java/com/holo/architecture/widget/TransBehavior.kt @@ -0,0 +1,120 @@ +package com.holo.architecture.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.view.LayoutInflater +import android.view.ViewGroup +import android.view.Window +import android.view.WindowManager +import androidx.annotation.ColorInt +import androidx.core.view.isVisible +import com.afollestad.materialdialogs.DialogBehavior +import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.R +import com.afollestad.materialdialogs.WhichButton +import com.afollestad.materialdialogs.actions.getActionButton +import com.afollestad.materialdialogs.internal.main.DialogLayout +import com.afollestad.materialdialogs.utils.MDUtil.getWidthAndHeight +import kotlin.math.min + +/** + * + * + * @Author holo + * @Date 2022/2/17 + */ +object TransBehavior : DialogBehavior { + override fun getThemeRes(isDark: Boolean): Int { + return if (isDark) { + R.style.MD_Dark + } else { + R.style.MD_Light + } + } + + @SuppressLint("InflateParams") + override fun createView( + creatingContext: Context, + dialogWindow: Window, + layoutInflater: LayoutInflater, + dialog: MaterialDialog + ): ViewGroup { + return layoutInflater.inflate( + R.layout.md_dialog_base, + null, + false + ) as ViewGroup + } + + override fun getDialogLayout(root: ViewGroup): DialogLayout { + return root as DialogLayout + } + + override fun setWindowConstraints( + context: Context, + window: Window, + view: DialogLayout, + maxWidth: Int? + ) { + if (maxWidth == 0) { + // Postpone + return + } + + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) + val wm = window.windowManager ?: return + val res = context.resources + val (windowWidth, windowHeight) = wm.getWidthAndHeight() + + val windowVerticalPadding = + res.getDimensionPixelSize(R.dimen.md_dialog_vertical_margin) + view.maxHeight = windowHeight - windowVerticalPadding * 2 + + val lp = WindowManager.LayoutParams().apply { + copyFrom(window.attributes) + + val windowHorizontalPadding = + res.getDimensionPixelSize(R.dimen.md_dialog_horizontal_margin) + val calculatedWidth = windowWidth - windowHorizontalPadding * 2 + val actualMaxWidth = + maxWidth ?: res.getDimensionPixelSize(R.dimen.md_dialog_max_width) + width = min(actualMaxWidth, calculatedWidth) + } + window.attributes = lp + } + + override fun setBackgroundColor( + view: DialogLayout, + @ColorInt color: Int, + cornerRadius: Float + ) { + view.cornerRadii = floatArrayOf( + cornerRadius, cornerRadius, // top left + cornerRadius, cornerRadius, // top right + 0f, 0f, // bottom left + 0f, 0f // bottom right + ) + view.background = GradientDrawable().apply { + this.cornerRadius = cornerRadius + setColor(Color.TRANSPARENT) + } + } + + override fun onPreShow(dialog: MaterialDialog) = Unit + + override fun onPostShow(dialog: MaterialDialog) { + val negativeBtn = dialog.getActionButton(WhichButton.NEGATIVE) + if (negativeBtn.isVisible) { + negativeBtn.post { negativeBtn.requestFocus() } + return + } + val positiveBtn = dialog.getActionButton(WhichButton.POSITIVE) + if (positiveBtn.isVisible) { + positiveBtn.post { positiveBtn.requestFocus() } + } + } + + override fun onDismiss(): Boolean = false +} \ No newline at end of file diff --git a/BaseMvvm/src/main/res/anim/fragment_close_enter.xml b/BaseMvvm/src/main/res/anim/fragment_close_enter.xml new file mode 100644 index 0000000..506fd30 --- /dev/null +++ b/BaseMvvm/src/main/res/anim/fragment_close_enter.xml @@ -0,0 +1,40 @@ + + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/anim/fragment_close_exit.xml b/BaseMvvm/src/main/res/anim/fragment_close_exit.xml new file mode 100644 index 0000000..be1dd7e --- /dev/null +++ b/BaseMvvm/src/main/res/anim/fragment_close_exit.xml @@ -0,0 +1,41 @@ + + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/anim/fragment_fade_enter.xml b/BaseMvvm/src/main/res/anim/fragment_fade_enter.xml new file mode 100644 index 0000000..939f446 --- /dev/null +++ b/BaseMvvm/src/main/res/anim/fragment_fade_enter.xml @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/anim/fragment_fade_exit.xml b/BaseMvvm/src/main/res/anim/fragment_fade_exit.xml new file mode 100644 index 0000000..3b4d7ae --- /dev/null +++ b/BaseMvvm/src/main/res/anim/fragment_fade_exit.xml @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/anim/fragment_fast_out_extra_slow_in.xml b/BaseMvvm/src/main/res/anim/fragment_fast_out_extra_slow_in.xml new file mode 100644 index 0000000..c3baa5d --- /dev/null +++ b/BaseMvvm/src/main/res/anim/fragment_fast_out_extra_slow_in.xml @@ -0,0 +1,18 @@ + + + + diff --git a/BaseMvvm/src/main/res/anim/fragment_open_enter.xml b/BaseMvvm/src/main/res/anim/fragment_open_enter.xml new file mode 100644 index 0000000..41dfbea --- /dev/null +++ b/BaseMvvm/src/main/res/anim/fragment_open_enter.xml @@ -0,0 +1,42 @@ + + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/anim/fragment_open_exit.xml b/BaseMvvm/src/main/res/anim/fragment_open_exit.xml new file mode 100644 index 0000000..9b97832 --- /dev/null +++ b/BaseMvvm/src/main/res/anim/fragment_open_exit.xml @@ -0,0 +1,41 @@ + + + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/drawable/ic_back.xml b/BaseMvvm/src/main/res/drawable/ic_back.xml new file mode 100644 index 0000000..6a94943 --- /dev/null +++ b/BaseMvvm/src/main/res/drawable/ic_back.xml @@ -0,0 +1,10 @@ + + + diff --git a/BaseMvvm/src/main/res/layout/dialog_loading.xml b/BaseMvvm/src/main/res/layout/dialog_loading.xml new file mode 100644 index 0000000..3b83a0d --- /dev/null +++ b/BaseMvvm/src/main/res/layout/dialog_loading.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/layout/layout_title_bar.xml b/BaseMvvm/src/main/res/layout/layout_title_bar.xml new file mode 100644 index 0000000..99e04ad --- /dev/null +++ b/BaseMvvm/src/main/res/layout/layout_title_bar.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/values/attrs.xml b/BaseMvvm/src/main/res/values/attrs.xml new file mode 100644 index 0000000..32bbc5b --- /dev/null +++ b/BaseMvvm/src/main/res/values/attrs.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/values/colors.xml b/BaseMvvm/src/main/res/values/colors.xml new file mode 100644 index 0000000..572cd52 --- /dev/null +++ b/BaseMvvm/src/main/res/values/colors.xml @@ -0,0 +1,5 @@ + + + #FFF + #00000000 + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/values/dimens.xml b/BaseMvvm/src/main/res/values/dimens.xml new file mode 100644 index 0000000..dff62f3 --- /dev/null +++ b/BaseMvvm/src/main/res/values/dimens.xml @@ -0,0 +1,6 @@ + + + + 17sp + 17sp + \ No newline at end of file diff --git a/BaseMvvm/src/main/res/values/styles.xml b/BaseMvvm/src/main/res/values/styles.xml new file mode 100644 index 0000000..fbb1911 --- /dev/null +++ b/BaseMvvm/src/main/res/values/styles.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0eedc1f --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# WanAndroid diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..0140f72 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,121 @@ +plugins { + id("com.android.application") + kotlin("android") + kotlin("kapt") + id("kotlin-parcelize") + id("dagger.hilt.android.plugin") +} + +android { + compileSdk = ModuleConfig.compileSdkVersion + + defaultConfig { + applicationId = "com.holo.wanandroid" + minSdk = ModuleConfig.minSdkVersion + targetSdk = ModuleConfig.targetSdkVersion + versionCode = ModuleConfig.versionCode + versionName = ModuleConfig.versionName + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + + javaCompileOptions.annotationProcessorOptions.arguments["room.schemaLocation"] = "$projectDir/schemas" + javaCompileOptions.annotationProcessorOptions.arguments["dagger.hilt.disableModulesHaveInstallInCheck"] = "true" + } + buildFeatures { + viewBinding = true + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + implementation("androidx.appcompat:appcompat:1.3.0") + implementation("com.google.android.material:material:1.4.0") + implementation("androidx.constraintlayout:constraintlayout:2.0.4") + //单元测试组件库 + testImplementation(Testing.jUnit) + androidTestImplementation(Testing.extJUnit) + androidTestImplementation(Testing.testRunner) + androidTestImplementation(Testing.espresso) + + // BaseMvvm + implementation(project(":BaseMvvm")) + + // Android + implementation(Android.appcompat) + implementation(Android.recyclerView) + implementation(Android.activityKtx) + implementation(Android.coreKtx) + implementation(Android.constraintLayout) + implementation(Android.swipeRefreshLayout) + implementation(Android.material) + implementation(Android.flexBox) + implementation(MaterialDialogs.core) + implementation(MaterialDialogs.bottomSheets) + implementation(MaterialDialogs.lifecycle) + + // Navigation + implementation(Navigation.uiKtx) + implementation(Navigation.fragmentKtx) + + // Architecture Components + implementation(Lifecycle.viewModel) + implementation(Lifecycle.liveData) + implementation(Lifecycle.runtimeKtx) + + // Hilt + Dagger + implementation(Hilt.hiltAndroid) + implementation(Hilt.hiltViewModel) + kapt(Hilt.daggerCompiler) + kapt(Hilt.hiltCompiler) + + // Room components + implementation(Room.runtime) + implementation(Room.ktx) + kapt(Room.compiler) + + // Coil-kt + implementation(Depends.coil) + + // Retrofit + implementation(Retrofit.retrofit) + implementation(Retrofit.convertGson) + implementation(Retrofit.loggingInterceptor) + implementation(Depends.persistentCookieJar) + + //腾讯内存映射组件 + implementation(Depends.mmkv) + + //webView组件 + implementation(Depends.agentWeb) + + //阴影 + implementation(Depends.shadowLayout) + + implementation(Depends.BRVAH) + implementation(SmartRefreshLayout.core) + implementation(SmartRefreshLayout.headerMaterial) + + implementation(Depends.lottie) + implementation(Depends.magicIndicator) + + implementation(Depends.banner) + implementation(Depends.likeView) + implementation(Depends.loadState) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..ff59496 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/holo/wanandroid/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/holo/wanandroid/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..9d4e8e4 --- /dev/null +++ b/app/src/androidTest/java/com/holo/wanandroid/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.holo.wanandroid + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.holo.wanandroid", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..fc90c73 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/Constant.kt b/app/src/main/java/com/holo/wanandroid/Constant.kt new file mode 100644 index 0000000..99f8546 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/Constant.kt @@ -0,0 +1,14 @@ +package com.holo.wanandroid + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +object Constant { + const val KEY_ID = "id" + const val KEY_TREE_BEAN = "tree_bean" + const val KEY_WEB_URL = "web_url" + const val KEY_WEB_TITLE = "web_title" +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/WanApp.kt b/app/src/main/java/com/holo/wanandroid/WanApp.kt new file mode 100644 index 0000000..11db009 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/WanApp.kt @@ -0,0 +1,18 @@ +package com.holo.wanandroid + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@HiltAndroidApp +class WanApp : Application() { + + override fun onCreate() { + super.onCreate() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/ArticleBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/ArticleBean.kt new file mode 100644 index 0000000..4923fa2 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/ArticleBean.kt @@ -0,0 +1,56 @@ +package com.holo.wanandroid.data.dto + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +data class ArticleBean( + var apkLink: String = "", + var audit: Int = 0, + var author: String = "", + var canEdit: Boolean = false, + var chapterId: Int = 0, + var chapterName: String = "", + var collect: Boolean = false, + var courseId: Int = 0, + var desc: String = "", + var descMd: String = "", + var envelopePic: String = "", + var fresh: Boolean = false, + var host: String = "", + var id: Int = 0, + var link: String = "", + var niceDate: String = "", + var niceShareDate: String = "", + var origin: String = "", + var prefix: String = "", + var projectLink: String = "", + var publishTime: Long = 0L, + var realSuperChapterId: Int = 0, + var selfVisible: Int = 0, + var shareDate: Long = 0L, + var shareUser: String = "", + var superChapterId: Int = 0, + var superChapterName: String = "", + var tags: List = listOf(), + var title: String = "", + var type: Int = 0, + var userId: Int = 0, + var visible: Int = 0, + var zan: Int = 0 +) { + fun authorShow(): String { + return if (author.isNullOrEmpty()) { + shareUser + } else { + author + } + } +} + +data class ArticleTag( + var name: String = "", + var url: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/BannerBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/BannerBean.kt new file mode 100644 index 0000000..abc5ab0 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/BannerBean.kt @@ -0,0 +1,18 @@ +package com.holo.wanandroid.data.dto + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +data class BannerBean( + val desc: String, + val id: Int, + val imagePath: String, + val isVisible: Int, + val order: Int, + val title: String, + val type: Int, + val url: String +) \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/CategoryBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/CategoryBean.kt new file mode 100644 index 0000000..36212ca --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/CategoryBean.kt @@ -0,0 +1,27 @@ +package com.holo.wanandroid.data.dto + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@Parcelize +data class CategoryBean( + val author: String = "", + val children: List = listOf(), + val courseId: Int = 0, + val cover: String = "", + val desc: String = "", + val id: Int = 0, + val lisense: String = "", + val lisenseLink: String = "", + val name: String = "", + val order: Int = 0, + val parentChapterId: Int = 0, + val userControlSetTop: Boolean = false, + val visible: Int = 0 +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/CollectBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/CollectBean.kt new file mode 100644 index 0000000..2f98803 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/CollectBean.kt @@ -0,0 +1,37 @@ +package com.holo.wanandroid.data.dto + +import com.chad.library.adapter.base.entity.MultiItemEntity + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +data class CollectBean( + val author: String, + val chapterId: Int, + val chapterName: String, + val courseId: Int, + val desc: String, + val envelopePic: String, + val id: Int, + val link: String, + val niceDate: String, + val origin: String, + val originId: Int, + val publishTime: Long, + val title: String, + val userId: Int, + val visible: Int, + val zan: Int +) : MultiItemEntity { + + override val itemType: Int + get() = if (envelopePic.isNullOrEmpty()) CollectType.COLLECT_ARTICLE else CollectType.COLLECT_PROJECTS +} + +object CollectType { + const val COLLECT_ARTICLE = 0 + const val COLLECT_PROJECTS = 1 +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/CollectUrlBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/CollectUrlBean.kt new file mode 100644 index 0000000..e7caef2 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/CollectUrlBean.kt @@ -0,0 +1,17 @@ +package com.holo.wanandroid.data.dto + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +data class CollectUrlBean( + var icon: String, + var id: Int, + var link: String, + var name: String, + var order: Int, + var userId: Int, + var visible: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/IntegralBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/IntegralBean.kt new file mode 100644 index 0000000..b737b6d --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/IntegralBean.kt @@ -0,0 +1,21 @@ +package com.holo.wanandroid.data.dto + +/** + * + * + * @Author holo + * @Date 2022/4/18 + */ +data class IntegralBean( + val coinCount: Int = 0, + val level: Int = 0, + val nickname: String = "", + val rank: String = "", + val userId: Int = 0, + val username: String = "" +){ + + fun getShowName(): String { + return nickname.ifEmpty { username } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/IntegralInfoBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/IntegralInfoBean.kt new file mode 100644 index 0000000..545a4d2 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/IntegralInfoBean.kt @@ -0,0 +1,18 @@ +package com.holo.wanandroid.data.dto + +/** + * + * + * @Author holo + * @Date 2022/4/18 + */ +data class IntegralInfoBean( + val coinCount: Int, + val date: Long, + val desc: String, + val id: Int, + val reason: String, + val type: Int, + val userId: Int, + val userName: String +) \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/NavigationBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/NavigationBean.kt new file mode 100644 index 0000000..5962d21 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/NavigationBean.kt @@ -0,0 +1,13 @@ +package com.holo.wanandroid.data.dto + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +data class NavigationBean( + val articles: List = listOf(), + val cid: Int = 0, + val name: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/ProjectBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/ProjectBean.kt new file mode 100644 index 0000000..bae3ffb --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/ProjectBean.kt @@ -0,0 +1,51 @@ +package com.holo.wanandroid.data.dto + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +data class ProjectBean( + var apkLink: String = "", + var audit: Int = 0, + var author: String = "", + var canEdit: Boolean = false, + var chapterId: Int = 0, + var chapterName: String = "", + var collect: Boolean = false, + var courseId: Int = 0, + var desc: String = "", + var descMd: String = "", + var envelopePic: String = "", + var fresh: Boolean = false, + var host: String = "", + var id: Int = 0, + var link: String = "", + var niceDate: String = "", + var niceShareDate: String = "", + var origin: String = "", + var prefix: String = "", + var projectLink: String = "", + var publishTime: Long = 0L, + var realSuperChapterId: Int = 0, + var selfVisible: Int = 0, + var shareDate: Long = 0L, + var shareUser: String = "", + var superChapterId: Int = 0, + var superChapterName: String = "", + var tags: List, + var title: String = "", + var type: Int = 0, + var userId: Int = 0, + var visible: Int = 0, + var zan: Int = 0 +){ + fun authorShow(): String { + return if (author.isNullOrEmpty()) { + shareUser + } else { + author + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/TreeBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/TreeBean.kt new file mode 100644 index 0000000..bda6d00 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/TreeBean.kt @@ -0,0 +1,27 @@ +package com.holo.wanandroid.data.dto + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +@Parcelize +data class TreeBean( + val author: String = "", + val children: List = listOf(), + val courseId: Int = 0, + val cover: String = "", + val desc: String = "", + val id: Int = 0, + val lisense: String = "", + val lisenseLink: String = "", + val name: String = "", + val order: Int = 0, + val parentChapterId: Int = 0, + val userControlSetTop: Boolean = false, + val visible: Int = 0 +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/dto/UserInfoBean.kt b/app/src/main/java/com/holo/wanandroid/data/dto/UserInfoBean.kt new file mode 100644 index 0000000..98f2767 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/dto/UserInfoBean.kt @@ -0,0 +1,33 @@ +package com.holo.wanandroid.data.dto + +import android.os.Parcelable +import com.holo.architecture.base.bean.BaseBean +import kotlinx.parcelize.Parcelize + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@Parcelize +data class UserInfoBean( + val admin: Boolean, + val chapterTops: List, + val coinCount: Int, + val collectIds: List, + val email: String, + val icon: String, + val id: Int, + val nickname: String, + val password: String, + val publicName: String, + val token: String, + val type: Int, + val username: String +) : BaseBean(), Parcelable { + + fun getShowName(): String { + return nickname.ifEmpty { username } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/remote/UserRemoteData.kt b/app/src/main/java/com/holo/wanandroid/data/remote/UserRemoteData.kt new file mode 100644 index 0000000..610f83b --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/remote/UserRemoteData.kt @@ -0,0 +1,34 @@ +package com.holo.wanandroid.data.remote + +import com.holo.architecture.base.repository.IRemoteData +import com.holo.architecture.network.ListState +import com.holo.architecture.network.State +import com.holo.wanandroid.data.dto.IntegralBean +import com.holo.wanandroid.data.dto.IntegralInfoBean +import com.holo.wanandroid.data.dto.UserInfoBean +import com.holo.wanandroid.ext.processCall +import com.holo.wanandroid.ext.processCallObj +import com.holo.wanandroid.ext.processListCall +import com.holo.wanandroid.network.WanService +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +class UserRemoteData @Inject constructor(private val service: WanService) : IRemoteData { + + suspend fun doLogin(account: String, psw: String): State = processCall { service.login(account, psw) } + + suspend fun doLogout(): State = processCall { service.logout() } + + suspend fun doRegister(account: String, psw: String, rePsw: String): State = processCall { service.register(account, psw, rePsw) } + + suspend fun getMyIntegral(): IntegralBean? = processCallObj { service.getMyIntegral() } + + suspend fun getMyIntegralList(page: Int, refresh: Boolean): ListState = processListCall(refresh) { service.getMyIntegralList(page) } + + suspend fun getIntegralRankList(page: Int, refresh: Boolean): ListState = processListCall(refresh) { service.getIntegralRankList(page) } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/data/remote/WanRemoteData.kt b/app/src/main/java/com/holo/wanandroid/data/remote/WanRemoteData.kt new file mode 100644 index 0000000..cd13fa3 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/data/remote/WanRemoteData.kt @@ -0,0 +1,60 @@ +package com.holo.wanandroid.data.remote + +import com.holo.architecture.base.repository.IRemoteData +import com.holo.architecture.network.ListState +import com.holo.architecture.network.State +import com.holo.wanandroid.data.dto.* +import com.holo.wanandroid.ext.processCall +import com.holo.wanandroid.ext.processCallObj +import com.holo.wanandroid.ext.processListCall +import com.holo.wanandroid.network.WanService +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +class WanRemoteData @Inject constructor(private val service: WanService) : IRemoteData { + + suspend fun getBannerList(): State> = processCall { service.getBanner() } + + suspend fun getTopArticleList(): List? = processCallObj { service.getTopArticleList() } + + suspend fun getArticleList(page: Int): ListState = processListCall(page) { service.getArticleList(page) } + + suspend fun getProjectCategories(): List? = processCallObj { service.getProjectCategories() } + + suspend fun getProjectList(page: Int, categoryId: Int): ListState = processListCall(page) { service.getProjectList(page, categoryId) } + + suspend fun getLatestProjectList(page: Int): ListState = processListCall(page) { service.getLatestProjectList(page) } + + suspend fun getPlazaList(page: Int): ListState = processListCall(page) { service.getPlazaList(page) } + + suspend fun getQAList(page: Int): ListState = processListCall(page) { service.getQAList(page) } + + suspend fun getTreeList(): List? = processCallObj { service.getTreeList() } + + suspend fun getTreeChildList(page: Int, treeId: Int): ListState = processListCall(page) { service.getTreeChildList(page, treeId) } + + suspend fun getNavigationList(): List? = processCallObj { service.getNavigationList() } + + suspend fun getPublicNumList(): List? = processCallObj { service.getPublicNumList() } + + suspend fun getPublicArticleList(page: Int, pnId: Int): ListState = processListCall(page) { service.getPublicNumArticleList(page, pnId) } + + suspend fun collect(id: Int): State = processCall { service.collect(id) } + + suspend fun unCollect(id: Int): State = processCall { service.unCollect(id) } + + suspend fun infoUnCollect(id: Int, originId: Int): State = processCall { service.infoUnCollect(id, originId) } + + suspend fun collectUrl(name: String, link: String) = processCall { service.collectUrl(name, link) } + + suspend fun unCollectUrl(id: Int) = processCall { service.unCollectUrl(id) } + + suspend fun getCollectList(page: Int): ListState = processListCall(page) { service.getCollectList(page) } + + suspend fun getCollectUrlList() = processCallObj { service.getCollectUrlList() } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/di/DispatcherModule.kt b/app/src/main/java/com/holo/wanandroid/di/DispatcherModule.kt new file mode 100644 index 0000000..a912a76 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/di/DispatcherModule.kt @@ -0,0 +1,26 @@ +package com.holo.wanandroid.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import javax.inject.Singleton + +/** + * @Desc + * + * @Author holo + * @Date 2022/1/12 + */ +@Module +@InstallIn(SingletonComponent::class) +object DispatcherModule { + + @Provides + @Singleton + fun provideIODispatcher(): CoroutineDispatcher { + return Dispatchers.IO + } +} diff --git a/app/src/main/java/com/holo/wanandroid/di/NetworkModule.kt b/app/src/main/java/com/holo/wanandroid/di/NetworkModule.kt new file mode 100644 index 0000000..4d05e3d --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/di/NetworkModule.kt @@ -0,0 +1,80 @@ +package com.holo.wanandroid.di + +import com.franmontiel.persistentcookiejar.PersistentCookieJar +import com.franmontiel.persistentcookiejar.cache.SetCookieCache +import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor +import com.holo.architecture.initializer.appContext +import com.holo.wanandroid.BuildConfig +import com.holo.wanandroid.network.CacheInterceptor +import com.holo.wanandroid.network.WanApi +import com.holo.wanandroid.network.WanService +import com.holo.wanandroid.network.converter.MyGsonConverterFactory +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import okhttp3.Cache +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import java.io.File +import java.util.concurrent.TimeUnit +import javax.inject.Singleton + +/** + * + * + * @Author holo + * @Date 2022/3/22 + */ +@Module +@InstallIn(SingletonComponent::class) +class NetworkModule { + + /** + * OkHttp初始化并注入 + * @return OkHttpClient + */ + @Provides + @Singleton + fun provideOkHttpClient(): OkHttpClient { + val logInterceptor = HttpLoggingInterceptor() + if (BuildConfig.DEBUG) { + logInterceptor.level = HttpLoggingInterceptor.Level.BODY + } else { + logInterceptor.level = HttpLoggingInterceptor.Level.NONE + } + return OkHttpClient.Builder() + .cache(Cache(File(appContext.cacheDir, "wan_cache"), 6 * 1024 * 1024))//设置缓存配置 缓存最大6M + .cookieJar(PersistentCookieJar(SetCookieCache(), SharedPrefsCookiePersistor(appContext))) + .addInterceptor(logInterceptor) + .addInterceptor(CacheInterceptor()) + .connectTimeout(WanApi.DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .readTimeout(WanApi.DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .writeTimeout(WanApi.DEFAULT_TIMEOUT, TimeUnit.SECONDS) + .build() + } + + /** + * Retrofit初始化并注入 + * @param okHttpClient OkHttpClient + * @return Retrofit + */ + @Provides + @Singleton + fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit { + return Retrofit.Builder() + .client(okHttpClient) + .baseUrl(WanApi.API_BASE) +// .addConverterFactory(GsonConverterFactory.create()) + .addConverterFactory(MyGsonConverterFactory.create()) + .build() + } + + @Provides + @Singleton + fun provideChainService(retrofit: Retrofit): WanService { + return retrofit.create(WanService::class.java) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/event/LoginEvent.kt b/app/src/main/java/com/holo/wanandroid/event/LoginEvent.kt new file mode 100644 index 0000000..11a373c --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/event/LoginEvent.kt @@ -0,0 +1,13 @@ +package com.holo.wanandroid.event + +import com.holo.architecture.network.State +import com.holo.wanandroid.data.dto.UserInfoBean + +/** + * + * + * @Author holo + * @Date 2022/4/18 + */ +class LoginEvent(val state: State) { +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/event/LogoutEvent.kt b/app/src/main/java/com/holo/wanandroid/event/LogoutEvent.kt new file mode 100644 index 0000000..79e715c --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/event/LogoutEvent.kt @@ -0,0 +1,12 @@ +package com.holo.wanandroid.event + +import com.holo.architecture.network.State + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +class LogoutEvent(val state: State) { +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ext/CustomViewExt.kt b/app/src/main/java/com/holo/wanandroid/ext/CustomViewExt.kt new file mode 100644 index 0000000..6f7d7c5 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ext/CustomViewExt.kt @@ -0,0 +1,195 @@ +package com.holo.wanandroid.ext + +import android.view.View +import android.widget.TextView +import androidx.activity.ComponentActivity +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewbinding.ViewBinding +import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 +import com.afollestad.materialdialogs.LayoutMode +import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.bottomsheets.BottomSheet +import com.afollestad.materialdialogs.customview.customView +import com.afollestad.materialdialogs.lifecycle.lifecycleOwner +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.google.android.material.button.MaterialButton +import com.google.android.material.textfield.TextInputEditText +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.* +import com.holo.architecture.network.ListState +import com.holo.architecture.network.State +import com.holo.architecture.utils.flowbus.observeEvent +import com.holo.loadstate.LoadService +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.UserInfoBean +import com.holo.wanandroid.event.LoginEvent +import com.holo.wanandroid.ui.discovery.NavDiscoveryFragment +import com.holo.wanandroid.ui.home.NavHomeFragment +import com.holo.wanandroid.ui.login.LoginActivity +import com.holo.wanandroid.ui.mine.NavMineFragment +import com.holo.wanandroid.ui.mine.UserViewModel +import com.holo.wanandroid.ui.projects.NavProjectsFragment +import com.holo.wanandroid.ui.publicnum.NavPublicNumFragment +import com.scwang.smart.refresh.layout.SmartRefreshLayout + +/** + * BRVAH便捷使用ViewBinding + */ +fun BaseViewHolder.getBinding(bind: (View) -> VB): VB = + itemView.getTag(Int.MIN_VALUE) as? VB ?: bind(itemView).also { itemView.setTag(Int.MIN_VALUE, it) } + +/** + * 初始化普通的toolbar 只设置标题 + */ +fun Toolbar.init(titleStr: String = ""): Toolbar { + title = titleStr + findViewById(R.id.tv_toolbar_title)?.let { + title = null + it.text = titleStr.toHtml() + } + return this +} + +/** + * 初始化有返回键的toolbar + */ +fun Toolbar.initClose( + titleStr: String = "", + backImg: Int = R.mipmap.icon_back, + onBack: (toolbar: Toolbar) -> Unit +): Toolbar { + title = titleStr.toHtml() + findViewById(R.id.tv_toolbar_title)?.let { + title = null + it.text = titleStr.toHtml() + } + setNavigationIcon(backImg) + setNavigationOnClickListener { onBack.invoke(this) } + return this +} + +/** + * 初始化首页ViewPager2 + * @receiver ViewPager2 + * @param activity AppCompatActivity + * @return ViewPager2 + */ +fun ViewPager2.initMain(activity: AppCompatActivity): ViewPager2 { + //是否可滑动 + this.isUserInputEnabled = false + this.offscreenPageLimit = 5 + //设置适配器 + adapter = object : FragmentStateAdapter(activity) { + override fun createFragment(position: Int): Fragment { + return when (position) { + 0 -> NavHomeFragment() + 1 -> NavProjectsFragment() + 2 -> NavDiscoveryFragment() + 3 -> NavPublicNumFragment() + else -> NavMineFragment() + } + } + + override fun getItemCount() = 5 + } + return this +} + +fun ViewPager2.init(activity: FragmentActivity, fragments: List>): ViewPager2 { + this.offscreenPageLimit = fragments.size + //设置适配器 + adapter = object : FragmentStateAdapter(activity) { + override fun getItemCount(): Int = fragments.size + + override fun createFragment(position: Int): Fragment = fragments[position] + } + return this +} + +fun parseListState( + st: ListState, + loadSir: LoadService?, + refresh: SmartRefreshLayout, + adapter: BaseQuickAdapter, + emptyTip: String? = null, + emptyIcon: Int? = null +) { + refresh.finishRefresh() + if (st.isSuccess) { + //成功 + when { + //是第一页 + st.isRefresh -> { + if (st.isEmpty) { + loadSir?.showEmptyCus(emptyTip, emptyIcon) + } else { + adapter.setList(st.listData) + loadSir?.hide() + } + // 如果没有更多数据,直接禁用加载更多 + if (!st.hasMore) { + adapter.loadMoreModule.loadMoreEnd() + } + } + //不是第一页 + else -> { + adapter.addData(st.listData) + if (st.hasMore) { + adapter.loadMoreModule.loadMoreComplete() + } else { + adapter.loadMoreModule.loadMoreEnd() + } + } + } + } else { + //失败 + if (st.isRefresh) { + //如果是第一页,则显示错误界面,并提示错误信息 + loadSir?.showFailedCus(st.err.errorMsg) + } else { + adapter.loadMoreModule.loadMoreFail() + } + } +} + +fun ComponentActivity.showLoginDialog() { + showToast("请先登录") + val dialog = MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).lifecycleOwner(this).show { + title(R.string.str_login_tip) + customView(R.layout.dialog_login, scrollable = true, horizontalPadding = true) + }.show { + val viewModel: UserViewModel by viewModels() + val etAccount = this.findViewById(R.id.et_account) + etAccount.requestFocus() + etAccount.postDelayed({ etAccount.showKeyboard() }, 160) + + val etPsw = this.findViewById(R.id.et_psw) + val btnLogin = this.findViewById(R.id.btn_login) + fun btnEnable() { + btnLogin.isEnabled = etAccount.isNotBlank() && etPsw.isNotBlank() + } + etAccount.afterTextChanged { btnEnable() } + etPsw.afterTextChanged { btnEnable() } + + this.findViewById(R.id.tv_to_register).clickNoRepeat { + dismiss() + startActivity() + } + + btnLogin.clickNoRepeat { + viewModel.doLogin(etAccount.text.toString(), etPsw.text.toString()) +// doLogin.invoke(etAccount.text.toString(), etPsw.text.toString()) + } + } + observeEvent { event -> + if (event.state is State.Success) { + dialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ext/LoadServiceExt.kt b/app/src/main/java/com/holo/wanandroid/ext/LoadServiceExt.kt new file mode 100644 index 0000000..607d0b1 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ext/LoadServiceExt.kt @@ -0,0 +1,88 @@ +package com.holo.wanandroid.ext + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.DrawableRes +import androidx.annotation.LayoutRes +import androidx.recyclerview.widget.RecyclerView +import com.holo.architecture.initializer.appContext +import com.holo.loadstate.LoadService +import com.holo.loadstate.LoadState +import com.holo.wanandroid.R + +/** + * + * + * @Author holo + * @Date 2022/3/5 + */ + +fun loadServiceInit(view: View, callback: () -> Unit): LoadService { + return loadServiceInit(view, R.layout.layout_loadsir_loading, callback) +} + +fun loadServiceInit(view: View, @LayoutRes loadLayoutId: Int, callback: () -> Unit): LoadService { + val loadSir = LoadState.register(view) { + showLoading() + callback.invoke() + }.config { + loading(loadLayoutId) + failed(R.layout.layout_loadsir_failed, R.id.btn_retry) + empty(R.layout.layout_loadsir_empty) + configColorBuilder { + setBaseColor(appContext.getColor(R.color.bgShimmer)) + setHighlightColor(appContext.getColor(R.color.white)) + } + } + loadSir.showLoading() + return loadSir +} + +fun loadServiceInit(recyclerView: RecyclerView, adapter: RecyclerView.Adapter<*>, callback: () -> Unit): LoadService { + return loadServiceInit(recyclerView, adapter, R.layout.layout_loadsir_loading, callback) +} + +fun loadServiceInit(recyclerView: RecyclerView, adapter: RecyclerView.Adapter<*>, @LayoutRes loadLayoutId: Int, callback: () -> Unit): LoadService { + val loadSir = LoadState.register(recyclerView, adapter) { + showLoading() + callback.invoke() + }.config { + loading(loadLayoutId) + failed(R.layout.layout_loadsir_failed, R.id.btn_retry) + empty(R.layout.layout_loadsir_empty) + configColorBuilder { + setBaseColor(appContext.getColor(R.color.bgShimmer)) + setHighlightColor(appContext.getColor(R.color.white)) + } + } + loadSir.showLoading() + return loadSir +} + +/** + * 设置空布局 + */ +fun LoadService.showEmptyCus(emptyTip: String? = null, @DrawableRes icon: Int? = null) { + this.showEmpty().apply { + emptyTip?.let { + findViewById(R.id.tv_empty).text = it + } + icon?.let { + findViewById(R.id.iv_empty).setImageResource(it) + } + } +} + +/** + * 设置错误布局 + * @param message 错误布局显示的提示内容 + */ +fun LoadService.showFailedCus(message: String? = null) { + this.showFailed().apply { + message?.let { + this.findViewById(R.id.tv_failed).text = message + } + } +} + diff --git a/app/src/main/java/com/holo/wanandroid/ext/NetworkExt.kt b/app/src/main/java/com/holo/wanandroid/ext/NetworkExt.kt new file mode 100644 index 0000000..c6716bf --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ext/NetworkExt.kt @@ -0,0 +1,153 @@ +package com.holo.wanandroid.ext + +import com.holo.architecture.base.repository.IRemoteData +import com.holo.architecture.base.repository.IRepository +import com.holo.architecture.logger.KLog +import com.holo.architecture.network.* +import com.holo.architecture.utils.netstatus.NetUtils +import com.holo.wanandroid.network.PageBean +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.onStart +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject + +/** + * + * + * @Author holo + * @Date 2022/3/23 + */ + +fun IRemoteData.buildRequestBody(vararg params: Pair): RequestBody { + val reqObj = JSONObject() + + params.forEach { (key, value) -> + if (value != null) { + reqObj.put(key, value) + } + } + + return reqObj.toString().toRequestBody("application/json;charset=utf-8".toMediaType()) +} + +/** + * 处理响应结果,转为State包裹对象 + * + * @receiver IRemoteData + * @param block SuspendFunction0> 请求函数 + * @return State + */ +inline fun IRemoteData.processCall(block: () -> BaseResponse): State { + val resp = kotlin.runCatching { + if (!NetUtils.isConnected()) { + throw AppException(HoloError.NO_NETWORK) + } + block() + }.getOrElse { + KLog.e(it) + val appError = ExceptionHandle.handleException(it) + return State.error(appError) + } + return if (resp.isSuccess()) { + State.success(resp.getResponseData()) + } else { + State.error(AppException(resp.getResponseMsg(), resp.getResponseCode())) + } +} + +/** + * 处理响应结果,不关注请求错误 + * + * @receiver IRemoteData + * @param block SuspendFunction0> 请求函数 + * @return State + */ +inline fun IRemoteData.processCallObj(block: () -> BaseResponse): R? { + val resp = kotlin.runCatching { + /*if (!NetUtils.isConnected()) { + throw AppException(HoloError.NO_NETWORK) + }*/ + block() + }.getOrElse { + KLog.e(it) + return null + } + return if (resp.isSuccess()) { + resp.getResponseData() + } else { + null + } +} + +/** + * 处理分页响应结果,转为ListState包裹对象 + * @receiver IRemoteData + * @param page Int 请求页码 + * @param pageSize Int 每页条数 + * @param block Function0>> 请求函数 + * @return ListState + */ +inline fun IRemoteData.processListCall(page: Int, block: () -> BaseResponse>): ListState { + val resp = kotlin.runCatching { + /*if (!NetUtils.isConnected()) { + return ListState(false, page == 0, err = AppException(HoloError.NO_NETWORK)) + }*/ + block() + }.getOrElse { + KLog.e(it) + val appError = ExceptionHandle.handleException(it) + return ListState(false, page == 0, err = appError) + } + + return if (resp.isSuccess()) { + return resp.getResponseData().run { + ListState(true, page == 0, !this.over, datas.isEmpty(), datas, total) + } + } else { + ListState(false, page == 0, err = AppException(resp.getResponseMsg(), resp.getResponseCode())) + } +} + +/** + * 处理分页响应结果,转为ListState包裹对象 + * @receiver IRemoteData + * @param refresh Int 是否刷新 + * @param block Function0>> 请求函数 + * @return ListState + */ +inline fun IRemoteData.processListCall(refresh: Boolean, block: () -> BaseResponse>): ListState { + val resp = kotlin.runCatching { + /*if (!NetUtils.isConnected()) { + return ListState(false, page == 0, err = AppException(HoloError.NO_NETWORK)) + }*/ + block() + }.getOrElse { + KLog.e(it) + val appError = ExceptionHandle.handleException(it) + return ListState(false, refresh, err = appError) + } + + return if (resp.isSuccess()) { + return resp.getResponseData().run { + ListState(true, refresh, !this.over, datas.isEmpty(), datas, total) + } + } else { + ListState(false, refresh, err = AppException(resp.getResponseMsg(), resp.getResponseCode())) + } +} + +/** + * Repository直接请求转Flow + * @receiver IRepository + * @param dispatcher CoroutineDispatcher + * @param action SuspendFunction0> + * @return Flow> + */ +fun IRepository.toFlow(dispatcher: CoroutineDispatcher, action: suspend () -> State): Flow> { + return flow { emit(action()) }.onStart { emit(State.loading()) }.flowOn(dispatcher) +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/initializer/StarInitializer.kt b/app/src/main/java/com/holo/wanandroid/initializer/StarInitializer.kt new file mode 100644 index 0000000..43624d9 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/initializer/StarInitializer.kt @@ -0,0 +1,28 @@ +package com.holo.wanandroid.initializer + +import android.content.Context +import androidx.startup.Initializer +import com.holo.architecture.ext.logD +import com.holo.architecture.logger.KLog +import com.holo.wanandroid.BuildConfig +import com.tencent.mmkv.MMKV + +/** + * Androidx Startup初始化组件 + * APP启动初始化三方依赖库 + * + * @Author holo + * @Date 2022/3/22 + */ +class StarInitializer : Initializer { + + override fun create(context: Context) { + //是否打印日志 + KLog.init(BuildConfig.DEBUG) + //初始化腾讯mmkv + val rootDir = MMKV.initialize(context) + "MMKV root: $rootDir".logD() + } + + override fun dependencies(): MutableList>> = mutableListOf() +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/network/ApiResponse.kt b/app/src/main/java/com/holo/wanandroid/network/ApiResponse.kt new file mode 100644 index 0000000..aa22d71 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/ApiResponse.kt @@ -0,0 +1,24 @@ +package com.holo.wanandroid.network + +import com.holo.architecture.network.BaseResponse + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +data class ApiResponse( + val errorCode: Int = 0, + val data: T, + val errorMsg: String? = "" +) : BaseResponse() { + + override fun isSuccess() = errorCode == 0 + + override fun getResponseData() = data + + override fun getResponseCode() = errorCode + + override fun getResponseMsg() = errorMsg ?: "" +} diff --git a/app/src/main/java/com/holo/wanandroid/network/CacheInterceptor.kt b/app/src/main/java/com/holo/wanandroid/network/CacheInterceptor.kt new file mode 100644 index 0000000..cc0ed40 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/CacheInterceptor.kt @@ -0,0 +1,22 @@ +package com.holo.wanandroid.network + +import okhttp3.Interceptor +import okhttp3.Response + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +class CacheInterceptor(var day: Int = 7) : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val response = chain.proceed(chain.request()) + val maxStale = 60 * 60 * 24 * day + response.newBuilder() + .removeHeader("Pragma") + .header("Cache-Control", "public, only-if-cached, max-stale=$maxStale") + .build() + return response + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/network/PageBean.kt b/app/src/main/java/com/holo/wanandroid/network/PageBean.kt new file mode 100644 index 0000000..c91db67 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/PageBean.kt @@ -0,0 +1,17 @@ +package com.holo.wanandroid.network + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +data class PageBean( + val curPage: Int, + val datas: List, + val offset: Int, + val over: Boolean, + val pageCount: Int, + val size: Int, + val total: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/network/WanApi.kt b/app/src/main/java/com/holo/wanandroid/network/WanApi.kt new file mode 100644 index 0000000..eacb0d7 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/WanApi.kt @@ -0,0 +1,69 @@ +package com.holo.wanandroid.network + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +object WanApi { + + /** + * 默认请求超时时间 + */ + const val DEFAULT_TIMEOUT: Long = 10L + + const val API_BASE = "https://www.wanandroid.com" + + const val API_LOGIN = "user/login" + + const val API_LOGOUT = "user/logout/json" + + const val API_REGISTER = "user/register" + + const val API_GET_MY_INTEGRAL = "lg/coin/userinfo/json" + + const val API_GET_MY_INTEGRAL_LIST = "lg/coin/list/{page}/json" + + const val API_GET_RANK_LIST = "coin/rank/{page}/json" + + const val API_GET_BANNER = "banner/json" + + const val API_GET_TOP_ARTICLE_LIST = "article/top/json" + + const val API_GET_ARTICLE_LIST = "article/list/{page}/json" + + const val API_GET_PROJECT_CATEGORY = "project/tree/json" + + const val API_GET_PROJECT_LIST = "project/list/{page}/json" + + const val API_GET_LATEST_PROJECT_LIST = "article/listproject/{page}/json" + + const val API_GET_PLAZA_LIST = "user_article/list/{page}/json" + + const val API_GET_QA_LIST = "wenda/list/{page}/json" + + const val API_GET_TREE_LIST = "tree/json" + + const val API_GET_TREE_CHILD_LIST = "article/list/{page}/json" + + const val API_GET_NAVIGATION_LIST = "navi/json" + + const val API_GET_PUBLIC_NUM_LIST = "wxarticle/chapters/json" + + const val API_GET_PUBLIC_NUM_ARTICLE_LIST = "wxarticle/list/{id}/{page}/json" + + const val API_COLLECT = "lg/collect/{id}/json" + + const val API_UN_COLLECT = "lg/uncollect_originId/{id}/json" + + const val API_INFO_UN_COLLECT = "lg/uncollect/{id}/json" + + const val API_COLLECT_URL = "lg/collect/addtool/json" + + const val API_UN_COLLECT_URL = "lg/collect/deletetool/json" + + const val API_GET_COLLECT_LIST = "lg/collect/list/{page}/json" + + const val API_GET_COLLECT_URL_LIST = "lg/collect/usertools/json" +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/network/WanService.kt b/app/src/main/java/com/holo/wanandroid/network/WanService.kt new file mode 100644 index 0000000..c6ed279 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/WanService.kt @@ -0,0 +1,232 @@ +package com.holo.wanandroid.network + +import com.holo.wanandroid.data.dto.* +import retrofit2.http.* + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +interface WanService { + + /** + * 用户登录 + * @param username String 用户名 + * @param psw String 密码 + * @return ApiResponse + */ + @FormUrlEncoded + @POST(WanApi.API_LOGIN) + suspend fun login( + @Field("username") username: String, + @Field("password") psw: String + ): ApiResponse + + @GET(WanApi.API_LOGOUT) + suspend fun logout(): ApiResponse + + /** + * 注册 + * @param username String 用户名 + * @param psw String 密码 + * @param rePsw String 重复密码 + * @return ApiResponse + */ + @FormUrlEncoded + @POST(WanApi.API_REGISTER) + suspend fun register( + @Field("username") username: String, + @Field("password") psw: String, + @Field("repassword") rePsw: String + ): ApiResponse + + /** + * 获取我的积分 + * @return ApiResponse + */ + @GET(WanApi.API_GET_MY_INTEGRAL) + suspend fun getMyIntegral(): ApiResponse + + /** + * 获取我的积分获得详情 + * @param page Int 页码,开始位置:1 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_MY_INTEGRAL_LIST) + suspend fun getMyIntegralList(@Path("page") page: Int): ApiResponse> + + /** + * 获取积分排行榜 + * @param page Int 页码,开始位置:1 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_RANK_LIST) + suspend fun getIntegralRankList(@Path("page") page: Int): ApiResponse> + + /** + * 获取banner数据 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_BANNER) + suspend fun getBanner(): ApiResponse> + + /** + * 获取置顶文章集合数据 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_TOP_ARTICLE_LIST) + suspend fun getTopArticleList(): ApiResponse> + + /** + * 获取首页文章数据 + * @param page Int 页码,开始位置:0 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_ARTICLE_LIST) + suspend fun getArticleList(@Path("page") page: Int): ApiResponse> + + + /** + * 项目分类标题 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_PROJECT_CATEGORY) + suspend fun getProjectCategories(): ApiResponse> + + /** + * 根据分类id获取项目数据 + * @param page Int 页码,开始位置:0 + * @param categoryId Int 分类id + * @return ApiResponse> + */ + @GET(WanApi.API_GET_PROJECT_LIST) + suspend fun getProjectList(@Path("page") page: Int, @Query("cid") categoryId: Int): ApiResponse> + + /** + * 获取最新项目数据 + * @param page Int 页码,开始位置:0 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_LATEST_PROJECT_LIST) + suspend fun getLatestProjectList(@Path("page") page: Int): ApiResponse> + + /** + * 广场列表数据 + * @param page Int 页码,开始位置:0 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_PLAZA_LIST) + suspend fun getPlazaList(@Path("page") page: Int): ApiResponse> + + /** + * 问答列表数据 + * @param page Int 页码,开始位置:0 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_QA_LIST) + suspend fun getQAList(@Path("page") page: Int): ApiResponse> + + /** + * 获取体系数据 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_TREE_LIST) + suspend fun getTreeList(): ApiResponse> + + /** + * 知识体系下的文章数据 + * @param page Int 页码,开始位置:0 + * @param cid Int 体系id + * @return ApiResponse> + */ + @GET(WanApi.API_GET_TREE_CHILD_LIST) + suspend fun getTreeChildList(@Path("page") page: Int, @Query("cid") cid: Int): ApiResponse> + + /** + * 获取导航数据 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_NAVIGATION_LIST) + suspend fun getNavigationList(): ApiResponse> + + + /** + * 公众号分类 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_PUBLIC_NUM_LIST) + suspend fun getPublicNumList(): ApiResponse> + + /** + * 获取公众号数据 + * @param page Int 页码,开始位置:0 + * @param id Int 公众号id + * @return ApiResponse> + */ + @GET(WanApi.API_GET_PUBLIC_NUM_ARTICLE_LIST) + suspend fun getPublicNumArticleList(@Path("page") page: Int, @Path("id") id: Int): ApiResponse> + + /** + * 收藏站内文章 + * @param id Int 内容id + * @return ApiResponse + */ + @POST(WanApi.API_COLLECT) + suspend fun collect(@Path("id") id: Int): ApiResponse + + /** + * 取消收藏站内文章 + * @param id Int 收藏id + * @return ApiResponse + */ + @POST(WanApi.API_UN_COLLECT) + suspend fun unCollect(@Path("id") id: Int): ApiResponse + + /** + * 收藏页取消收藏 + * @param id Int 收藏id,拼接在链接上 + * @param originId Int 代表的是你收藏之前的那篇文章本身的id; 但是收藏支持主动添加,这种情况下,没有originId则为-1 + * @return ApiResponse + */ + @FormUrlEncoded + @POST(WanApi.API_INFO_UN_COLLECT) + suspend fun infoUnCollect(@Path("id") id: Int, @Field("originId") originId: Int): ApiResponse + + /** + * 收藏网址 + * @param name String 网址名称 + * @param link String 地址 + * @return ApiResponse + */ + @POST(WanApi.API_COLLECT_URL) + suspend fun collectUrl( + @Query("name") name: String, + @Query("link") link: String + ): ApiResponse + + /** + * 取消收藏网址 + * @param id Int 收藏id + * @return ApiResponse + */ + @POST(WanApi.API_UN_COLLECT_URL) + suspend fun unCollectUrl(@Query("id") id: Int): ApiResponse + + /** + * 获取收藏文章数据 + * @param page Int 页码,开始位置:0 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_COLLECT_LIST) + suspend fun getCollectList(@Path("page") page: Int): ApiResponse> + + /** + * 获取收藏网址数据 + * @return ApiResponse> + */ + @GET(WanApi.API_GET_COLLECT_URL_LIST) + suspend fun getCollectUrlList(): ApiResponse> + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/network/converter/MyGsonConverterFactory.java b/app/src/main/java/com/holo/wanandroid/network/converter/MyGsonConverterFactory.java new file mode 100644 index 0000000..2a94879 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/converter/MyGsonConverterFactory.java @@ -0,0 +1,64 @@ +package com.holo.wanandroid.network.converter; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.reflect.TypeToken; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.Converter; +import retrofit2.Retrofit; + +/** + * A {@linkplain Converter.Factory converter} which uses Gson for JSON. + * + *

Because Gson is so flexible in the types it supports, this converter assumes that it can + * handle all types. If you are mixing JSON serialization with something else (such as protocol + * buffers), you must {@linkplain Retrofit.Builder#addConverterFactory(Converter.Factory) add this + * instance} last to allow the other converters a chance to see their types. + */ +public final class MyGsonConverterFactory extends Converter.Factory { + /** + * Create an instance using a default {@link Gson} instance for conversion. Encoding to JSON and + * decoding from JSON (when no charset is specified by a header) will use UTF-8. + */ + public static MyGsonConverterFactory create() { + return create(new Gson()); + } + + /** + * Create an instance using {@code gson} for conversion. Encoding to JSON and decoding from JSON + * (when no charset is specified by a header) will use UTF-8. + */ + @SuppressWarnings("ConstantConditions") // Guarding public API nullability. + public static MyGsonConverterFactory create(Gson gson) { + if (gson == null) throw new NullPointerException("gson == null"); + return new MyGsonConverterFactory(gson); + } + + private final Gson gson; + + private MyGsonConverterFactory(Gson gson) { + this.gson = gson; + } + + @Override + public Converter responseBodyConverter( + Type type, Annotation[] annotations, Retrofit retrofit) { + TypeAdapter adapter = gson.getAdapter(TypeToken.get(type)); + return new ResponseBodyConverter<>(gson, adapter); + } + + @Override + public Converter requestBodyConverter( + Type type, + Annotation[] parameterAnnotations, + Annotation[] methodAnnotations, + Retrofit retrofit) { + TypeAdapter adapter = gson.getAdapter(TypeToken.get(type)); + return new RequestBodyConverter<>(gson, adapter); + } +} diff --git a/app/src/main/java/com/holo/wanandroid/network/converter/RequestBodyConverter.java b/app/src/main/java/com/holo/wanandroid/network/converter/RequestBodyConverter.java new file mode 100644 index 0000000..7c31b49 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/converter/RequestBodyConverter.java @@ -0,0 +1,41 @@ +package com.holo.wanandroid.network.converter; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonWriter; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okio.Buffer; +import retrofit2.Converter; + +final class RequestBodyConverter implements Converter { + private static final MediaType MEDIA_TYPE = MediaType.get("application/json; charset=UTF-8"); + private static final Charset UTF_8 = StandardCharsets.UTF_8; + + private final Gson gson; + private final TypeAdapter adapter; + + RequestBodyConverter(Gson gson, TypeAdapter adapter) { + this.gson = gson; + this.adapter = adapter; + } + + @Override + public RequestBody convert(@NonNull T value) throws IOException { + Buffer buffer = new Buffer(); + Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8); + JsonWriter jsonWriter = gson.newJsonWriter(writer); + adapter.write(jsonWriter, value); + jsonWriter.close(); + return RequestBody.create(MEDIA_TYPE, buffer.readByteString()); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/network/converter/ResponseBodyConverter.java b/app/src/main/java/com/holo/wanandroid/network/converter/ResponseBodyConverter.java new file mode 100644 index 0000000..f595c86 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/network/converter/ResponseBodyConverter.java @@ -0,0 +1,71 @@ +package com.holo.wanandroid.network.converter; + + +import static java.nio.charset.StandardCharsets.UTF_8; + +import com.google.gson.Gson; +import com.google.gson.JsonIOException; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.holo.architecture.network.AppException; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; + +import okhttp3.MediaType; +import okhttp3.ResponseBody; +import retrofit2.Converter; + +/** + * @Author holo + * @Date 2022/1/27 + */ +public class ResponseBodyConverter implements Converter { + private final Gson gson; + private final TypeAdapter adapter; + + ResponseBodyConverter(Gson gson, TypeAdapter adapter) { + this.gson = gson; + this.adapter = adapter; + } + + @Override + public T convert(ResponseBody value) throws IOException { + String response = value.string(); + + JsonReader jsonReader = null; + MediaType mediaType = value.contentType(); + Charset charset = mediaType != null ? mediaType.charset(UTF_8) : UTF_8; + InputStream inputStream = new ByteArrayInputStream(response.getBytes()); + jsonReader = gson.newJsonReader(new InputStreamReader(inputStream, charset)); + + try { + T result = adapter.read(jsonReader); + if (jsonReader.peek() != JsonToken.END_DOCUMENT) { + throw new JsonIOException("JSON document was not fully consumed."); + } + return result; + } catch (Exception ex) { + JSONObject jsonObject = null; + try { + jsonObject = new JSONObject(response); + } catch (JSONException e) { + e.printStackTrace(); + } + int code = jsonObject != null ? jsonObject.optInt("errorCode") : 0; + String message = jsonObject != null ? jsonObject.optString("errorMsg") : ""; + + throw new AppException(message, code); + } finally { + value.close(); + } + } +} + diff --git a/app/src/main/java/com/holo/wanandroid/repository/UserRepository.kt b/app/src/main/java/com/holo/wanandroid/repository/UserRepository.kt new file mode 100644 index 0000000..926028e --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/repository/UserRepository.kt @@ -0,0 +1,33 @@ +package com.holo.wanandroid.repository + +import com.holo.architecture.base.repository.IRepository +import com.holo.wanandroid.data.remote.UserRemoteData +import com.holo.wanandroid.ext.toFlow +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +class UserRepository @Inject constructor( + private val remote: UserRemoteData, + private val ioDispatcher: CoroutineDispatcher +) : IRepository { + + suspend fun doLogin(account: String, psw: String) = toFlow(ioDispatcher) { remote.doLogin(account, psw) } + + suspend fun doLogout() = toFlow(ioDispatcher) { remote.doLogout() } + + suspend fun doRegister(account: String, psw: String, rePsw: String) = toFlow(ioDispatcher) { remote.doRegister(account, psw, rePsw) } + + suspend fun getMyIntegral() = flow { emit(remote.getMyIntegral()) }.flowOn(ioDispatcher) + + suspend fun getMyIntegralList(page: Int, refresh: Boolean) = flow { emit(remote.getMyIntegralList(page, refresh)) }.flowOn(ioDispatcher) + + suspend fun getIntegralRankList(page: Int, refresh: Boolean) = flow { emit(remote.getIntegralRankList(page, refresh)) }.flowOn(ioDispatcher) +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/repository/WanRepository.kt b/app/src/main/java/com/holo/wanandroid/repository/WanRepository.kt new file mode 100644 index 0000000..63f7d0b --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/repository/WanRepository.kt @@ -0,0 +1,61 @@ +package com.holo.wanandroid.repository + +import com.holo.architecture.base.repository.IRepository +import com.holo.wanandroid.data.remote.WanRemoteData +import com.holo.wanandroid.ext.toFlow +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +class WanRepository @Inject constructor( + private val remote: WanRemoteData, + private val ioDispatcher: CoroutineDispatcher +) : IRepository { + + fun getBannerList() = toFlow(ioDispatcher) { remote.getBannerList() } + + fun getTopArticleList() = flow { emit(remote.getTopArticleList()) }.flowOn(ioDispatcher) + + fun getArticleList(page: Int) = flow { emit(remote.getArticleList(page)) }.flowOn(ioDispatcher) + + fun getProjectCategories() = flow { emit(remote.getProjectCategories()) }.flowOn(ioDispatcher) + + fun getProjectList(page: Int, categoryId: Int) = flow { emit(remote.getProjectList(page, categoryId)) }.flowOn(ioDispatcher) + + fun getLatestProjectList(page: Int) = flow { emit(remote.getLatestProjectList(page)) }.flowOn(ioDispatcher) + + suspend fun getPlazaList(page: Int) = flow { emit(remote.getPlazaList(page)) }.flowOn(ioDispatcher) + + suspend fun getQAList(page: Int) = flow { emit(remote.getQAList(page)) }.flowOn(ioDispatcher) + + suspend fun getTreeList() = flow { emit(remote.getTreeList()) }.flowOn(ioDispatcher) + + suspend fun getTreeChildList(page: Int, treeId: Int) = flow { emit(remote.getTreeChildList(page, treeId)) }.flowOn(ioDispatcher) + + suspend fun getNavigationList() = flow { emit(remote.getNavigationList()) }.flowOn(ioDispatcher) + + suspend fun getPublicNumList() = flow { emit(remote.getPublicNumList()) }.flowOn(ioDispatcher) + + suspend fun getPublicArticleList(page: Int, pnId: Int) = flow { emit(remote.getPublicArticleList(page, pnId)) }.flowOn(ioDispatcher) + + suspend fun collect(id: Int) = toFlow(ioDispatcher) { remote.collect(id) } + + suspend fun unCollect(id: Int) = toFlow(ioDispatcher) { remote.unCollect(id) } + + suspend fun infoUnCollect(id: Int, originId: Int) = toFlow(ioDispatcher) { remote.infoUnCollect(id, originId) } + + suspend fun collectUrl(name: String, link: String) = toFlow(ioDispatcher) { remote.collectUrl(name, link) } + + suspend fun unCollectUrl(id: Int) = toFlow(ioDispatcher) { remote.unCollectUrl(id) } + + suspend fun getCollectList(page: Int) = flow { emit(remote.getCollectList(page)) }.flowOn(ioDispatcher) + + suspend fun getCollectUrlList(page: Int) = flow { emit(remote.getCollectUrlList()) }.flowOn(ioDispatcher) +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/MainActivity.kt b/app/src/main/java/com/holo/wanandroid/ui/MainActivity.kt new file mode 100644 index 0000000..ab22b3e --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/MainActivity.kt @@ -0,0 +1,99 @@ +package com.holo.wanandroid.ui + +import android.os.Bundle +import android.view.KeyEvent +import android.view.View +import com.holo.architecture.base.activity.BaseActivity +import com.holo.architecture.ext.lifecycle.ActivityStack +import com.holo.architecture.ext.showErrToast +import com.holo.architecture.ext.showToast +import com.holo.architecture.logger.KLog +import com.holo.architecture.network.State +import com.holo.architecture.utils.flowbus.observeEvent +import com.holo.architecture.utils.netstatus.NetType +import com.holo.architecture.utils.netstatus.NetUtils +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.ActivityMainBinding +import com.holo.wanandroid.event.LoginEvent +import com.holo.wanandroid.event.LogoutEvent +import com.holo.wanandroid.ext.initMain +import dagger.hilt.android.AndroidEntryPoint +import kotlin.system.exitProcess + +@AndroidEntryPoint +class MainActivity : BaseActivity() { + + override fun bottomPaddingView(): View = binding.navMenu + + override fun initView(savedInstanceState: Bundle?) { + binding.vpMain.initMain(this) + binding.navMenu.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.nav_home -> binding.vpMain.setCurrentItem(0, false) + R.id.nav_project -> binding.vpMain.setCurrentItem(1, false) + R.id.nav_discovery -> binding.vpMain.setCurrentItem(2, false) + R.id.nav_public -> binding.vpMain.setCurrentItem(3, false) + R.id.nav_mine -> binding.vpMain.setCurrentItem(4, false) + } + } + } + + override fun observeViewModel() { + observeEvent { event -> + when (event.state) { + is State.Loading -> showLoading() + is State.Success -> { + hideLoading() + showToast("登录成功") + } + is State.Error -> { + hideLoading() + showErrToast(event.state.err) + } + } + } + observeEvent { event -> + when (event.state) { + is State.Loading -> showLoading() + is State.Success -> { + hideLoading() + showToast("退出登录") + } + is State.Error -> { + hideLoading() + showErrToast(event.state.err) + } + } + } + } + + override fun onNetworkStateChanged(netType: String) { + // 网络状态改变 + KLog.e("测试", "Main网络状态改变:${netType}") + //binding.netType = netType + if (netType == NetType.WIFI) { + if (NetUtils.is5GWifiConnected(this)) { + KLog.e("测试", "这是5G WI-FI") + } else { + KLog.e("测试", "这是2.4G WI-FI") + } + KLog.e("测试", "WI-FI名:${NetUtils.getConnectedWifiSSID(this)}") + } + } + + private var exitTime = 0L + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if ((System.currentTimeMillis() - exitTime) > 2000) { + showToast("再次点击退出" + getString(R.string.app_show_name)) + exitTime = System.currentTimeMillis() + } else { + ActivityStack.finishAllActivity() + exitProcess(0) + } + return true + } + return super.onKeyDown(keyCode, event) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/WebActivity.kt b/app/src/main/java/com/holo/wanandroid/ui/WebActivity.kt new file mode 100644 index 0000000..f1eed14 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/WebActivity.kt @@ -0,0 +1,88 @@ +package com.holo.wanandroid.ui + +import android.os.Bundle +import android.webkit.ConsoleMessage +import android.webkit.WebView +import android.widget.LinearLayout +import com.holo.architecture.base.activity.BaseActivity +import com.holo.architecture.ext.toGone +import com.holo.architecture.ext.toVisible +import com.holo.architecture.logger.KLog +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.ActivityWebBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.just.agentweb.AgentWeb +import com.just.agentweb.DefaultWebClient +import com.just.agentweb.WebChromeClient +import com.just.agentweb.WebViewClient + +class WebActivity : BaseActivity() { + + private lateinit var agentWeb: AgentWeb + private lateinit var preAgentWeb: AgentWeb.PreAgentWeb + + private var webTitle: String? = null + + private lateinit var loads: LoadService + + override fun initView(savedInstanceState: Bundle?) { + val webUrl = intent.getStringExtra(Constant.KEY_WEB_URL) + webTitle = intent.getStringExtra(Constant.KEY_WEB_TITLE) + initWeb(webUrl ?: "") + loads = loadServiceInit(binding.loadView, R.layout.layout_loadsir_loading) { + agentWeb = preAgentWeb.go(webUrl) + } + } + + private fun initWeb(url: String) { + KLog.d("Holo", "WebActivity go url:${url}") + preAgentWeb = AgentWeb.with(this) + .setAgentWebParent(binding.container, LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)) + .useDefaultIndicator(resources.getColor(R.color.colorPrimary)) + .setWebChromeClient(webChromeClient) + .setWebViewClient(webClient) + .setMainFrameErrorView(com.just.agentweb.R.layout.agentweb_error_page, -1) + .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK) //打开其他应用时,弹窗咨询用户是否前往其他应用 + .createAgentWeb() + .ready() + agentWeb = preAgentWeb.go(url) + } + + private val webClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + loads.hide() + binding.loadView.toGone() + binding.container.toVisible() + super.onPageFinished(view, url) + } + + } + + private val webChromeClient = object : WebChromeClient() { + override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean { + return super.onConsoleMessage(consoleMessage) + } + } + + override fun observeViewModel() { + + } + + override fun onPause() { + agentWeb.webLifeCycle?.onPause() + super.onPause() + } + + override fun onResume() { + agentWeb.webLifeCycle?.onResume() + super.onResume() + } + + override fun onDestroy() { + agentWeb.webLifeCycle?.onDestroy() + super.onDestroy() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/DiscoveryViewModel.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/DiscoveryViewModel.kt new file mode 100644 index 0000000..0903b82 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/DiscoveryViewModel.kt @@ -0,0 +1,94 @@ +package com.holo.wanandroid.ui.discovery + +import androidx.lifecycle.viewModelScope +import com.holo.architecture.base.viewmodel.BaseViewModel +import com.holo.architecture.network.ListState +import com.holo.wanandroid.data.dto.ArticleBean +import com.holo.wanandroid.data.dto.CategoryBean +import com.holo.wanandroid.data.dto.NavigationBean +import com.holo.wanandroid.data.dto.TreeBean +import com.holo.wanandroid.repository.WanRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +@HiltViewModel +class DiscoveryViewModel @Inject constructor( + private val repo: WanRepository +) : BaseViewModel() { + + private val _plazaListResp = MutableSharedFlow>() + val plazaListResp = _plazaListResp.asSharedFlow() + + fun getPlazaList(refresh: Boolean = true) { + if (refresh) pageNo = 0 else pageNo++ + viewModelScope.launch { + repo.getPlazaList(pageNo).collect { _plazaListResp.emit(it) } + } + } + + private val _qaListResp = MutableSharedFlow>() + val qaListResp = _qaListResp.asSharedFlow() + + fun getQAList(refresh: Boolean = true) { + if (refresh) pageNo = 0 else pageNo++ + viewModelScope.launch { + repo.getQAList(pageNo).collect { _qaListResp.emit(it) } + } + } + + private val _treeListResp = MutableSharedFlow>() + val treeListResp = _treeListResp.asSharedFlow() + + fun getTreeList() { + viewModelScope.launch { + repo.getTreeList().collect { _treeListResp.emit(it ?: emptyList()) } + } + } + + private val _navigationListResp = MutableSharedFlow>() + val navigationListResp = _navigationListResp.asSharedFlow() + + fun getNavigationList() { + viewModelScope.launch { + repo.getNavigationList().collect { _navigationListResp.emit(it ?: emptyList()) } + } + } + + private val _publicNumListResp = MutableSharedFlow>() + val publicNumListResp = _publicNumListResp.asSharedFlow() + + fun getPublicNumList() { + viewModelScope.launch { + repo.getPublicNumList().collect { _publicNumListResp.emit(it ?: emptyList()) } + } + } + + private val _publicArticleListResp = MutableSharedFlow>() + val publicArticleListResp = _publicArticleListResp.asSharedFlow() + + fun getPublicArticleList(pnId: Int, refresh: Boolean = true) { + if (refresh) pageNo = 0 else pageNo++ + viewModelScope.launch { + repo.getPublicArticleList(pageNo, pnId).collect { _publicArticleListResp.emit(it) } + } + } + + private val _treeChildListResp = MutableSharedFlow>() + val treeChildListResp = _treeChildListResp.asSharedFlow() + + fun getTreeChildList(treeId: Int, refresh: Boolean = true) { + if (refresh) pageNo = 0 else pageNo++ + viewModelScope.launch { + repo.getTreeChildList(pageNo, treeId).collect { _treeChildListResp.emit(it) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/NavDiscoveryFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/NavDiscoveryFragment.kt new file mode 100644 index 0000000..596b2b3 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/NavDiscoveryFragment.kt @@ -0,0 +1,53 @@ +package com.holo.wanandroid.ui.discovery + +import android.os.Bundle +import android.widget.LinearLayout +import com.google.android.material.tabs.TabLayoutMediator +import com.gyf.immersionbar.ktx.statusBarHeight +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.wanandroid.databinding.FragmentNavDiscoveryBinding +import com.holo.wanandroid.ext.init +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@AndroidEntryPoint +class NavDiscoveryFragment : BaseFragment() { + + private val fragmentList: MutableList> = mutableListOf() + private val titleList: MutableList = mutableListOf() + + override fun initView(savedInstanceState: Bundle?) { + val params = binding.titleBar.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + binding.titleBar.layoutParams = params + + initTab() + } + + private fun initTab() { + activity?.run { + fragmentList.add(PlazaFragment()) + titleList.add("广场") + fragmentList.add(QAFragment()) + titleList.add("问答") + fragmentList.add(TreeFragment()) + titleList.add("体系") + fragmentList.add(NavigationFragment()) + titleList.add("导航") + + binding.viewPager.init(this, fragmentList) + TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> + tab.text = titleList[position] + }.attach() + } + } + + override fun observeViewModel() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationAdapter.kt new file mode 100644 index 0000000..d932b41 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationAdapter.kt @@ -0,0 +1,48 @@ +package com.holo.wanandroid.ui.discovery + +import android.annotation.SuppressLint +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.holo.architecture.ext.toHtml +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.ArticleBean +import com.holo.wanandroid.data.dto.NavigationBean +import com.holo.wanandroid.databinding.ItemTreeBinding +import com.holo.wanandroid.databinding.ItemTreeInBinding +import com.holo.wanandroid.ext.getBinding + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +class NavigationAdapter(private val childClick: (childItem: ArticleBean) -> Unit) : + BaseQuickAdapter(R.layout.item_tree, mutableListOf()) { + + private lateinit var adapter: NavigationInAdapter + + @SuppressLint("ClickableViewAccessibility") + override fun convert(holder: BaseViewHolder, item: NavigationBean) { + val binding = holder.getBinding(ItemTreeBinding::bind) + binding.tvName.text = item.name + + adapter = NavigationInAdapter(item.articles.toMutableList()) + binding.recyclerView.adapter = adapter + adapter.setOnItemClickListener { _, view, position -> + childClick.invoke(item.articles[position]) + } + binding.recyclerView.setOnTouchListener { v, event -> + binding.itemRoot.onTouchEvent(event) + false + } + } +} + +class NavigationInAdapter(list: MutableList) : BaseQuickAdapter(R.layout.item_tree_in, list) { + override fun convert(holder: BaseViewHolder, item: ArticleBean) { + val binding = holder.getBinding(ItemTreeInBinding::bind) + + binding.tvName.text = item.title.toHtml() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationFragment.kt new file mode 100644 index 0000000..61d32e7 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/NavigationFragment.kt @@ -0,0 +1,60 @@ +package com.holo.wanandroid.ui.discovery + +import android.os.Bundle +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.startActivity +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentNavigationBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ui.WebActivity +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +@AndroidEntryPoint +class NavigationFragment : BaseFragment() { + + private val viewModel: DiscoveryViewModel by viewModels() + + private lateinit var loads: LoadService + + private lateinit var adapter: NavigationAdapter + + override fun initView(savedInstanceState: Bundle?) { + adapter = NavigationAdapter { childItem -> + startActivity( + Constant.KEY_WEB_TITLE to childItem.title, + Constant.KEY_WEB_URL to childItem.link + ) + } + binding.container.recyclerView.adapter = adapter + + binding.container.refreshLayout.setOnRefreshListener { viewModel.getNavigationList() } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_tree_shimmer) { + viewModel.getNavigationList() + } + } + + override fun lazyLoadData() { + viewModel.getNavigationList() + } + + override fun observeViewModel() { + observerObj(viewModel.navigationListResp) { list -> + binding.container.refreshLayout.finishRefresh() + if (list.isNullOrEmpty()) { + loads.showEmpty() + } else { + loads.hide() + adapter.setList(list) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/PlazaFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/PlazaFragment.kt new file mode 100644 index 0000000..3a022a0 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/PlazaFragment.kt @@ -0,0 +1,90 @@ +package com.holo.wanandroid.ui.discovery + +import android.os.Bundle +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toHtml +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentPlazaBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ext.showLoginDialog +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.home.ArticleAdapter +import com.holo.wanandroid.ui.mine.CollectViewModel +import com.holo.wanandroid.util.CacheUtil +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +@AndroidEntryPoint +class PlazaFragment : BaseFragment() { + + private val viewModel: DiscoveryViewModel by viewModels() + private val collectViewModel: CollectViewModel by viewModels() + + private lateinit var loads: LoadService + + private lateinit var adapter: ArticleAdapter + + override fun initView(savedInstanceState: Bundle?) { + adapter = ArticleAdapter() + binding.container.recyclerView.adapter = adapter + adapter.setOnItemChildClickListener { _, view, position -> + val item = adapter.getItem(position) + when (view.id) { + R.id.tv_author -> { + } + R.id.like_view -> { + if (CacheUtil.isLogin()) { + if (item.collect) { + collectViewModel.unCollect(item.id, position) + } else { + collectViewModel.collect(item.id, position) + } + } else { + activity?.showLoginDialog() + } + } + } + } + adapter.setOnItemClickListener { _, view, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getPlazaList(false) } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getPlazaList() } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_article_shimmer) { + viewModel.getPlazaList() + } + } + + override fun lazyLoadData() { + viewModel.getPlazaList() + } + + override fun observeViewModel() { + observerList(viewModel.plazaListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + observer(collectViewModel.collectResp, success = { + adapter.getItem(it).collect = true + adapter.notifyItemChanged(it) + }) + observer(collectViewModel.unCollectResp, success = { + adapter.getItem(it).collect = false + adapter.notifyItemChanged(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/QAFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/QAFragment.kt new file mode 100644 index 0000000..b176f6d --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/QAFragment.kt @@ -0,0 +1,92 @@ +package com.holo.wanandroid.ui.discovery + +import android.os.Bundle +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.showToast +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toHtml +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentQaBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ext.showLoginDialog +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.home.ArticleAdapter +import com.holo.wanandroid.ui.mine.CollectViewModel +import com.holo.wanandroid.util.CacheUtil +import com.jaren.lib.view.LikeView +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +@AndroidEntryPoint +class QAFragment : BaseFragment() { + + private val viewModel: DiscoveryViewModel by viewModels() + private val collectViewModel: CollectViewModel by viewModels() + + private lateinit var loads: LoadService + + private lateinit var adapter: ArticleAdapter + + override fun initView(savedInstanceState: Bundle?) { + adapter = ArticleAdapter() + binding.container.recyclerView.adapter = adapter + adapter.setOnItemChildClickListener { _, view, position -> + val item = adapter.getItem(position) + when (view.id) { + R.id.tv_author -> { + } + R.id.like_view -> { + if (CacheUtil.isLogin()) { + if (item.collect) { + collectViewModel.unCollect(item.id, position) + } else { + collectViewModel.collect(item.id, position) + } + } else { + activity?.showLoginDialog() + } + } + } + } + adapter.setOnItemClickListener { _, view, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getQAList(false) } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getQAList() } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_article_shimmer) { + viewModel.getQAList() + } + } + + override fun lazyLoadData() { + viewModel.getQAList() + } + + override fun observeViewModel() { + observerList(viewModel.qaListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + observer(collectViewModel.collectResp, success = { + adapter.getItem(it).collect = true + adapter.notifyItemChanged(it) + }) + observer(collectViewModel.unCollectResp, success = { + adapter.getItem(it).collect = false + adapter.notifyItemChanged(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/TreeAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/TreeAdapter.kt new file mode 100644 index 0000000..a8cb5ca --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/TreeAdapter.kt @@ -0,0 +1,47 @@ +package com.holo.wanandroid.ui.discovery + +import android.annotation.SuppressLint +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.CategoryBean +import com.holo.wanandroid.data.dto.TreeBean +import com.holo.wanandroid.databinding.ItemTreeBinding +import com.holo.wanandroid.databinding.ItemTreeInBinding +import com.holo.wanandroid.ext.getBinding + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +class TreeAdapter(private val childClick: (treeBean: TreeBean, category: CategoryBean) -> Unit) : + BaseQuickAdapter(R.layout.item_tree, mutableListOf()) { + + private lateinit var adapter: TreeInAdapter + + @SuppressLint("ClickableViewAccessibility") + override fun convert(holder: BaseViewHolder, item: TreeBean) { + val binding = holder.getBinding(ItemTreeBinding::bind) + binding.tvName.text = item.name + + adapter = TreeInAdapter(item.children.toMutableList()) + binding.recyclerView.adapter = adapter + adapter.setOnItemClickListener { _, view, position -> + childClick.invoke(item, item.children[position]) + } + binding.recyclerView.setOnTouchListener { v, event -> + binding.itemRoot.onTouchEvent(event) + false + } + } +} + +class TreeInAdapter(list: MutableList) : BaseQuickAdapter(R.layout.item_tree_in, list) { + override fun convert(holder: BaseViewHolder, item: CategoryBean) { + val binding = holder.getBinding(ItemTreeInBinding::bind) + + binding.tvName.text = item.name + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/TreeFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/TreeFragment.kt new file mode 100644 index 0000000..e2eb7bb --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/TreeFragment.kt @@ -0,0 +1,64 @@ +package com.holo.wanandroid.ui.discovery + +import android.os.Bundle +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.startActivity +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentTreeBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ui.discovery.tree.TreeInfoActivity +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +@AndroidEntryPoint +class TreeFragment : BaseFragment() { + + private val viewModel: DiscoveryViewModel by viewModels() + + private lateinit var loads: LoadService + + private lateinit var adapter: TreeAdapter + + override fun initView(savedInstanceState: Bundle?) { + adapter = TreeAdapter { tree, catetory -> + startActivity( + Constant.KEY_TREE_BEAN to tree, + Constant.KEY_ID to catetory.id + ) + } + binding.container.recyclerView.adapter = adapter + + adapter.setOnItemClickListener { _, view, position -> + startActivity(Constant.KEY_TREE_BEAN to adapter.getItem(position)) + } + + binding.container.refreshLayout.setOnRefreshListener { viewModel.getTreeList() } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_tree_shimmer) { + viewModel.getTreeList() + } + } + + override fun lazyLoadData() { + viewModel.getTreeList() + } + + override fun observeViewModel() { + observerObj(viewModel.treeListResp) { list -> + binding.container.refreshLayout.finishRefresh() + if (list.isNullOrEmpty()) { + loads.showEmpty() + } else { + loads.hide() + adapter.setList(list) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoActivity.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoActivity.kt new file mode 100644 index 0000000..b267223 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoActivity.kt @@ -0,0 +1,52 @@ +package com.holo.wanandroid.ui.discovery.tree + +import android.os.Bundle +import com.google.android.material.tabs.TabLayoutMediator +import com.holo.architecture.base.activity.BaseActivity +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.clickNoRepeat +import com.holo.wanandroid.Constant +import com.holo.wanandroid.data.dto.CategoryBean +import com.holo.wanandroid.data.dto.TreeBean +import com.holo.wanandroid.databinding.ActivityTreeInfoBinding +import com.holo.wanandroid.ext.init +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class TreeInfoActivity : BaseActivity() { + + override fun initView(savedInstanceState: Bundle?) { + val bean = intent.getParcelableExtra(Constant.KEY_TREE_BEAN) + val selectedId = intent.getIntExtra(Constant.KEY_ID, 0) + if (bean == null) { + finish() + return + } + binding.toolbar.tvToolbarTitle.text = bean.name + binding.toolbar.ivBack.clickNoRepeat { finish() } + initTab(bean.children, selectedId) + } + + private fun initTab(categoryList: List, selectedId: Int) { + val titleList = mutableListOf() + val fragments = mutableListOf>() + var selectedPosition = 0 + categoryList.forEachIndexed { index, bean -> + if (bean.id == selectedId) { + selectedPosition = index + } + titleList.add(bean.name) + fragments.add(TreeInfoFragment.newInstance(bean.id)) + } + + binding.viewPager.init(this, fragments) + binding.viewPager.setCurrentItem(selectedPosition, false) + TabLayoutMediator(binding.tabNews, binding.viewPager) { tab, position -> + tab.text = titleList[position] + }.attach() + } + + override fun observeViewModel() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoFragment.kt new file mode 100644 index 0000000..21cb3c7 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/discovery/tree/TreeInfoFragment.kt @@ -0,0 +1,86 @@ +package com.holo.wanandroid.ui.discovery.tree + +import android.os.Bundle +import androidx.core.os.bundleOf +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toHtml +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentTreeInfoBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.discovery.DiscoveryViewModel +import com.holo.wanandroid.ui.home.ArticleAdapter +import com.jaren.lib.view.LikeView +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +@AndroidEntryPoint +class TreeInfoFragment : BaseFragment() { + + companion object { + fun newInstance(treeId: Int): TreeInfoFragment { + val fragment = TreeInfoFragment() + fragment.arguments = bundleOf(Constant.KEY_ID to treeId) + return fragment + } + } + + private val viewModel: DiscoveryViewModel by viewModels() + + private var treeId: Int = 0 + private lateinit var loads: LoadService + private lateinit var adapter: ArticleAdapter + + override fun initView(savedInstanceState: Bundle?) { + adapter = ArticleAdapter() + binding.container.recyclerView.adapter = adapter + adapter.setOnItemChildClickListener { _, view, position -> + when (view.id) { + R.id.tv_author -> { + } + R.id.like_view -> { + if (view is LikeView) { + view.toggle() + } + } + } + } + adapter.setOnItemClickListener { _, view, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getTreeChildList(treeId, false) } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getTreeChildList(treeId) } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_article_shimmer) { + viewModel.getTreeChildList(treeId) + } + } + + override fun initData() { + treeId = arguments?.getInt(Constant.KEY_ID, 0) ?: 0 + } + + override fun lazyLoadData() { + viewModel.getTreeChildList(treeId) + } + + override fun observeViewModel() { + observerList(viewModel.treeChildListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/home/ArticleAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/home/ArticleAdapter.kt new file mode 100644 index 0000000..f69c502 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/home/ArticleAdapter.kt @@ -0,0 +1,49 @@ +package com.holo.wanandroid.ui.home + +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.holo.architecture.ext.toGone +import com.holo.architecture.ext.toHtml +import com.holo.architecture.ext.toVisible +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.ArticleBean +import com.holo.wanandroid.databinding.ItemArticleBinding +import com.holo.wanandroid.ext.getBinding + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +class ArticleAdapter(private val inHome: Boolean = false) : BaseQuickAdapter(R.layout.item_article, mutableListOf()), + LoadMoreModule { + + init { + addChildClickViewIds(R.id.tv_author, R.id.like_view) + } + + override fun convert(holder: BaseViewHolder, item: ArticleBean) { + val binding = holder.getBinding(ItemArticleBinding::bind) + binding.tvAuthor.text = item.authorShow() + binding.slNewTag.toVisible(item.fresh) + if (inHome) { + binding.slTypeTag.toVisible(!item.tags.isNullOrEmpty()) + if (item.tags.isNotEmpty()) { + binding.tvTypeTag.text = item.tags[0].name + } + } else { + binding.slTypeTag.toGone() + } + binding.slTopTag.toVisible(item.type == 1) + + binding.tvCreateTime.text = item.niceDate + binding.tvTitle.text = item.title.toHtml() + + binding.tvCategory.text = "${item.superChapterName}・${item.chapterName}".toHtml() + + binding.likeView.isChecked = item.collect + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/home/BannerImgAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/home/BannerImgAdapter.kt new file mode 100644 index 0000000..38c6137 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/home/BannerImgAdapter.kt @@ -0,0 +1,20 @@ +package com.holo.wanandroid.ui.home + +import coil.load +import com.holo.wanandroid.data.dto.BannerBean +import com.youth.banner.adapter.BannerImageAdapter +import com.youth.banner.holder.BannerImageHolder + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +class BannerImgAdapter : BannerImageAdapter(mutableListOf()) { + + override fun onBindView(holder: BannerImageHolder, data: BannerBean, position: Int, size: Int) { + holder.imageView.load(data.imagePath) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/home/HomeViewModel.kt b/app/src/main/java/com/holo/wanandroid/ui/home/HomeViewModel.kt new file mode 100644 index 0000000..52bd822 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/home/HomeViewModel.kt @@ -0,0 +1,64 @@ +package com.holo.wanandroid.ui.home + +import androidx.lifecycle.viewModelScope +import com.holo.architecture.base.viewmodel.BaseViewModel +import com.holo.architecture.network.ListState +import com.holo.architecture.network.State +import com.holo.wanandroid.data.dto.ArticleBean +import com.holo.wanandroid.data.dto.BannerBean +import com.holo.wanandroid.repository.WanRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.zip +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@HiltViewModel +class HomeViewModel @Inject constructor( + private val repo: WanRepository +) : BaseViewModel() { + + private val _bannerListResp = MutableSharedFlow>>() + val bannerListResp = _bannerListResp.asSharedFlow() + + fun getBannerList() { + viewModelScope.launch { + repo.getBannerList().collect { _bannerListResp.emit(it) } + } + } + + private val _articleListResp = MutableSharedFlow>() + val articleListResp = _articleListResp.asSharedFlow() + + fun getArticleList(refresh: Boolean = true) { + if (refresh) pageNo = 0 else pageNo++ + viewModelScope.launch { + val listFlow = repo.getArticleList(pageNo) + val topFlow = if (refresh) repo.getTopArticleList() else flow { emit(emptyList()) } + listFlow.zip(topFlow) { list, top -> + if (top.isNullOrEmpty()) { + list + } else { + if (refresh) { + val temp = mutableListOf() + temp.addAll(top) + temp.addAll(list.listData) + ListState(true, refresh, list.hasMore, temp.isEmpty(), temp) + } else { + list + } + } + }.collect { + _articleListResp.emit(it) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/home/NavHomeFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/home/NavHomeFragment.kt new file mode 100644 index 0000000..27a1da1 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/home/NavHomeFragment.kt @@ -0,0 +1,124 @@ +package com.holo.wanandroid.ui.home + +import android.os.Bundle +import androidx.fragment.app.viewModels +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.appbar.CollapsingToolbarLayout +import com.gyf.immersionbar.ktx.statusBarHeight +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toHtml +import com.holo.architecture.ext.toVisible +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentNavHomeBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ext.showLoginDialog +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.mine.CollectViewModel +import com.holo.wanandroid.util.CacheUtil +import com.youth.banner.indicator.CircleIndicator +import dagger.hilt.android.AndroidEntryPoint +import kotlin.math.abs + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@AndroidEntryPoint +class NavHomeFragment : BaseFragment() { + + private val viewModel: HomeViewModel by viewModels() + private val collectViewModel: CollectViewModel by viewModels() + + private lateinit var loads: LoadService + + private lateinit var bannerAdapter: BannerImgAdapter + private lateinit var adapter: ArticleAdapter + + override fun initView(savedInstanceState: Bundle?) { + val params = binding.titleBar.layoutParams as CollapsingToolbarLayout.LayoutParams + val height = statusBarHeight + params.height = height + binding.titleBar.layoutParams = params + binding.appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + val scrollHeight = binding.bannerHomeTop.height - height + val fraction: Float = abs(verticalOffset * 1.0f) / scrollHeight + binding.titleBar.alpha = if (fraction >= 1) fraction else 0f + binding.titleBar.toVisible(fraction > 0.8) + }) + + bannerAdapter = BannerImgAdapter() + bannerAdapter.setOnBannerListener { data, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + binding.bannerHomeTop + .addBannerLifecycleObserver(this) + .setIndicator(CircleIndicator(activity)) + .setAdapter(bannerAdapter) + + adapter = ArticleAdapter(true) + binding.container.recyclerView.adapter = adapter + adapter.setOnItemChildClickListener { _, view, position -> + val item = adapter.getItem(position) + when (view.id) { + R.id.tv_author -> { + } + R.id.like_view -> { + if (CacheUtil.isLogin()) { + if (item.collect) { + collectViewModel.unCollect(item.id, position) + } else { + collectViewModel.collect(item.id, position) + } + } else { + activity?.showLoginDialog() + } + } + } + } + adapter.setOnItemClickListener { _, view, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getArticleList(false) } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getArticleList() } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_article_shimmer) { + viewModel.getArticleList() + } + } + + override fun initData() { + viewModel.getBannerList() + viewModel.getArticleList() + } + + override fun observeViewModel() { + observer(viewModel.bannerListResp) { + bannerAdapter.setDatas(it) + } + observerList(viewModel.articleListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + observer(collectViewModel.collectResp, success = { + adapter.getItem(it).collect = true + adapter.notifyItemChanged(it) + }) + observer(collectViewModel.unCollectResp, success = { + adapter.getItem(it).collect = false + adapter.notifyItemChanged(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/login/LoginActivity.kt b/app/src/main/java/com/holo/wanandroid/ui/login/LoginActivity.kt new file mode 100644 index 0000000..076afb5 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/login/LoginActivity.kt @@ -0,0 +1,59 @@ +package com.holo.wanandroid.ui.login + +import android.os.Bundle +import androidx.activity.viewModels +import androidx.navigation.NavController +import androidx.navigation.Navigation +import com.holo.architecture.base.activity.BaseActivity +import com.holo.architecture.ext.showErrToast +import com.holo.architecture.network.State +import com.holo.architecture.utils.flowbus.observeEvent +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.UserInfoBean +import com.holo.wanandroid.databinding.ActivityLoginBinding +import com.holo.wanandroid.event.LoginEvent +import com.holo.wanandroid.ext.initClose +import com.holo.wanandroid.ui.mine.UserViewModel +import dagger.hilt.android.AndroidEntryPoint + +/** + * 登录 + */ +@AndroidEntryPoint +class LoginActivity : BaseActivity() { + + private val viewModel: UserViewModel by viewModels() + + private lateinit var controller: NavController + + override fun initView(savedInstanceState: Bundle?) { + binding.titleBar.toolbar.initClose { finish() } + } + + override fun onStart() { + super.onStart() + controller = Navigation.findNavController(binding.navHostLogin) + controller.addOnDestinationChangedListener { controller, destination, arguments -> + when (destination.id) { + R.id.loginFragment -> binding.titleBar.tvToolbarTitle.text = "登录" + else -> binding.titleBar.tvToolbarTitle.text = "注册" + } + } + } + + override fun observeViewModel() { + observeEvent { event -> + when (event.state) { + is State.Loading -> showLoading() + is State.Success -> { + hideLoading() + finish() + } + is State.Error -> { + hideLoading() + showErrToast(event.state.err) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/login/LoginFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/login/LoginFragment.kt new file mode 100644 index 0000000..d49db1d --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/login/LoginFragment.kt @@ -0,0 +1,40 @@ +package com.holo.wanandroid.ui.login + +import android.os.Bundle +import androidx.fragment.app.activityViewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.* +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentLoginBinding +import com.holo.wanandroid.ui.mine.UserViewModel +import dagger.hilt.android.AndroidEntryPoint + +/** + * 登录 + * + * @Author holo + * @Date 2022/4/18 + */ +@AndroidEntryPoint +class LoginFragment : BaseFragment() { + + private val viewModel: UserViewModel by activityViewModels() + + override fun initView(savedInstanceState: Bundle?) { + binding.etAccount.afterTextChanged { switchBtnEnable() } + binding.etPsw.afterTextChanged { switchBtnEnable() } + + binding.tvRegisterNow.clickNoRepeat { nav().navigateAction(R.id.action_login_to_register) } + binding.btnConfirm.clickNoRepeat { + viewModel.doLogin(binding.etAccount.text.toString(), binding.etPsw.text.toString()) + } + } + + private fun switchBtnEnable() { + binding.btnConfirm.isEnabled = binding.etAccount.isNotBlank() && binding.etPsw.isNotBlank() + } + + override fun observeViewModel() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/login/RegisterFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/login/RegisterFragment.kt new file mode 100644 index 0000000..6674ba2 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/login/RegisterFragment.kt @@ -0,0 +1,48 @@ +package com.holo.wanandroid.ui.login + +import android.os.Bundle +import androidx.fragment.app.activityViewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.* +import com.holo.wanandroid.databinding.FragmentRegisterBinding +import com.holo.wanandroid.ui.mine.UserViewModel +import dagger.hilt.android.AndroidEntryPoint + +/** + * 注册 + * + * @Author holo + * @Date 2022/4/18 + */ +@AndroidEntryPoint +class RegisterFragment : BaseFragment() { + + private val viewModel: UserViewModel by activityViewModels() + + override fun initView(savedInstanceState: Bundle?) { + binding.etAccount.afterTextChanged { switchBtnEnable() } + binding.etPsw.afterTextChanged { switchBtnEnable() } + binding.etRePsw.afterTextChanged { switchBtnEnable() } + + binding.btnConfirm.clickNoRepeat { + val psw = binding.etPsw.text.toString() + val rePsw = binding.etRePsw.text.toString() + if (psw != rePsw) { + showToast("两次密码输入不一致") + return@clickNoRepeat + } + viewModel.doRegister(binding.etAccount.text.toString(), psw, rePsw) + } + } + + private fun switchBtnEnable() { + binding.btnConfirm.isEnabled = binding.etAccount.isNotBlank() && binding.etPsw.isNotBlank() && binding.etRePsw.isNotBlank() + } + + override fun observeViewModel() { + observer(viewModel.registerResp, success = { + showToast("注册成功,请登录") + nav().navigateUp() + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/CollectViewModel.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/CollectViewModel.kt new file mode 100644 index 0000000..432afba --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/CollectViewModel.kt @@ -0,0 +1,88 @@ +package com.holo.wanandroid.ui.mine + +import androidx.lifecycle.viewModelScope +import com.holo.architecture.base.viewmodel.BaseViewModel +import com.holo.architecture.ext.vibrator +import com.holo.architecture.initializer.appContext +import com.holo.architecture.network.ListState +import com.holo.architecture.network.State +import com.holo.wanandroid.data.dto.CollectBean +import com.holo.wanandroid.repository.WanRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +@HiltViewModel +class CollectViewModel @Inject constructor( + private val repo: WanRepository +) : BaseViewModel() { + + private val _collectResp = MutableSharedFlow>() + val collectResp = _collectResp.asSharedFlow() + + fun collect(id: Int, position: Int) { + appContext.vibrator?.vibrate(20) + viewModelScope.launch { + repo.collect(id).collect { + _collectResp.emit( + when (it) { + is State.Loading -> State.loading() + is State.Error -> State.error(it.err) + else -> State.success(position) + } + ) + } + } + } + + private val _unCollectResp = MutableSharedFlow>() + val unCollectResp = _unCollectResp.asSharedFlow() + + fun unCollect(id: Int, position: Int) { + appContext.vibrator?.vibrate(20) + viewModelScope.launch { + repo.unCollect(id).collect { + _unCollectResp.emit( + when (it) { + is State.Loading -> State.loading() + is State.Error -> State.error(it.err) + else -> State.success(position) + } + ) + } + } + } + + fun infoUnCollect(id: Int, originId: Int, position: Int) { + appContext.vibrator?.vibrate(20) + viewModelScope.launch { + repo.infoUnCollect(id, if (originId == 0) -1 else originId).collect { + _unCollectResp.emit( + when (it) { + is State.Loading -> State.loading() + is State.Error -> State.error(it.err) + else -> State.success(position) + } + ) + } + } + } + + private val _collectListResp = MutableSharedFlow>() + val collectListResp = _collectListResp.asSharedFlow() + + fun getCollectList(refresh: Boolean = true) { + if (refresh) pageNo = 0 else pageNo++ + viewModelScope.launch { + repo.getCollectList(pageNo).collect { _collectListResp.emit(it) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/NavMineFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/NavMineFragment.kt new file mode 100644 index 0000000..4a4ef11 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/NavMineFragment.kt @@ -0,0 +1,103 @@ +package com.holo.wanandroid.ui.mine + +import android.os.Bundle +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.clickNoRepeat +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toVisible +import com.holo.architecture.network.State +import com.holo.architecture.utils.flowbus.observeEvent +import com.holo.wanandroid.Constant +import com.holo.wanandroid.databinding.FragmentNavMineBinding +import com.holo.wanandroid.event.LoginEvent +import com.holo.wanandroid.event.LogoutEvent +import com.holo.wanandroid.ext.showLoginDialog +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.login.LoginActivity +import com.holo.wanandroid.ui.mine.collect.MyCollectActivity +import com.holo.wanandroid.ui.mine.integral.IntegralRankListActivity +import com.holo.wanandroid.ui.mine.integral.MyIntegralDetailsActivity +import com.holo.wanandroid.util.CacheUtil +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@AndroidEntryPoint +class NavMineFragment : BaseFragment() { + + private val viewModel: UserViewModel by viewModels() + + override fun initView(savedInstanceState: Bundle?) { + binding.ivAvatar.clickNoRepeat { startActivity() } + binding.tvUserName.clickNoRepeat { startActivity() } + + binding.vgMyIntegral.clickNoRepeat { + if (CacheUtil.isLogin()) { + startActivity() + } else { + activity?.showLoginDialog() + } + } + binding.vgIntegralRankList.clickNoRepeat { + startActivity() + } + binding.vgMyCollect.clickNoRepeat { + if (CacheUtil.isLogin()) { + startActivity() + } else { + activity?.showLoginDialog() + } + } + binding.vgGithub.clickNoRepeat { + startActivity( + Constant.KEY_WEB_TITLE to "Github", + Constant.KEY_WEB_URL to "https://github.com/holoXia" + ) + } + binding.tvLogout.clickNoRepeat { viewModel.doLogout() } + refreshUI() + } + + override fun initData() { + viewModel.getMyIntegral() + } + + private fun refreshUI() { + val userInfo = CacheUtil.getUserInfo() + binding.tvUserName.text = userInfo?.getShowName() ?: "请登录" + binding.tvLogout.toVisible(userInfo != null) + if (userInfo == null) { + binding.tvLevel.text = "等级:-" + binding.tvRank.text = "排名:-" + binding.tvIntegral.text = "" + } + } + + override fun observeViewModel() { + observerObj(viewModel.myIntegralResp) { bean -> + bean?.let { + binding.tvLevel.text = "等级:${bean.level}" + binding.tvRank.text = "排名:${bean.rank}" + binding.tvIntegral.text = bean.coinCount.toString() + } + } + observeEvent { event -> + if (event.state is State.Success) { + CacheUtil.saveUserInfo(event.state.data) + refreshUI() + viewModel.getMyIntegral() + } + } + observeEvent { event -> + if (event.state is State.Success) { + CacheUtil.saveUserInfo(null) + refreshUI() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/UserViewModel.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/UserViewModel.kt new file mode 100644 index 0000000..a5adc9e --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/UserViewModel.kt @@ -0,0 +1,84 @@ +package com.holo.wanandroid.ui.mine + +import androidx.lifecycle.viewModelScope +import com.holo.architecture.base.viewmodel.BaseViewModel +import com.holo.architecture.network.ListState +import com.holo.architecture.network.State +import com.holo.architecture.utils.flowbus.postEvent +import com.holo.wanandroid.data.dto.IntegralBean +import com.holo.wanandroid.data.dto.IntegralInfoBean +import com.holo.wanandroid.data.dto.UserInfoBean +import com.holo.wanandroid.event.LoginEvent +import com.holo.wanandroid.event.LogoutEvent +import com.holo.wanandroid.repository.UserRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +@HiltViewModel +class UserViewModel @Inject constructor( + private val repo: UserRepository +) : BaseViewModel() { + + fun doLogin(account: String, psw: String) { + viewModelScope.launch { + repo.doLogin(account, psw).collect { + postEvent(LoginEvent(it)) + } + } + } + + fun doLogout() { + viewModelScope.launch { + repo.doLogout().collect { + postEvent(LogoutEvent(it)) + } + } + } + + private val _registerResp = MutableSharedFlow>() + val registerResp = _registerResp.asSharedFlow() + + fun doRegister(account: String, psw: String, rePsw: String) { + viewModelScope.launch { + repo.doRegister(account, psw, rePsw).collect { _registerResp.emit(it) } + } + } + + private val _myIntegralResp = MutableSharedFlow() + val myIntegralResp = _myIntegralResp.asSharedFlow() + + fun getMyIntegral() { + viewModelScope.launch { + repo.getMyIntegral().collect { _myIntegralResp.emit(it ?: IntegralBean()) } + } + } + + private val _myIntegralListResp = MutableSharedFlow>() + val myIntegralListResp = _myIntegralListResp.asSharedFlow() + + fun getMyIntegralList(refresh: Boolean = true) { + if (refresh) pageNo = 1 else pageNo++ + viewModelScope.launch { + repo.getMyIntegralList(pageNo, refresh).collect { _myIntegralListResp.emit(it) } + } + } + + private val _integralRankListResp = MutableSharedFlow>() + val integralRankListResp = _integralRankListResp.asSharedFlow() + + fun getIntegralRankList(refresh: Boolean = true) { + if (refresh) pageNo = 1 else pageNo++ + viewModelScope.launch { + repo.getIntegralRankList(pageNo, refresh).collect { _integralRankListResp.emit(it) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/collect/CollectAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/collect/CollectAdapter.kt new file mode 100644 index 0000000..5671218 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/collect/CollectAdapter.kt @@ -0,0 +1,62 @@ +package com.holo.wanandroid.ui.mine.collect + +import coil.load +import com.chad.library.adapter.base.BaseMultiItemQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.holo.architecture.ext.toHtml +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.CollectBean +import com.holo.wanandroid.data.dto.CollectType +import com.holo.wanandroid.databinding.ItemArticleBinding +import com.holo.wanandroid.databinding.ItemProjectsBinding +import com.holo.wanandroid.ext.getBinding + +/** + * + * + * @Author holo + * @Date 2022/4/18 + */ +class CollectAdapter : BaseMultiItemQuickAdapter(mutableListOf()), LoadMoreModule { + + init { + addItemType(CollectType.COLLECT_ARTICLE, R.layout.item_article) + addItemType(CollectType.COLLECT_PROJECTS, R.layout.item_projects) + addChildClickViewIds(R.id.like_view) + } + + override fun convert(holder: BaseViewHolder, item: CollectBean) { + when (holder.itemViewType) { + CollectType.COLLECT_ARTICLE -> convertArticle(holder, item) + CollectType.COLLECT_PROJECTS -> convertProjects(holder, item) + } + } + + private fun convertArticle(holder: BaseViewHolder, item: CollectBean) { + val binding = holder.getBinding(ItemArticleBinding::bind) + + binding.tvAuthor.text = item.author + + binding.tvCreateTime.text = item.niceDate + binding.tvTitle.text = item.title.toHtml() + + binding.tvCategory.text = "${item.chapterName}".toHtml() + + binding.likeView.isChecked = true + } + + private fun convertProjects(holder: BaseViewHolder, item: CollectBean) { + val binding = holder.getBinding(ItemProjectsBinding::bind) + + binding.ivCover.load(item.envelopePic) { + error(R.mipmap.ic_img_default) + } + binding.tvTitle.text = item.title.toHtml() + binding.tvContent.text = item.desc.toHtml() + binding.tvAuthor.text = item.author + binding.tvCreateTime.text = item.niceDate + + binding.likeView.isChecked = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/collect/MyCollectActivity.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/collect/MyCollectActivity.kt new file mode 100644 index 0000000..488bce7 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/collect/MyCollectActivity.kt @@ -0,0 +1,68 @@ +package com.holo.wanandroid.ui.mine.collect + +import android.os.Bundle +import androidx.activity.viewModels +import com.holo.architecture.base.activity.BaseActivity +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toHtml +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.ActivityMyCollectBinding +import com.holo.wanandroid.ext.initClose +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.mine.CollectViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MyCollectActivity : BaseActivity() { + + private val viewModel: CollectViewModel by viewModels() + + private lateinit var loads: LoadService + private lateinit var adapter: CollectAdapter + + override fun initView(savedInstanceState: Bundle?) { + binding.titleBar.toolbar.initClose("我的收藏") { finish() } + + adapter = CollectAdapter() + binding.container.recyclerView.adapter = adapter + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getCollectList(false) } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_projects_shimmer) { + viewModel.getCollectList() + } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getCollectList() } + + adapter.setOnItemClickListener { _, view, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + adapter.setOnItemChildClickListener { _, view, position -> + val item = adapter.getItem(position) + when (view.id) { + R.id.like_view -> { + viewModel.infoUnCollect(item.id, item.originId, position) + } + } + } + } + + override fun initData() { + viewModel.getCollectList() + } + + override fun observeViewModel() { + observerList(viewModel.collectListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + observer(viewModel.unCollectResp, success = { position -> + adapter.data.removeAt(position) + adapter.notifyItemRemoved(position) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralAdapter.kt new file mode 100644 index 0000000..9426bc6 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralAdapter.kt @@ -0,0 +1,39 @@ +package com.holo.wanandroid.ui.mine.integral + +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.holo.architecture.ext.toInvisible +import com.holo.architecture.ext.toVisible +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.IntegralBean +import com.holo.wanandroid.databinding.ItemIntegralBinding +import com.holo.wanandroid.ext.getBinding + +/** + * + * + * @Author holo + * @Date 2022/4/18 + */ +class IntegralAdapter : BaseQuickAdapter(R.layout.item_integral, mutableListOf()), LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: IntegralBean) { + val binding = holder.getBinding(ItemIntegralBinding::bind) + + binding.vDivider.toVisible(holder.bindingAdapterPosition < (data.size - 1)) + + binding.ivRankTop.toInvisible(holder.bindingAdapterPosition < 3) + binding.tvRank.toVisible(holder.bindingAdapterPosition >= 3) + when (holder.bindingAdapterPosition) { + 0 -> binding.ivRankTop.setImageResource(R.mipmap.ic_rank_no1) + 1 -> binding.ivRankTop.setImageResource(R.mipmap.ic_rank_no2) + 2 -> binding.ivRankTop.setImageResource(R.mipmap.ic_rank_no3) + else -> binding.tvRank.text = "${holder.bindingAdapterPosition + 1}" + } + + binding.tvUserName.text = item.getShowName() + binding.tvIntegral.text = item.coinCount.toString() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralDetailsAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralDetailsAdapter.kt new file mode 100644 index 0000000..cd40b14 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralDetailsAdapter.kt @@ -0,0 +1,26 @@ +package com.holo.wanandroid.ui.mine.integral + +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.holo.wanandroid.R +import com.holo.wanandroid.data.dto.IntegralInfoBean +import com.holo.wanandroid.databinding.ItemIntegralDetailsBinding +import com.holo.wanandroid.ext.getBinding + +/** + * + * + * @Author holo + * @Date 2022/4/18 + */ +class IntegralDetailsAdapter : BaseQuickAdapter(R.layout.item_integral_details, mutableListOf()), LoadMoreModule { + + override fun convert(holder: BaseViewHolder, item: IntegralInfoBean) { + val binding = holder.getBinding(ItemIntegralDetailsBinding::bind) + + binding.tvTitle.text = item.reason + binding.tvCreateTime.text = item.desc + binding.tvIntegral.text = "+${item.coinCount}" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralRankListActivity.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralRankListActivity.kt new file mode 100644 index 0000000..133e024 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/IntegralRankListActivity.kt @@ -0,0 +1,45 @@ +package com.holo.wanandroid.ui.mine.integral + +import android.os.Bundle +import androidx.activity.viewModels +import com.holo.architecture.base.activity.BaseActivity +import com.holo.loadstate.LoadService +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.ActivityIntegralRankListBinding +import com.holo.wanandroid.ext.initClose +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ui.mine.UserViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class IntegralRankListActivity : BaseActivity() { + + private val viewModel: UserViewModel by viewModels() + + private lateinit var loads: LoadService + private lateinit var adapter: IntegralAdapter + + override fun initView(savedInstanceState: Bundle?) { + binding.titleBar.toolbar.initClose("积分排行") { finish() } + + adapter = IntegralAdapter() + binding.container.recyclerView.adapter = adapter + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getIntegralRankList(false) } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_integral_shimmer) { + viewModel.getIntegralRankList() + } + loads.config { setItemCount(15) } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getIntegralRankList() } + } + + override fun initData() { + viewModel.getIntegralRankList() + } + + override fun observeViewModel() { + observerList(viewModel.integralRankListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/mine/integral/MyIntegralDetailsActivity.kt b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/MyIntegralDetailsActivity.kt new file mode 100644 index 0000000..287158c --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/mine/integral/MyIntegralDetailsActivity.kt @@ -0,0 +1,45 @@ +package com.holo.wanandroid.ui.mine.integral + +import android.os.Bundle +import androidx.activity.viewModels +import com.holo.architecture.base.activity.BaseActivity +import com.holo.loadstate.LoadService +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.ActivityMyIntegralDetailsBinding +import com.holo.wanandroid.ext.initClose +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ui.mine.UserViewModel +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MyIntegralDetailsActivity : BaseActivity() { + + private val viewModel: UserViewModel by viewModels() + + private lateinit var loads: LoadService + private lateinit var adapter: IntegralDetailsAdapter + + override fun initView(savedInstanceState: Bundle?) { + binding.titleBar.toolbar.initClose("我的积分") { finish() } + + adapter = IntegralDetailsAdapter() + binding.container.recyclerView.adapter = adapter + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getMyIntegralList(false) } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_integral_details_shimmer) { + viewModel.getMyIntegralList() + } + loads.config { setItemCount(15) } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getMyIntegralList() } + } + + override fun initData() { + viewModel.getMyIntegralList() + } + + override fun observeViewModel() { + observerList(viewModel.myIntegralListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/projects/NavProjectsFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/projects/NavProjectsFragment.kt new file mode 100644 index 0000000..bccd4cb --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/projects/NavProjectsFragment.kt @@ -0,0 +1,53 @@ +package com.holo.wanandroid.ui.projects + +import android.os.Bundle +import android.widget.LinearLayout +import androidx.fragment.app.viewModels +import com.google.android.material.tabs.TabLayoutMediator +import com.gyf.immersionbar.ktx.statusBarHeight +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.wanandroid.databinding.FragmentNavProjectsBinding +import com.holo.wanandroid.ext.init +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@AndroidEntryPoint +class NavProjectsFragment : BaseFragment() { + + private val viewModel: ProjectsViewModel by viewModels() + + private val fragmentList: MutableList> = mutableListOf() + private val titleList: MutableList = mutableListOf() + + override fun initView(savedInstanceState: Bundle?) { + val params = binding.titleBar.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + binding.titleBar.layoutParams = params + } + + override fun initData() { + viewModel.getProjectCategories() + } + + override fun observeViewModel() { + observerObj(viewModel.categoryListResp) { list -> + activity?.let { act -> + fragmentList.add(ProjectsFragment.newInstance(-1)) + titleList.add("最新项目") + list?.forEach { bean -> + fragmentList.add(ProjectsFragment.newInstance(bean.id)) + titleList.add(bean.name) + } + binding.viewPager.init(act, fragmentList) + TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> + tab.text = titleList[position] + }.attach() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsAdapter.kt b/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsAdapter.kt new file mode 100644 index 0000000..6aee576 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsAdapter.kt @@ -0,0 +1,39 @@ +package com.holo.wanandroid.ui.projects + +import coil.load +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.holo.architecture.ext.toHtml +import com.holo.wanandroid.R +import com.holo.wanandroid.data.dto.ProjectBean +import com.holo.wanandroid.databinding.ItemProjectsBinding +import com.holo.wanandroid.ext.getBinding + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +class ProjectsAdapter : BaseQuickAdapter(R.layout.item_projects, mutableListOf()), LoadMoreModule { + + init { + addChildClickViewIds(R.id.like_view) + } + + override fun convert(holder: BaseViewHolder, item: ProjectBean) { + val binding = holder.getBinding(ItemProjectsBinding::bind) + + binding.ivCover.load(item.envelopePic) { + error(R.mipmap.ic_img_default) + } + binding.tvTitle.text = item.title.toHtml() + binding.tvContent.text = item.desc.toHtml() + binding.tvAuthor.text = item.authorShow() + binding.tvCreateTime.text = item.niceDate + + binding.likeView.isChecked = item.collect + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsFragment.kt new file mode 100644 index 0000000..ca2e69a --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsFragment.kt @@ -0,0 +1,101 @@ +package com.holo.wanandroid.ui.projects + +import android.os.Bundle +import androidx.core.os.bundleOf +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toHtml +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentProjectsBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ext.showLoginDialog +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.mine.CollectViewModel +import com.holo.wanandroid.util.CacheUtil +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@AndroidEntryPoint +class ProjectsFragment : BaseFragment() { + + companion object { + fun newInstance(categoryId: Int = -1): ProjectsFragment { + val fragment = ProjectsFragment() + fragment.arguments = bundleOf(Constant.KEY_ID to categoryId) + return fragment + } + } + + private val viewModel: ProjectsViewModel by viewModels() + private val collectViewModel: CollectViewModel by viewModels() + + private var categoryId: Int = -1 + private lateinit var loads: LoadService + private lateinit var adapter: ProjectsAdapter + + override fun initView(savedInstanceState: Bundle?) { + adapter = ProjectsAdapter() + binding.container.recyclerView.adapter = adapter + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getProjectList(categoryId, false) } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_projects_shimmer) { + viewModel.getProjectList(categoryId) + } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getProjectList(categoryId) } + + adapter.setOnItemClickListener { _, view, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + adapter.setOnItemChildClickListener { _, view, position -> + val item = adapter.getItem(position) + when (view.id) { + R.id.like_view -> { + if (CacheUtil.isLogin()) { + if (item.collect) { + collectViewModel.unCollect(item.id, position) + } else { + collectViewModel.collect(item.id, position) + } + } else { + activity?.showLoginDialog() + } + } + } + } + } + + + override fun initData() { + categoryId = arguments?.getInt(Constant.KEY_ID, -1) ?: -1 + } + + override fun lazyLoadData() { + viewModel.getProjectList(categoryId) + } + + override fun observeViewModel() { + observerList(viewModel.projectListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + observer(collectViewModel.collectResp, success = { + adapter.getItem(it).collect = true + adapter.notifyItemChanged(it) + }) + observer(collectViewModel.unCollectResp, success = { + adapter.getItem(it).collect = false + adapter.notifyItemChanged(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsViewModel.kt b/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsViewModel.kt new file mode 100644 index 0000000..83d4e75 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/projects/ProjectsViewModel.kt @@ -0,0 +1,48 @@ +package com.holo.wanandroid.ui.projects + +import androidx.lifecycle.viewModelScope +import com.holo.architecture.base.viewmodel.BaseViewModel +import com.holo.architecture.network.ListState +import com.holo.wanandroid.data.dto.ProjectBean +import com.holo.wanandroid.data.dto.CategoryBean +import com.holo.wanandroid.repository.WanRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@HiltViewModel +data class ProjectsViewModel @Inject constructor( + private val repo: WanRepository +) : BaseViewModel() { + + private val _categoryListResp = MutableSharedFlow>() + val categoryListResp = _categoryListResp.asSharedFlow() + + fun getProjectCategories() { + viewModelScope.launch { + repo.getProjectCategories().collect { _categoryListResp.emit(it ?: emptyList()) } + } + } + + private val _projectListResp = MutableSharedFlow>() + val projectListResp = _projectListResp.asSharedFlow() + + fun getProjectList(categoryId: Int, refresh: Boolean = true) { + if (refresh) pageNo = 0 else pageNo++ + viewModelScope.launch { + if (categoryId == -1) { + repo.getLatestProjectList(pageNo) + } else { + repo.getProjectList(pageNo, categoryId) + }.collect { _projectListResp.emit(it) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/publicnum/NavPublicNumFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/publicnum/NavPublicNumFragment.kt new file mode 100644 index 0000000..78896be --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/publicnum/NavPublicNumFragment.kt @@ -0,0 +1,53 @@ +package com.holo.wanandroid.ui.publicnum + +import android.os.Bundle +import android.widget.LinearLayout +import androidx.fragment.app.viewModels +import com.google.android.material.tabs.TabLayoutMediator +import com.gyf.immersionbar.ktx.statusBarHeight +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.wanandroid.databinding.FragmentNavPublicnumBinding +import com.holo.wanandroid.ext.init +import com.holo.wanandroid.ui.discovery.DiscoveryViewModel +import com.holo.wanandroid.ui.projects.ProjectsFragment +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/15 + */ +@AndroidEntryPoint +class NavPublicNumFragment : BaseFragment() { + + private val viewModel: DiscoveryViewModel by viewModels() + + private val fragmentList: MutableList> = mutableListOf() + private val titleList: MutableList = mutableListOf() + + override fun initView(savedInstanceState: Bundle?) { + val params = binding.titleBar.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + binding.titleBar.layoutParams = params + } + + override fun initData() { + viewModel.getPublicNumList() + } + + override fun observeViewModel() { + observerObj(viewModel.publicNumListResp) { list -> + activity?.let { act -> + list?.forEach { bean -> + fragmentList.add(PublicArticleFragment.newInstance(bean.id)) + titleList.add(bean.name) + } + binding.viewPager.init(act, fragmentList) + TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, position -> + tab.text = titleList[position] + }.attach() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/ui/publicnum/PublicArticleFragment.kt b/app/src/main/java/com/holo/wanandroid/ui/publicnum/PublicArticleFragment.kt new file mode 100644 index 0000000..6ffff72 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/ui/publicnum/PublicArticleFragment.kt @@ -0,0 +1,105 @@ +package com.holo.wanandroid.ui.publicnum + +import android.os.Bundle +import androidx.core.os.bundleOf +import androidx.fragment.app.viewModels +import com.holo.architecture.base.fragment.BaseFragment +import com.holo.architecture.ext.startActivity +import com.holo.architecture.ext.toHtml +import com.holo.loadstate.LoadService +import com.holo.wanandroid.Constant +import com.holo.wanandroid.R +import com.holo.wanandroid.databinding.FragmentPublicArticleBinding +import com.holo.wanandroid.ext.loadServiceInit +import com.holo.wanandroid.ext.parseListState +import com.holo.wanandroid.ext.showLoginDialog +import com.holo.wanandroid.ui.WebActivity +import com.holo.wanandroid.ui.discovery.DiscoveryViewModel +import com.holo.wanandroid.ui.home.ArticleAdapter +import com.holo.wanandroid.ui.mine.CollectViewModel +import com.holo.wanandroid.util.CacheUtil +import dagger.hilt.android.AndroidEntryPoint + +/** + * + * + * @Author holo + * @Date 2022/4/16 + */ +@AndroidEntryPoint +class PublicArticleFragment : BaseFragment() { + + companion object { + fun newInstance(categoryId: Int = -1): PublicArticleFragment { + val fragment = PublicArticleFragment() + fragment.arguments = bundleOf(Constant.KEY_ID to categoryId) + return fragment + } + } + + private val viewModel: DiscoveryViewModel by viewModels() + private val collectViewModel: CollectViewModel by viewModels() + + private var publicNumId: Int = 0 + private lateinit var loads: LoadService + private lateinit var adapter: ArticleAdapter + + override fun initView(savedInstanceState: Bundle?) { + adapter = ArticleAdapter() + binding.container.recyclerView.adapter = adapter + adapter.setOnItemChildClickListener { _, view, position -> + val item = adapter.getItem(position) + when (view.id) { + R.id.tv_author -> { + } + R.id.like_view -> { + if (CacheUtil.isLogin()) { + if (item.collect) { + collectViewModel.unCollect(item.id, position) + } else { + collectViewModel.collect(item.id, position) + } + } else { + activity?.showLoginDialog() + } + } + } + } + adapter.setOnItemClickListener { _, view, position -> + val item = adapter.getItem(position) + startActivity( + Constant.KEY_WEB_TITLE to item.title.toHtml(), + Constant.KEY_WEB_URL to item.link + ) + } + + adapter.loadMoreModule.setOnLoadMoreListener { viewModel.getPublicArticleList(publicNumId, false) } + binding.container.refreshLayout.setOnRefreshListener { viewModel.getPublicArticleList(publicNumId) } + loads = loadServiceInit(binding.container.recyclerView, adapter, R.layout.item_article_shimmer) { + viewModel.getPublicArticleList(publicNumId) + } + } + + override fun initData() { + publicNumId = arguments?.getInt(Constant.KEY_ID, 0) ?: 0 + } + + override fun lazyLoadData() { + viewModel.getPublicArticleList(publicNumId) + } + + override fun observeViewModel() { + observerList(viewModel.publicArticleListResp) { state -> + parseListState(state, loads, binding.container.refreshLayout, adapter) + } + observer(collectViewModel.collectResp, success = { + adapter.getItem(it).collect = true + adapter.notifyItemChanged(it) + }) + observer(collectViewModel.unCollectResp, success = { + adapter.getItem(it).collect = false + adapter.notifyItemChanged(it) + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/holo/wanandroid/util/CacheUtil.kt b/app/src/main/java/com/holo/wanandroid/util/CacheUtil.kt new file mode 100644 index 0000000..a7e8515 --- /dev/null +++ b/app/src/main/java/com/holo/wanandroid/util/CacheUtil.kt @@ -0,0 +1,21 @@ +package com.holo.wanandroid.util + +import com.holo.wanandroid.data.dto.UserInfoBean +import com.tencent.mmkv.MMKV + +/** + * + * + * @Author holo + * @Date 2022/4/17 + */ +object CacheUtil { + + private const val SP_USER_INFO = "user_info" + + fun saveUserInfo(user: UserInfoBean?) = MMKV.defaultMMKV().encode(SP_USER_INFO, user) + + fun getUserInfo() = MMKV.defaultMMKV().decodeParcelable(SP_USER_INFO, UserInfoBean::class.java) + + fun isLogin() = getUserInfo() != null +} \ No newline at end of file diff --git a/app/src/main/res/color/nav_color_text.xml b/app/src/main/res/color/nav_color_text.xml new file mode 100644 index 0000000..98259f6 --- /dev/null +++ b/app/src/main/res/color/nav_color_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_click_button.xml b/app/src/main/res/drawable/bg_click_button.xml new file mode 100644 index 0000000..bd43f06 --- /dev/null +++ b/app/src/main/res/drawable/bg_click_button.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_gradient.xml b/app/src/main/res/drawable/shape_gradient.xml new file mode 100644 index 0000000..f8dee9c --- /dev/null +++ b/app/src/main/res/drawable/shape_gradient.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_indicator.xml b/app/src/main/res/drawable/tab_indicator.xml new file mode 100644 index 0000000..bf1d157 --- /dev/null +++ b/app/src/main/res/drawable/tab_indicator.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_integral_rank_list.xml b/app/src/main/res/layout/activity_integral_rank_list.xml new file mode 100644 index 0000000..3ed6bca --- /dev/null +++ b/app/src/main/res/layout/activity_integral_rank_list.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..7c03f84 --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..b982d31 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_my_collect.xml b/app/src/main/res/layout/activity_my_collect.xml new file mode 100644 index 0000000..0e51cbc --- /dev/null +++ b/app/src/main/res/layout/activity_my_collect.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_my_integral_details.xml b/app/src/main/res/layout/activity_my_integral_details.xml new file mode 100644 index 0000000..3ed6bca --- /dev/null +++ b/app/src/main/res/layout/activity_my_integral_details.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_tree_info.xml b/app/src/main/res/layout/activity_tree_info.xml new file mode 100644 index 0000000..da82d84 --- /dev/null +++ b/app/src/main/res/layout/activity_tree_info.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_web.xml b/app/src/main/res/layout/activity_web.xml new file mode 100644 index 0000000..817b1a4 --- /dev/null +++ b/app/src/main/res/layout/activity_web.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_login.xml b/app/src/main/res/layout/dialog_login.xml new file mode 100644 index 0000000..e05e96d --- /dev/null +++ b/app/src/main/res/layout/dialog_login.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml new file mode 100644 index 0000000..6fc9617 --- /dev/null +++ b/app/src/main/res/layout/fragment_login.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_nav_discovery.xml b/app/src/main/res/layout/fragment_nav_discovery.xml new file mode 100644 index 0000000..b29b09d --- /dev/null +++ b/app/src/main/res/layout/fragment_nav_discovery.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_nav_home.xml b/app/src/main/res/layout/fragment_nav_home.xml new file mode 100644 index 0000000..15b70ec --- /dev/null +++ b/app/src/main/res/layout/fragment_nav_home.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_nav_mine.xml b/app/src/main/res/layout/fragment_nav_mine.xml new file mode 100644 index 0000000..2de335c --- /dev/null +++ b/app/src/main/res/layout/fragment_nav_mine.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_nav_projects.xml b/app/src/main/res/layout/fragment_nav_projects.xml new file mode 100644 index 0000000..56ce0c1 --- /dev/null +++ b/app/src/main/res/layout/fragment_nav_projects.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_nav_publicnum.xml b/app/src/main/res/layout/fragment_nav_publicnum.xml new file mode 100644 index 0000000..6b58653 --- /dev/null +++ b/app/src/main/res/layout/fragment_nav_publicnum.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_navigation.xml b/app/src/main/res/layout/fragment_navigation.xml new file mode 100644 index 0000000..1b30997 --- /dev/null +++ b/app/src/main/res/layout/fragment_navigation.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_plaza.xml b/app/src/main/res/layout/fragment_plaza.xml new file mode 100644 index 0000000..1b30997 --- /dev/null +++ b/app/src/main/res/layout/fragment_plaza.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_projects.xml b/app/src/main/res/layout/fragment_projects.xml new file mode 100644 index 0000000..e85fb66 --- /dev/null +++ b/app/src/main/res/layout/fragment_projects.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_public_article.xml b/app/src/main/res/layout/fragment_public_article.xml new file mode 100644 index 0000000..d0a0486 --- /dev/null +++ b/app/src/main/res/layout/fragment_public_article.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_qa.xml b/app/src/main/res/layout/fragment_qa.xml new file mode 100644 index 0000000..1b30997 --- /dev/null +++ b/app/src/main/res/layout/fragment_qa.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_register.xml b/app/src/main/res/layout/fragment_register.xml new file mode 100644 index 0000000..f1ef7c5 --- /dev/null +++ b/app/src/main/res/layout/fragment_register.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tree.xml b/app/src/main/res/layout/fragment_tree.xml new file mode 100644 index 0000000..1b30997 --- /dev/null +++ b/app/src/main/res/layout/fragment_tree.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tree_info.xml b/app/src/main/res/layout/fragment_tree_info.xml new file mode 100644 index 0000000..d0a0486 --- /dev/null +++ b/app/src/main/res/layout/fragment_tree_info.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_article.xml b/app/src/main/res/layout/item_article.xml new file mode 100644 index 0000000..6266bbe --- /dev/null +++ b/app/src/main/res/layout/item_article.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_article_shimmer.xml b/app/src/main/res/layout/item_article_shimmer.xml new file mode 100644 index 0000000..31daf88 --- /dev/null +++ b/app/src/main/res/layout/item_article_shimmer.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_integral.xml b/app/src/main/res/layout/item_integral.xml new file mode 100644 index 0000000..7e0378a --- /dev/null +++ b/app/src/main/res/layout/item_integral.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_integral_details.xml b/app/src/main/res/layout/item_integral_details.xml new file mode 100644 index 0000000..720164d --- /dev/null +++ b/app/src/main/res/layout/item_integral_details.xml @@ -0,0 +1,43 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_integral_details_shimmer.xml b/app/src/main/res/layout/item_integral_details_shimmer.xml new file mode 100644 index 0000000..3a8a948 --- /dev/null +++ b/app/src/main/res/layout/item_integral_details_shimmer.xml @@ -0,0 +1,39 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_integral_shimmer.xml b/app/src/main/res/layout/item_integral_shimmer.xml new file mode 100644 index 0000000..b37da62 --- /dev/null +++ b/app/src/main/res/layout/item_integral_shimmer.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_projects.xml b/app/src/main/res/layout/item_projects.xml new file mode 100644 index 0000000..6876369 --- /dev/null +++ b/app/src/main/res/layout/item_projects.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_projects_shimmer.xml b/app/src/main/res/layout/item_projects_shimmer.xml new file mode 100644 index 0000000..a11fa68 --- /dev/null +++ b/app/src/main/res/layout/item_projects_shimmer.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tree.xml b/app/src/main/res/layout/item_tree.xml new file mode 100644 index 0000000..f666f1e --- /dev/null +++ b/app/src/main/res/layout/item_tree.xml @@ -0,0 +1,38 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tree_in.xml b/app/src/main/res/layout/item_tree_in.xml new file mode 100644 index 0000000..37c0f53 --- /dev/null +++ b/app/src/main/res/layout/item_tree_in.xml @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tree_shimmer.xml b/app/src/main/res/layout/item_tree_shimmer.xml new file mode 100644 index 0000000..ed431e0 --- /dev/null +++ b/app/src/main/res/layout/item_tree_shimmer.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_loadsir_empty.xml b/app/src/main/res/layout/layout_loadsir_empty.xml new file mode 100644 index 0000000..81a2a10 --- /dev/null +++ b/app/src/main/res/layout/layout_loadsir_empty.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_loadsir_failed.xml b/app/src/main/res/layout/layout_loadsir_failed.xml new file mode 100644 index 0000000..ffc6ef0 --- /dev/null +++ b/app/src/main/res/layout/layout_loadsir_failed.xml @@ -0,0 +1,37 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_loadsir_loading.xml b/app/src/main/res/layout/layout_loadsir_loading.xml new file mode 100644 index 0000000..7eb6cac --- /dev/null +++ b/app/src/main/res/layout/layout_loadsir_loading.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_recycler_view.xml b/app/src/main/res/layout/layout_recycler_view.xml new file mode 100644 index 0000000..72a92a3 --- /dev/null +++ b/app/src/main/res/layout/layout_recycler_view.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_custom_toolbar.xml b/app/src/main/res/layout/view_custom_toolbar.xml new file mode 100644 index 0000000..93b0308 --- /dev/null +++ b/app/src/main/res/layout/view_custom_toolbar.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/app/src/main/res/layout/view_toolbar.xml b/app/src/main/res/layout/view_toolbar.xml new file mode 100644 index 0000000..463dce4 --- /dev/null +++ b/app/src/main/res/layout/view_toolbar.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/layout/view_toolbar_trans.xml b/app/src/main/res/layout/view_toolbar_trans.xml new file mode 100644 index 0000000..10015cc --- /dev/null +++ b/app/src/main/res/layout/view_toolbar_trans.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/layout/view_toolbar_white.xml b/app/src/main/res/layout/view_toolbar_white.xml new file mode 100644 index 0000000..663b55f --- /dev/null +++ b/app/src/main/res/layout/view_toolbar_white.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac62461c63ac48641e3c5bf37b7e2ccc1672723 GIT binary patch literal 9668 zcmV;#B|F-QP)OdRh90kTL?UHXcT>@@SffJ*-qWQe(;pJ31P?_ zGFMenmC8s$X2O&NXc3tLf}$b_36NBseX5cQA*c*WMlyg8qCh|t86waS0wGD=vrpZ7 z&i?ybYwvxAThq+|Dcbve>pQpVPW!BR*n2I<`G6iudI|W#iKK9p?>QX$f-c&Lg`hYO;n)J>;R1p+M4-uA-zBOj1vaJK>O$P{q$ZHe?~a)TO435eZGQz zQ~9DIk|IaH%fCTxfElRzb{AsfaL=n8J0UHX@!`za^-F z9`)cGGeF3vYp`>X6KNta*ZpPBG6z8u-$>Z%5rPj>(mN*d#aEORr>ejkqXKc2lH%S- ziWN$_>y;G0S5my9q3?oQ1arTK7V)$YK!YT1YIYDb zIEI5Ni@xRjCI^LkiOc^B!#itVW#fT?D47TuS%mK(5ln$g_lK+hEmG@F5X_jZ#4`fRJ2lZ6sAgVp_?I zWHsa-t9((feDN#gi+l>vbPW-dAUM!SV+2YM2Ejn!S)?e?>jwC}4C()y?=auP?=#=Q zp#P`8OJ<0qiDTBplEDO_wetI4Qc~Qi0{7I`{LK}lh7_3ba>c!*V(B?SqXYkb#?J?b zeCuJ5uFM+)<%?XnmpFtBsrv;4VxE%Xg%rXW=?39ZhGPT4h+$6F2qEOqjavjJNH>It z5!jgoSOjY1C$BT%^k)qL^zWnyV?Yyy?1_GE?_rOU;(kccTm4zvG6dvFxfRMMhk_&| zv4sa2@x~QPi5%&9W|*b@OP(XtZ8(vV1nFLp=1xE|8|WRxcdL{v_?5{5aAZ9GsSu*!i!zHD$* z&`1QxMFrQ1!luKNFXpFoJS{F%(qlEFMZFY(8O~M*3Bd;hG4f+ZFhtPnWyy&pM5|3h z2qUS!SRdxSZ<7Ql=~Z(4V4M?07y)DVEVKgUEUc%M*GG#XA&DG@cgoffQh zZdP~4uN`v4qZHCom{pUB+OqeRRZaBXx0UbqG4VkKNd&v!WGm%<5+Tv`CQK)N-^O;} zI3?Y6#=ug*6GoZ{hU3{4G~7zY$< zv??jau)QoU`xZT?46P2`rI$1Ll4F$=8;u?{`Y_Rx86BG#wT}q$JFVXP$3-_uBIKsHto0mxNHD+O?65+F$_#QBd3 z1kH|W^NxTN51JopgK;UXakE~-K{THDFc5Ft-k1p4h}ne-TAIj{=jnztz>X@<`Vdw6Kboz$V7`Iat8Tc zJMX512t5*%mdZrslpsIy1)_W-RG|fU_Zmd&KLzzW2kP;om3nufmI#uBR8VK6zQ}10 z-z5*}l!&zl1*l{X-0lfr)5jzMVPP3jko|m0Ug@yir9_twrr4*CbtW6CLycIJf%sCD zlZsmsN4r$H4~uszVxvQbsWQ;Mu%_TA@{6vskRkfyV% zoR06x7CF!A)+Bjm3y#~I)?t`R54l0%2NVs1A9mU8OK%oJ_9)Umn z@oD^Z;}3xK4x)7xP-`7v!%?J)lxk}s!<>@*Ow7>6-|LHeRO|heq^uy7#ECnOojM=_ zas8fmD8bguREi2sP8fP0i+uM{L+OI`07_l9o{xAhqh{Kv9D{t)`6xEv-M3fb$<14^ z?S-cy_cTF0@g+p79jNs=;4ug4#X(SoRY1NW6+Bv%?2#1MbVj6ncVy%@67q9lfu(_K zCRya095=nVx41abThg1LGnZ~b1zwVkq{W*^F_wUjn3tn6Du@2x2o*HowU-{o=FQJw z`}W6y_pb+@`yQfoM?$T0pw?9YYaFPJ#{hfo1cGI0TTm(mlntQQo{fC>vnD#OfFk2u zN`TjYrilg z5+{`axg_tr{0`Tw8CwrAEO`0GUA ziO(P+!%IkCpMxTVum3pIx=Kv|Qb$jI8OSdMWD}GL&|=RpiI}Yv{5g{1ICe$3(nhL2 z6(Jj+)s*4*h0iMKJ!6w=*4<2TzSaFb3RJd+&;{4i`d zw#4a~sF#AT-Be0+D~;zUT0t8J^;logGUjel?2hi(8fUVyFf@bKzOh?B_Twn=6t~>ws z6JcH)SumRrc;f-Nq;cj>3g`X8oeuIXWPqEQqDKA1oUe^9dK%(kuW2_kG1Ro>a`UrvSTu&K%BOAgP&{eyCFYeX@Xn*%7_RRtc^ zMd{1pbc4+h8t(6T$Pf6Y4dP2w4!Mg#0}8=|*#62R`0IvwXkB|eV2o?Dz7i2VC$8Ug z4Akp0q1sje!E%jwwuKE)gy@~u0_zUr&oUvNJ0l^0@9Ok*Dn_!wnOWB_O>v6@Ty{rw z-g=oazHAG|rOJqAgP}2P)xNOU= zDD9DQbly4;dSg;68ws7~PjcOvVs?*JJu*cAzY$S>DI((F!UK?R-Gbeld!g`HB_oZZ z+Gt&h>odm>#;mUA5sh#w9G7y4EGTysMBi>5Ei-Tfg93wt$l#|^VWDm|XJMeN* z+ftMN@kIp}+4JIPCB3JO-Yk)T9>)1Wdm@mr<8(3UeA3-}??Cvcfhey1xON>G`8h=7 zT9Of6n}d4cTww3rK#>rr^Zps6mlBvI>H(-f_0=8`Nz+#gs1P%5Dr$S;9<=KtyR z@ftF)+O6bd8X;eERp&1W+V3dwzlF@naA^<{*5m0^#d(5C*Fd z?Oj6NSGH=F>@nJ@0&#-b;!~mX(*PCPX&d1RQ*L7wZ=tc z&}jp#I~@4SP{3aT6jmCJZ|oTH8R_aQzR<31)b;@I+8AJ?13c~k+r9~?W&q28Hi0nD z`%=>z6L?1j0#Rl5S>?EjPxVR!;&V!R&!t>Yl-nmBWXR-~Qc{m+OKnW2t1fbt6F2nn8-GQgYH}TYxFX5?%ui&ZmSK-BN zi?Msx5&+Fyv@t|bk?+z*HTwK~UHlR`U9Hjj|C>q*-?~ki;OkJRmY`$bJ_EcyE&*zl z@P`w%f!$z?E$RCm--il+14XvM==$V)ll)OTq<65k(m*e2b8*WJS77*%X{fE4i7{2v zF=o^S7+W(Hm&}@j)sNhwRFT(6$R|g}Cg&D&%;l2=@NQ-?coSl>j*deor7@e|3&CGBW!K# z@Qgqjsa)t=Clt%pXu5%zMun}e4RDDN|E@jIppg9YS8rDmu}5z;1ZYeLWFs^II3jEM zxRUM`S{(QU%l>CSOA+3o_tG5%#<-ebM{PQqbvu6Vpyfy3K>xlIFnQcGOdLBM6YHj7 z^0*nO9#)T$=a0su`U^3!Zi;~m`L!`s7hrIok@(B=w*zV!+l12f9xMqU#E%~{4U_7p zqiWb>%$+d@yWUx%P@tLwdqW`?g`}9u^#DFr8gK!gs`qS!Qv^`^Z9F@;xnv(s8Q^OI zVDFt!n?A!i9n$T~Z~kZWJ#RcF)J@@=9a}Sn_3p?a^%y?5wjCFeXF^7Cz`3Ka`cYB^ z%b5WCDxI14cR~PK3o*sqne#C1f=e;Eemb`O;SNPMD9kq+SCn?oF`jNxt*+xlngHKY zQoP26>VS6q?uYR$aT!aw+C+tAg5a%zkt7Mw1PDtBP&*~zxLVS+Sprx+Y*hiNtA=|P zWC&2M3Th|S9T0#BJ#p*|M*gg6^KsFPd3bK?9qcfW?oXvAY%Fkn)Y=dqKl(R1hijs= zsLbO)ofyt^P1e+4+l2N+$YW9DwUh%Mpjr^^xf4-G5}DxZ&y< zoGJ)y;;jSZmSxw{Zs^4qqk8ycOsb!Oxw8oQ^Dt+|JpA#gJ1z3#NH|W)X-QZbMJ?vk zqofn)be>D^`#cZ=B>p?qQK=Nzh}K<8@bIcz(A;n%R)~dY5jUcRuM0bX8`0t|L{q~J zcyZezz`q00#-rJ<-**CB7!zRVz;T#4WdioRPl+_c82cdsnyH8Yf&;O6b1y<|^@X@( z&U{8basIQ6{ALt2^6lrWTh9c56pt!2$7cchoBcm&0+g?UN+p0YjKMO5awULYVauj_ zQC+nF^<%HXSc1AMJB7NsD=}`|RTw#99GWs$tG-%t|N zHoMRSpbEY@d%N#O*ydKqcs6r|DEiNNz^*It!iHJ6{f9MJd{Zs%UO1*(SbTFW?zpxF zEAE~I`M23n8$a33228BeNRHjTq4gLxs67EJP=01mpDJv9@>XL9h)K#f#90Ekpvd-x z=kCJ1OBP_p)XQ$iUy6%o&F_r!(}Xj%l~@8EI*wG3Zu8>x zr)C$_Yr!6_GewwvB!K3A)w&4S^hKQx=4zDQ=Ev7^VXeN}J((d@ot~gL;OjX1tU3%C zP=&$$su|AjUxPt?M==r7NVjPLA_)2A{m!YuPj8v4jbp5Wx+g;VbxVNV?=Hpl*IbQD zFIs@-wswvDgaBTO0Nz8NgI6j62WkV1`q{f!XCjFJT$OST4Azq*WeIS8|4}gk2nP14 ziV2X818l57hImllI$Uw-g+NgwG70*+Q$JP;%vl27UFYH5cb4LlV|Ff^Nmvy zR~Ne{K)IE$*yYSbuOtDBfz8M3TIu=if_`s1E zI-p9!z$%>IZzQUQ)apoh?9?pOO~sV)lol9=>67Zwwr2^@)|5q37lbH9sEt?Hy)JZ) z{H*Qp+Nq$=YXYQI5GRUKsp#&xU;jWN0lZhTlmOiz9bFNGH$NpRXyvV6!zrgsz&X9^ z(7Ts~u{f(&9nL+w9s~Mc&>;*OI0e1Wnt-8$>+#N;cLQOwITw(ek}1akry<#8-Eo>b zg?znXD>lMf0*=Mfj06-|0#cnzy7PiE5)fxEo1sVrZ9e|ssi1Y*CeQ}joxeE}KVNVn zuA6-t7S25dH(qqAhPiY-1vkt&88>zU*Uvf$w_bJ{-uc^4fpA%tYs+v&yYrSh=6q(* zbaN8p1(6&2cpL`|G+8=617;5xl*Rq2#p}}|l)+pK^@Ozn2abGY?Z7%y{C>g#Hg^JB zy7~W>BcR^95fRlG%qFZf6P1Jf&XR~7sjCD}S_SD|MSOjD4>rcflg>5uV7nE?RPwu5 zLmAzerwy#jb$M{(ak@Uc=3`K6Di0b&s}Do?*kK4)?<1_CYbC(n+e(V<=7p%VYgJjCLF%Wt z0?}JPLimfL5dPwm2=Dxdg9e3Pd>Vz@_Z^CNd^-DGzdRb@Pbv^SI|C|uK<{!Zvu;t2 zq;yRH&NiD9Gw#iNPRyK$IZjEj&8VHY9#BqKlY{^+qQY`SJAckMS^Tks@TZ3%ye*f& zPxlXsx8;Ce9u6!zV&CBxALGyK@2X@d{=`A_;-yfb*`&2k26dl_Pq1NAaFN}!~8z#ud}k{TE1%Qa5APXeOwenceR z(MsmBuy8-3kTRpI06e%4u*zJ2g{!~+eGD2r9W|q8qpE5)s;WDOQB|{1Q!^U_2TjK# zkKV3#O_ct2v>km`ch8~INlxTbTNTrcBi@#h zYDHkq1$T@5I5?p?fZo5u+(oHd)r2Szc1Jzs?FuP(;+SLte=zp@B#{B1D;%9LU`*A2Q#F_gvq z#`qd$w%bzPS5lm4c16(HFqVL;(*&>yxvt`YuKeFPTvyH5xb9ZWn>!6-tLsrSq82s7 z_Z@~08jYa?YcOokXbc;eg`p*XGYqQX_m3Ph2BX{kW*urqbOf~+GioemU3dXjG+&Ei zkfa*+ivT5O>r(pvCHU@F={&Y>%AqBo-dJgUGA8N8*{v6pw0}v$dd``vX0&)e#Cg3& z;Ou`NhCaPVpzqlPBY9g%zkPrKeMWJ@ts@u|KOfZ&`ky<}{9gA!Yoj%ubLMcIdCE}y z==w`gNZYslQ9;@60+s+9Asapee+kC{Idg*hd$e`h)P>u3L+L^S5+dm5l$NFR?DNmu zjsfQp0!L!h&^k=4pN>i6W}>coGDeS_h%uwe2YP>ZP&1+wCSdf)azKBcY6g?X&qU3L z@i@PK70x_$C?06J&eV4407&+p%awq*1zHeq&Rq`qYX?Cy9nj#G?sWZc`hkJLEv?m^OJXE}3%$ zua8QL)x+y?&Y8n7cg9o{wPx6N{h#iSn(7^)q`1y7J#SBUOf$YuDJj+(Z-$O2#VxtI z-?*AAO1pH8C>EM<%~f;I>$D-v!4~lZ7tNfHN%b>1Pv24g{=){^QZj2A)ph6b`e?1= z>!#t{vxZ^Z=yBM!<33$S_V-Z*SuavEH67ZfOeo=WLVP}enh1eTN$#ZflDI;nDf&WGg3t}r(TLV zGcM=q*@(fT*#`Xhrpro7nC01kB$=tNX%9#R?$M?Lu|6Yarbf{9Ow**=w2P0M(J@84 zR6$lpn!XJ5w`_GW|B~rAj0z3>i>k)>n%`eXCe< zYpcfM^;Z{hkj7G76906?{UrgI)hfiy55b|C3yr#Undx<0LG9O-Y^1)RwoMJ?gfi`X zyP|gKl^0xW!p?W@!*y3*#BL(FqPv3@Q8OgQZ*&{J~+6DO2HoeVcf8v17 z4r(hY7MLE~InIXKo|f=kZY-BNCs4@bgu3yDI*f{m2nCM`vF(}L@!$hDpr!d*v@Gkn zuyVz9cyjY?Xft*!os#H?**eh(w)kR+Kpj&E+KiTAt;6kV;;BK@tRqiD2*d=lcTsmp zw8fe3R8S|?A{)xnw(#UsOHYSoNg6`#GxwLa&`)p3eLBpG&lg*{hbT{P(!Ck2bJMXRCG-unAs2ih(EBLXOKuS>n2&LqI>dN9q)V?(UB`uL(X z^4&A_WGOd?V6AOgMh)Z|9psHWs`b-wLqQV{WL?tEYQ6m$)G8%fs^-j(i; z+m!_=_2Y|mXcf6=54VJ{?!ReStUIRYnO}L&QF)#Z@cVR3knNh%xm((q1pIdZbWH?Z zLCmHexPhyQgll;KkaTn0rII^T#$6LlyLvEn*gaBGToe<)?wHF47M&8|?+sMO@M`ZT zoBQ!LMZWliZsyIS6yxCzN!!Z6bL4hzv0D-PjWh%7GfIlBx(`oU6{V2>5mGDo;2^0S zrZ!>GQB)gzDe2Xj%@36*7-lc+q;6*hnBioVrj>EEE;H)G8?jZ-Q2Xy%3RH{(Lxj{6 zD4Y3wDB9haqiKWOuChp4rh}0t+_HYhA}8FlgzZ82(oY=hUXn}IisOkHN$TOFF{}X} z5ExERHEXq961m+Q;fw|xooWNGXs?|k(8)|0mDk<9%~j`z0`LDIh~t8|jd4~2{_gC7 zO6*~JfJJ)T6>Ev_>y2+-E{ccX>1nea6Tr@fB%82jxh8^EO%qdrS;_Q_Bw-!R%m4rd zYDq*vRN?e@LIjn%=af?tn>*!JkZRX6l}kFOcchARYJze^G}~8C z(Tk+`nek_}Dl#2alGcpY6X;>>&4Pmm>3d9wkZM`4b3KIo=am%4^CTsXdbNEGyF-3V z1T(&h+w4kFK_5iE@hC;Z9E?4H-eM7#+)~EK9!C4`Lj?1LTQdqhJ+@6$B9bX z?PfWjT7I5k_E}ZhS;Iz+mxugPRg{{Pt@|DO9ueVpW*eg!UznPdX9f*;*Y%d+^m}}9 zziJhAokqh5T%vx_Epk*N-u_^=7O0KpB!~c zyd*0Xu^xr(x&PrvN74n%>U6U(gK|Wis3SecB}|WJjYVzZ)6{;2^q}Di8?@>E6B&0kzByPUW(Pal)8q$B zQrgvJbzQ?ot_kAfT^(_~Bir31nIu9df#|uXr1%%s3WX)yev&!fBsFQ|d#AzHfjsPd zNy=#yeb)(EwYAq&XKPPKoqle(!y=Lv-j*3@Zl?{&m@DJ?WSIfWX(E+?^}N!Xh&uzz z{TWBW?%9-?GrXm0rkG|ZNbkYOcl&}yJu(w|+9nzZTZMz&AHYcSED@4HpFDR!Pu-}X z&0UIjSu-){$P?KI>ckt^vZP6CTaGGbrm<>Ukvu!(R6!-yPC=FIjXghs)o7NU8@}6Hhapb<0RV$@z9=-9(~0k z*Sf?Bb?{cf^HGvXtTbzWppx!gRFF1V)zU&oWM&mmw?@l#Mbp1DZX%nuDam$kLU5`A z)fois2ycJKCe6|arz;_SC450MG{1@>dp8b1iAtR#BVV6f%wn+22@5Nj03Z5;qh%gk ztO>!~VWvaaZ5N!*;5|p)v5fMXhN%L$mXvs-S1chu502)u%zWBh zpJUKqk!fB}fh9nK-0aDABE&A`i*@NaDjHo^qfk%k%q&S6#on<`ay~*DiGJ1%>a);mqTAx(%WNI zl|As$UV_Zd3nrp@J@K?OaRTwClHvtOk2W8#GIr`RP`yKnQd1o!ECqSq|5^#tUnAKE66AFLM{wl<_wuoXNWmuIJt$I!@Px;#Ysd#RCr$PS`DmRMHN10_L+b!2@*jYR4Q$Sw==UXynqplwWgT1YP-ATLA8qD zPpdW}RWYE&wg%8bi`ZZ-t%wpZw2yc1)*8?jLluqq1GM+f-SX(OXi+e2lmw)|`|dGk z-Mh})?(f~#*Vpu&WRtyjX3m`R-7{xq&N&FDIN>R-Ka2t}Y5}J>0;5ad6gPmA*9m4a znHvFMHWA&I%jF)7`yo%tC6LW#A0ncUm6U$1qobpEy1aX>hs0BEgmBBIX#z&QZ0 zQwTB7^Spia6v<>V_W{7C>^>bG9dA4708mPO7y!0ZDBEj{xv~}j>2&)0i1>wy_D!zq zULEJ_^OzH60aD7%h&ZQGa70Y|zQ4KheKwn2MMPhzc>jRwx}S`z{0Rdw++aTc|s{0RdFL=Y2aI7~0$S@CM6}Hkb{`R~L&R@d@3t9ZKFH76Z1#R4 zy4Gr2>ALPsC2%$Zz*PXS9}$;3jky#5g}=QvJgL<69ddOrX>VF~$f0GMKoc~L2K8vuOWYJ0*M^MU9&o6U}M z9Ovbd^6LO#(E7K*X$6E~wE(U4W+Ezkej-{K1VPc9J3BkiOC%CI0N~6>fiMi`=JWZV zRXD`E0ANXlL(FNd=dD<=B5XzZVReGZWOAwy;z>)uR}t|d-}m=K@3ht{iRf$5Ga^3e z`~Lf)=W4qF5&iPOfdlilZr%ENtI7{608+|F5pkBa#_tM(V9>rUrJRU}&jP?$tKY03 z2!1hl?%a0^A)cyGk^#-QuKTYz$`2a=N~y~L;CGgg2ZRt8d!E-Q^-5Ho$2L0Il^bB3c6g6PppJRv#i-9|S>D7noEkb#WMmPq#B)Y3##^L}J;_ojaee z#;YL!TI+5i+SG<1d`bB$5j_$F!5yve(OO?fM7Q&45dhxV%Gip&+YcQ&G_$|I|8OOb zh5#s~?goIW9@}DekRv((u!D&D5OFU6>=i=nZ4}{YR;g4fHD+L7ASr~H1OOBGM?`Fq z{J(sYtix}*F~)Yr#jec&z-M-zaoUV+4H<#*<<1=-!cHD<-nmT2H{Qh zK%m`=9t5BTR-f1)NGb0{#Dyh`d;Z|TgO~L8_rJ=|?I<4$fYPMX5s{a}*|k8R-HVa{ z#q)z~7X&F~4iV=@d=T*p-}fJHSNYfg@W50mb$J+u48pkM4T4gN;|8m&d6p8j2_wrK`FHr0In$WBbpinfgNRPS^3x&kjZ4&xfPF^h`7aZoH?mf zN|k&<(h~C0APD|c7laU2;05c8VAdn8^({p7EvwI0jWMemjce52vIW@6mzeK&U6<3_ zd}8F_cFxO8`_+o}JIyTrRhm z114j~j^%Y4(H>(A-_(vF+I`*G03F?c@G?%^;5Pb7+}_pI^@hWT4>N@9kiNZ zQMFIg08~>R5r679PVul)CGP*IG3Gd5i1IC!+S0GVu%~xurl;Vg`Dtb>ugLZ(SKw-+1 zDQ6Z6g;y+I&lzJlj}V(`T0o68f4Ac}gA$X`%t|S;q~OfYIh8wrEoCXnd_5v^{GW>) z_9Ei#jZ9i8#i=un5f(`Z@pjMiVrPe{0+3Fp(}-Bx zg7yEq)La7Tbb28oeiQ)M;XPE3Yn8P2GT-;hr?zA=dASgR6Q1dor2AiI{<^D-F~zv# zOcZ6YhMn0eaPcyPs_8AfYlv4af*pWpv833*UfXceQ zsGUn=zGIBJ(-x@YOZZ+ezlJg)5#51^eDp4ZN<_sPf)fIOl=3V@EEg!0@^o*sOI<9% zIE;0VF=kNBU!~xsQ2fmmrF3>T&Nh{!QCw){`~EE_1b`}+lxlJu;8M6kp|HHKukW>H z1!dldxWuk2sxfxEF=l$ReC>X1FM-a^&T)xE;-wms^W}vD73{>gz#$fKT`?jqCZd@m z4geNNDaDmsAF+hvYOQrbh#%A|glH8FDdl_y0syAkV~J=<5CojVY?<1&0G_c_-1KqY z-x2YT93ApJj|&`*3rQ*Y9>UR~*NN!Y?c6zr1c2kB)zyiUma<1nmWiq=Nvcs(m9c~Vk|wH&s{&%s<#(x4eMDu^L^s1! zaME@GyAWbkwL!FckUyh>fMt|`c_o!~F?e{47!YusR*Zmh9U-QW6oH9TPM)VEbki<*}BPR*MU_t313?E`tW>iH2Xorf$?&8T>*GzYH-JvrdUH_e^8ErR=nSg$~5rk%A^OY_J+2qT40Quv_7~T=ySKmg`{kSK9?%JTfpic)PXwDVm;z*DBgC5r+~)*+ff?5b zivI(V1rOPbQm7!-lqx@gdal4A%$nl4i4z}`1auPTLHBpqP=O{cud_Un&6kdLqE9=a zgIJw1tyJIaRD(84U3i93^-56L6TP5I|2em7`8D{r8#IJ{^gNs>7T7(ejFPrjSwJr{v{=;1K3z&_QPq) z8-foGWCh`7yA3-9bq)jBjG6cc@L*U_VTUpxK1P!6Ck4LD{&>6K(WS+0VQKPcMELQS zuw6lUI%9E`d22Gm)v!d|vP=oF9qdYb4}0fZJrqSC_FV_o^Dz-GfLa_Z_h{JA9&*%RU(X9CU;mK|HF86F zQD(^9jFps*ec(fkXi!MMQY9+~rd`3yZ%8P9J|jX%2C_l;E%_47!G2+vT~X%+`<`4i z10`TTv?!wquh+>sMPeyt11Kb8WcKIOil$ckH^*fCUEpB^1kJ6^TKHX^+naV^<@ zx(NL=#J0Y=>_-p1*Ue0RJcLH815F%GDWs;Y_F?pcd=P4d5K`$RTf!g{_5;uMg}bPd zDy&hQ)_@m42nmt80FzpH`nKI%!AnXA+4kS++{G}p*FQ|=9XpEh(e+Sce!w8XpypA` z3jm-ufKQpKMx8LxB<5 zEa;@$Nb`uA>XTUiA)XMasFi~3_Orj^3nL1ej3^4&jE)L5cJ1+p>u^FB3IGqifXI-@ zIW$%XNOrieP5om!|KAV?o2B7kQ*bEyv9PgJu5#mt@Q<(%=fpl|;{Xg8@lrv(QbE49 zU}^Dj69&8er!I3N&OpxAwp`|@LoIn{y2wcIfmm?>VJ79NrJgGpsZ8t{)|&(+;L|%i z05it})GI9k;WvmuMqkN0IvK#H64iqq=YU?wYuj#4BP5N7kO;!y4@9|<|*opk+qMJl;}gGmj(07Tc#UyI9rL|EZFL1rq!;)BC~fQKYt$;zp{`rFIB zP`uy}CeUJl-{c@mwZ3jCWhH&^K)5NU^X6_BB#am30YK|O$Y1SFd__3V+6^-zJ=j|O zwP~Cjwu2V5L@7kPi?+F2|kci3Jm$(1(2fti62r6uiUKnpUQ>aG8);aVh zVWxQyB-oE|y75u*p@E#dXXGSCkqM$GL*DAKK~`wlB3c#2mFT@CZI*9qN?{@ zT;RT;pkWQZjSCTB@Q`RwSyFgvZ(Vz*nZ2oG?vAR9_+03%JrayABv!yK73yemWT6ni zG9*e(EGQC4E8jQ17w8LwBohr=pfFN9+o{tSvX15z=OnprPt-r_?e}e!DbSxs2OFkd zaZS_JsEP@CkT2x){3@pQ99knI;CtscN&PcTrgb&S{Md_(WID4QCaOl3tZ}Kdwbxmg zo8SBmpBOECqwh(PU>)%0&8pWluRP)o+Wg8t)+s>?-;iYAimHPiQYe`bw+%WDkm?U@? zGH%A{kq}aWd|sxpEXprxrjuV{Bjpye>3Slg%qu46EapA1aW3W&JU05YA z>=IJNZwYYag2M;sreK}fQ%dU6?Vr~gE%{5jTqS^#jZ5hjJak*)lVF`d{o19r1Y(`K zZ_pEcDX(nmdqDv0T|>~{GjS86%7`LE&$|1tE)ME?E3;iFQM1zEOQ))F4RPv?L8_ca zx{n;q;avhdb~wPBR{ZD283A~P{M!_5cv$ZYjU+W#Yq5=tKylwuviDCn1n#Qg{?(D& zZNBT4_&)<4iagkJGHHgs1JUL=h(C8K5JIYxns~5_pqGv`Db+^HC6jb>R_J#To)vB2dIGV-t`h1 z*a8dK&!tA;wF^sD_@&r`6RnVRDz_UbXL;=c3gIn_3iWs|69srX z7s?*cjCY?!t`VLD(#8@@ooE5sInal;1c zgPb$0-A9A`qftB7RK>gRzHaE=T@aV1$gd_wnd+0Hq`Raj1dy`Iwwm{DReiACdTvIL41(iE3T2Rd3JXM z=r6+_?|zHRf7dJ;;V^8PNj5-gmb{hagN>jYqK57$IRrf3a{Y2ufB)*haM;Af?g8Fp z;m-WBmRQ)KIYhrrkoT5id=nq*#Gd?RY&F^U=@n|T+|?xrbr~Yf5M*n!1wchsr(nC@bYybb8Aj`H_XWbE}9A!eNS?6rIJI_kw%qSsqKNEIzu=NnK|Xhcw_LHUhpJceDtKeG&NCH3Kr zi=8GS0iIeZlTV{oIK5rBE>$5v$_Pb4_-(ZU+mEJuvIe(^`D9~-Ys0@FJM`p-p8x!Y z7BXu+EyaIOEM969I@&(yNftCSeQ%`X*2%hd6+-OF){Z2?fIiFc#ascKqThloSwKXA zAY=Fbhx0ODRmNJl5F*Xm%;$mm)MP@F%U;iFFZ=tWt#TDA#;hQm`rH7tM}<1p>I#*a z4(_FjR0ds|Y-fA@&(BUe|0#(I-lB8PO2xgwYuXV#wtX+97_(lAYXg>s zrFUx^j9{L$k-eGFCo8_VjERW@1B}maKedo+JL9+iyZ2#?1rUOuT#)0r$)poTg}@fB zxw`dJvLfr8M{ChmF}ly-ii0Tb<7tRt-g4rASZOz#cM71MroWzVM$}QAt4DH2 zIIJzbkB1aGZ8i?e%tm_86q>Smmu1%(=(=yF(ebIwl;nNY?UjBNRR7uvQ*!6I@LS85 z|D;sW3L=|CNmIM2PhG{Jg6wfg*Y~iXdEtW*OIO|wy7@9jK|LM9JK}H2UCG`&(6fll z5%#s8 z7$F`UM|8uYN}0>-P9@$jLb!g(X#UxpCs~C|XQq zxSV}TWvo2l?JhGJhOCf$$S64zZ}4fW1y;2P?KF=)#;}wFZ)qa8uQ{ie(57i`oi#Jzjcri(&6dMtRg6wKL}tt^ylE1!`)Tn3pD%<4 z#_HqFHOFXi)H)`sldB6=H;uF}KJ%*i5p}X22ig?by%dWE-!VHUD6cGzMqijwVZWt9 zQ!_+roIEITerJmAM95xLFT%?rarxzZhUeseNpQwjD~i!mJX&9!r7LVGNYYYZvoJkk zCzn?i`tG>L*h4Z}0D-#b^DeS%CyF4;M&pJB+e5Z^M+w>V(8kF?Xf|n8xjJF$5wgly z%$4OicG~rF41z;h7P@f6PAgnJq}eEVJ#cJveA7~Fnn+*#T>2G*%QTJfN-Wuns}_3AP{N8$-Oyi z!kc?Kf1e92cCSk09d<^S@+t`w6<8Xx2WwM|GW8IM{i)J@{W;-e?3(8w;TzEc zEK&61Fk91aF#kZDJBg6#Afqbnr(I8~rqtPO)}V}^YPk3Ez~M!S89olH2Q^2SIAxlY zu&A5l4%L@`n@yKpyV%_9>Rk-Jyp7lTiM*P_88eMKx6m*E+1^A`31tS$WbEYq!v!Z( zm3$AB4;IERAEyDbs|hN1j#_Fwz&x8Y{7qFVX~xQ%U(U>Kf~FrBv`k8~*HPn(K*lf= z2@4fkbh$+)Q9gFBR+M3R{MRJ}ihq!hHZn0(G<-wxK~{^-ma5UVT-O}<>Z`l&E5@Vy z+6CIH3R{0%Wc|&_BfPOET`HNy$80GG;1&I<+B?N{i~a5M*xSH9jy_=5bO%d2 ztqCbn{&||6cf{E2cZb`x*Mgo_t5IfT2FrdOpT^YFa^zVTPL;}5;sy3{rL+)}sX z^sF@S0f*~lb}it}NQRyv0R&x?rUn#k>z6CZ4+z4gV|0Iq{II5FRVDReDj3fVw-0BK zW{;53!Vt<}pOO4e4mW5faEAz*#SH^7CjyRH)P8*dCRx&SqL5`paX;Mhz|f#%Xvx5tgmNMC zw;>QV&MlkXP3dehA~fWxm^8yl?V5;3>7;KrC1L7fYcCxEQ16sM`=+7W$+aP3{dS@k zqdSp1!iYkcO24UQgYNwT^Ap>`m{?Pxm$!;RGJ|En8u~ki4=Sh(We|Q}|D}C8|2BFT zxmkR0+G3jsqyRUyFoYdL>3J>wx4{!?qV%i8pVE3K8=wa|oj0TiZ3Z!T?XOOz+P|Za z9RV5xwS))--?ldefjYs{czWVH0XP2+wLm>vg1cW&yhIPYi*+fL|?A5u*c#Kyv zMxCOxxV_yCt+^S85#=&X|90}PthISKhJa%j9DS^(?*TO2_M&5cz?Ejw-MA)S9}i^eyO>@&}4UYvS`f!eA#KMkcIINQFDA;oB&6NM{qRHTG$43zf{yE=8Y&wF6k+5eBLCenHJ^Y5hc{LA0r^aL3~Za_W>CMS!fNCalb3f5a- zMjznYGvg|rkA&|Oa#$iy)&T?ek6`2C^#nbBW> zL%Uj0fbh&y-|WYD5rg03p2z~m@UbM!o3w87PX#{PCWGe?iiiINAk%QWjhi;kk&3~h z{fu3np{Fmulu1$WtPt#4+{yn98YgbHb8TFepO3){9g{^TmAYx!fAtRdcb5(?BZlUq zF5?;~9}ZK9OO8RZ{hh*z5D+~>@as0=?H(5I?U2sN_}y@7)clAc>{PTP4llNNoq$Pz znA*jU0j-qdTkND~_Bf5AAswx_qn)EJgg8P4e|UL<(jI-qFWMo`cVacxOde9qrB8@< zRdYr><-hp?Nt=0KS2c?`0P(b+3@$_IsGL6*r1emLv!TTmcLc)ZQx102u`zBcv`~O@ zKAFiI4(HgAHsB9b-34@ z2o$!BiSjRA?ceALTDUGcGgt`SS!DfSvH5F-9KtP1D~Lq?bF9^LYb2eFZK=t#P=~ z#RRn}=5(*K`ceHK)tfh8cH&vuz6naA*Vi%Jiqtn@Nh}?66^U#vyJS-)N=1-Q#~pJ4 z)D#f;3w#JC?Dg-+m7Y5W5Z|KJzmOna0z)tJ6n+Gq`p+DaI`i)JKlx1Mn~q}^WNqV6 z`n*0;S;o#BreyaYG8OT(wrPUcx}Y(Km!Q9&?*j=VMahFt^c~6DO_*&Mt-c2R6bs#Z zxt&uak#Ji+r<<;0exm!mo9j#*7ORBAVJnyKOG2Kx zd{FIdG#0j#JK7|{D`&kQy|uMj8DZQ1%LSJLQ97mLMXjLG36{&Egqp0}|BO=G{ZP{L z4g5e91u32ofwErM&0LQ&7dpNuHDz_)PvbQzi%_YnfAp6F6MN2k`!_hbOoQ%vDIP{u z&Xkn^fR{x@HB3)8j2Cao8-RUmpiF21VQ3R=IO6(nibMfGllOJ0)rFS4Bt>f4 z@cq4U_LZ>P;m9#azm@b^?3Zfj!9$ChBy+0viA`Ega{aEqGj4n=T}ZR8Ec0Im)J7(@dO#mjc@Smt zJ@^aT!p<(XTFfYTwo(2LoE!j59j)s}<(bU|e5SjI`JAC2u<~E?xJ-_Xu;~F4c?D&% zd75w>J&l%T*K>g|YHDT(+5(^VjtYdl7U2%7-#3L#lj)oelpf+C$V!`*4_b_}e{z~0 z!GQ5I)ID_p_G8xtx;8}A?DDKW)b)HNYu)nr1!u^+=@u>|Wut@4?^CFJRKBwEVx30h z{fqkBM4kXKq`0hq-PnqayB(wQ32G!%3f+hdW}_dYR$yl5=Omhm_NE%#@zaIcwr(Wx z&%L1IbYr~!&#C0+pBXH_$;^(ZqkgYR9dgXVICrHn>Akr zc3W?SsWc+9caXbV)4`%{v-*b7U&Sx~IGq4laCN(wKdVgxsQ%}@aIFS-hM!I=hPg;h? za>@u&XKD|cq$#!P7P&>k*X_;6emMVGYm6hTYou{>aDo0`iKr_b<1d=ud)a6tEUMDXrt3q;&$2-QmLi7}Mg+_^@WIN?oK6030s4N_ zdhA;*%Vu`~5Y(%3d>g1J5_+c7OjyLz4i^9oaLrFtwf@qH{a+=!xMfE+FRCJsD1uDG z?Le^+nWQTA{buJ{!exru(5{SQC}5CxmJij;J#g4>Hv(BQXurJM>~ja{LA2?s0@|y@ zCDVbVxE5V}a}fVu7_gC*auJ6j4& z_o}%6YA(;dD*Zj|;KJ3Lic=z=)fG=sjsGKJzgc(I(7dZK#-yKPnbz7Q63h`dwss+&2f(MKN~sl#_BBqs=}cw zwz94ZQ}S)n)_uW;?M!^9staq}W|%P!e^u9+DR4fK+dF%ig6F6Wf>qWM4<3G|GfIPl zR$6DeiuTe<+BDoz?;j(4r+az#Sdg!={ElmeT2Zs;|G{!&>3I6=Zp!&Et4?c0RPMXw z)QJy*e)bNy{dePc*QU(!^tDGW zkGML0*#0+GJ0?RB>WdLc?y5-t(3`cehES$q4%2=aqX04Woh+A)ztK+lo{&EwLpeJ} zkPl%1uIIf0zeOEl*ZvX!Upk&&g@vf879Kb!{L!R}oJe386%E=jgOVZM&mgKKs(1(#+%x^96{A z!o3}HZp07R*n5*V_dyWNwNAKTS!Dv}_bB)`qXnk5B%Fzs&+l%)=m|vx)pwbP;`OyA z8-gx1tskFNed1LEoR2$C^8X;J zx}j{C?ZZs0>c#@Ix_VzX3A_uqp?V#Ga1Au6+;}GIpcFglS*t&H11?C;EixsLbkS=` ztm{==C^PU7o037XpjDt4P1?NNSEHS=1Qz3%lWz^;2(TKyUWCj9(#q8#q@|zqP2NB| zcKVnrgO!*(f_07iSh{9qA-w;B$fDXW=|{UUv5^;dwAnC({LvQ=aim4!$M>P^ z+R63{pm338W=e9b&A;J1XaV=9T8aQR%0mO5+(0rYr|kY>uN>kn92gBsy_BnVbmN9whLKmMun?kI}{{vRo=y>thj@K`$C3IfOAUg;^}zJ z`p-CAG+-u?UuGpkv6|=C@~$&MRX=N;FX?v**HtO|*tQ1qJ%5qsktYvS z^i3r1U6E!(8?MRP^~!yBT;<$+=Taix;I-+Y*z*+L1vd;NRs3>!yxVNh&e~QTwTpG@zjg$6A&~g*ym zD~VU1cu`?BWAV(3(=q)(mpo&(f*7u5BtNcE=;2q&+tA*{3np+w!P@ssW^!2*@?ryj za@3+4RiJAYr57!-x2eFyvwYkj%-PtVvG1oP3Mrwoi5*DT0@8|o{z zB6VsYHr-*CqAv%-C{X^{Q6c_vM^nXSW{>o4!q1#GJ$F<$leR3jux}{C*q2{O@fAho z)fx>^dn6>~(xA9KS5}l{^a&Y`FK3`#*PnH%S{H*mCWV_{Tc8}(k^Qt5_+GvW#!xjW z>3)1$JCTe;Ou1w}Y0?@`-?Ns|=$|O0;>B}QpVvR{vn-!TF~b*k1lQh`t2)tA&swU= z79<8`!->jGr@S~3pQut+X{glR>U~i!=?YF67u@7@${IB^?`=A<otV?v|cKSkYop*O4~JQ2GQ zg@zMWe>!4DA;`~8+K5OLt>lo|0~7%v0wREH;;bO5EFZ3ZWU+cci0B?l1D z)VCS3I4sBT>6t)O6y{&_cF)Sg zL1Y2C0URHX*7Hl8xo9Zn*b9!qH4MPbEx+pC1)A z7%Cji&=XS)V!q-3biJPw#t?If8#yPfGPrJOvCljI1+=%&y2otEnm#WV$kuJ^8Uv}0 zm$BdCm9r{cZT^rxsF(=De922mLgVdWs9!2V%Nxtf`3(xj;ota`O!Mp%IsHm7UUXsK zWP`51Oek8aUceCTABk-~Scx9x0qLww=b_jMfKqrZ*BV`|R(g)j!?hOqXeX5aGZc|N zGqyIJdqmP0Q~O=!R;-poQ!$Au+l(rC4FSqmE|naRtv6wtmb~gESt~O-*8UHcaI$Bx zd4uiys(j`)7XFdh>{Z=|i0ontGU9%R}DmUs>!k}yt+A}5 z`jb(Qbc{^(FzU41QP?RFQP9m}3UAEp>Wf;Sx3UH4Fnh2i} zV@Z~5@;N1@OgRhijN`2$JmNZy?Q4WH+ni{lWtz)fSh_=14u%<2V{Dm=ISSu>;!pVW zlpZm~EfPUT(Wd!oM^IB_qH!a%X8Cq>QO}DLFIo?5JS1~1UVbZfi9ji|(weJ@oOv5s zZPM){XW8O?t2V$D>T8x+mHF}y|MfwHZpC!(T`>xx=XGLMOvhlK+!?8V_JA*-K|XR2 z37qpkr3VHj61YdHCc&pa=U6&}sa`6GkkThslL*u_^$SD{Djz>`gt)ib`|*BQJ*ICY zaB{xKzKi)(ZgV>wdgHS08}O0caAQjZ8EX2MalF+Am&0c)z@5iT1(<}1M1Xw$WADJ| zno164*#(Rk=DLf8eCd993y+5A@p$(6sb{Q__U%uh*Gw}poZZY_UzAiU-=*-?G`*Mq zX@f@78edMC>x44&>T#IAQ7tpHn^|3lUD>uXuJ}n@(e7`EKDBETjx~W{-LPMNzDT>)fRkTQQeUnd1AN^T=vAa$*=tGj!7_?00y9?uSCfCY#KEql;OLa zJTLQwPR85)HPrbcOhDlDzmKhEeA(5Et+RUMMAs;`UIh1}7hFr-XdcR)b~WXltMbJr zn;u~@RuWxeT>K8~@1P(VW)>oQy+vd@kA+;A;Qb#a(rzA4U(VJa5FH|C9IBF0Uv44J zF-H!F>P*5DYMKB4@Gsx_ME*pvX!iy4fk_A|)jYOL)S?OmW_7ko2IcKq(sq@bR4_YrObB1=O+hf1tq;@!T=nl#aFZ7-cA_Z04`uV ze)hm-wOEqU7I#E~v4(mGsTEvm{C#v~)>!@3U{S(E!h~bF!%lRkSUA&w3!XckMd#|Q zf`9#s$Qvk`4JqJdTLW)5-{Lr(6y-|uv#?-`Zod?<#@8P-_N5EoQqz3NSEq|wove{{ zJ=i@uv&wIB8}CjlZ^hH}={@anF>apVKbo1mBdx3Q+wxK|a>k9oF&|W3BKqIC?uw?f zT^BcMaZrL+GcF78XEgpbsR7%W`~wSdVvA4>edADbPldNY^&jEi3_tCE0NZO%y%U5s zZmaMwMiSxstV0OcpJFSCUG&j|ofg9%V64&WR$fUv z3UbhVn9{e#3UpzVQMH%5iOei!W%CpQ$W1i(bT8*AUBTLQ-}d{n%gPY=UQqNW78=<7 zPh1sYePwgx=Kjc}tg&o8@__7Lz{DqcIuiXAi)x5^_1rLzbfAQ@agC=90>hZXT;^N7 z7qS$A$mP=EHj({mM+=e0(XhgWn}ER4c24RuQS2`o!#Wzu&GdL+<9`aCuS_o1{r7GA zPFHWN6cJpu32A|--VhEkn8!`x5I-&^48FAAaQc*ah8VAteyVIvQ4zU?Jwnmx91G;% zn5VAFfihI&ePszih!;A&&T2_*@bzpbBVKBcai57oN5V}JHZQ3t#ZQ_2o0Ls<+{esd z_jveBnz-g}v?HZAR>=p>&fw;X!um_xN!LzD%vufvX$E}jF?*Cz>qUQ028wD_Rn9wo zQf~5|M#^tB+P&!}vFhw$w@mKxp^5?9iI0r*Ndepp*T7RRooEONn)IT%!4i>@kgf0^ z#~%s0dmLrPU^CZ~&8)cEFZMXM8@a;RC> zaO}L<+i!gzVERlsGtF0VMyMwU%sca$sl4gaq0t)SDBxk8d@gF(LX_-|$}v(BILt{SB57 zT_?h8d!t@&$HwSgC-kZP9ZY}u_H{3^rhXj%`=PzNPgdTuL_6j#WsjT1p~h2#q1kJ}n3E$P4z6K3@yq_%yF*IS+lm#Yu(eYZog8=a^>*eX2nZ3Im=7DAC) zxt^u&uPB2Tc~&T>K79x4sVgf?-&Ugd$d54po^>*+G|O{(CRg+E6PHE?dwV9du#FNKssiUuJKDQd z)eF}j#=2oD`kXa2j*N4@x1RN4jn}*!;^Y2c(sIOLio4OLXKRQo2e_E`jR2mk%ZOpD z%g7&XwbdVO|IKK5(?+t{d^6Q}*x|sMfD`Tw7wQ%@omBXZi!y#qB;$N6>ehdkPRW?6 zj)q8oh0D4x_nP<3pp*Hn+2GkrAU=o>l=xHCor;Q})k#`F92MpY>c*TY_YeQ0)UJsM z!*atbL9Yj3ED6t?(}jXM-E?1WU_n+u+m{g#?fwnq{|!5N!>7JJ9lotuSPGZ7mr=dt zU>mh#tkHQXVC21902B!|JJpXgR%LBb7wUNkJo!HO4nEI}-s)o5JjwsH^S2O1*XG=r z$Pf8lrFZk5ui+@%sXZW_fY6rAfC2S!T~B3%+@lJ!lg0*{@&X3f1xSHXc89>fKWN>9lk5RZ zp~b<}crTf^m6?0Alr(u?_Wo;O_*&+{ZO-BePwQU!i913GX-@r#j$(cNRg?pEkbp1} z0yz?t_Xukii&Gh*WGTX88}YY!8S6C4e2eC-`6|#t#(7+&bHE)rta&@-ccs~PhCQG~ zGz8>}W!;LWb^4a?MfnF0ThOSJ2?H%`%_ZYX1q&cANvoIt`RTiK%_g8aX0f17A>KBZ z^|S)-@*egMEowF^ZgtaBR6yX+^Q^3l6#aYFCXR=U!$_QmJ@Wn_@ndu78jVuKTlP>V zY}KTw3)L&RXk*>%0ZDPY>JmH{1JfN5NtLTFX;&&l01Dbdu}lI-Tl|YLi~d~3k^|W- zkEp_PjH4ocB)_^GCDtouzjPAh_e04K8g*xz|kTZ>hCS~*K|o47yP{zsh*7`x<_c+L(R%!Bg}-rn@6 zg|8sgq;RtIie3ayBEo+Lmz2>~bG?PY&Rgi?Rwi3Yg<~~x(ze0&l`g5#YE5|N?kD1V z^-&e5Pmq0SN z?nTlO)K7m^B}0XlqSVjuEfArK;u1*lx||cmlv(k0^+HlWV6DC!JofPw-t^7ZzUEg` z%8ebK(Md`Dr>)r!cPu180+>2eP4uJ^H~+b`tVN8K42Niid&fJ^gYyAzPj=LDPeEp? zaBZ6((2J|u3yTaD`KG!o^L{8Y>k@+H`b>&0Z$ljF zKgroS@M15j@+n&JXVw+UJ2XfgouQtN?yD9B=@PhMg!zw8^s_cX-5}B#Xt(u3CT#HN zHjB~-%{eUpbFt5zD{OATSDLN=0qWBhQbC()$B#{Vi+r)!Vg0a$<}OcB46K-7(QHSzgQnn9dm07K zxQNqmiGoxFAxlPW(qZ|YgWQ)BR~u29x?B@=29&g?B&5?yS`BjO!{gNeKT!O-O-RJW z-sRg6ghdFgXMzrDUEM~K!4zN!3;Vnk9xY@_4YG#_l^XznUmrQL6XgK3+Ww7BSm(u2 zlL%Lhym%FSX%SHt!xjPiL<`$OQT=b+`%}Ui?zM-s47XjZZg%0h<+^Q6zVMPb^SwP# z1Q}J$2vy^#&by?%b6pVa@EBN+2XTCWE>cl3=Gy1i?MW%P^O{K>dvn^ss|9}sZELSU zb2KmO34dPP&GKptV&9d89=-kQ++Z>ZW>tl}vWNNj_(d$vcI9}B1<+1pfeO51l?PR% zy;M+L<@vX-m&s5zLLfFuC2&i4ulH{(sOB3|(_9=jA>b3tARWm2w#bL!Be8LXK;DUZ zcm}+7WCXnFbDLhl1+M&z4v+%SZ=Esrd8(i)Wd}r32W0Dhwc8e;BhLs~&xg21hBB5y zgH6yd3X+1aFUDxZ@$_ecd6sFs@;4vQBdo}UJ&%4* ztA`2Jl8z-8Gq$wJ?O1}@@pf9aqzOjQUYS{Sr9%DCT~r$CD|U4?^>Oti`uhP1lOme8 z%b0bZ6gS*qLx2kD95*|W;Dc(TW?D>F5 zMxyIS1emA3D!sjEkh|+2Csjy+{&TwPv!)6Iiy3l>o+$AgMDM(iy21IlVsjLYe6B8; zuXA7ZtG@IiL))9xB=afUB?^LfO88UH)-l@bvG`)DrW&5Or(?Ex=2orFws_K=D0pyz zzadZ$JOLpIZVWG16()bsxVl7VJ`14)FXdPr{El<9jh~KELvzqqN-&rlvq?64i0&9Z znih)e{3FJ|NqV^vd(!I(`ZS3i%3tTgflihuKX6)W5( zecH)u2c2u3kG$a(;H0Ez(8cUgt(d8GOlO$Qgw5yQ!wv4|0shLhk9v!^lHTm-iiAqG ziC7$Yq9ff@yNbqRD*rrT)6Rhs#p*50%d29rsrt#v_Fn&O!nsdbk*yjoZSrfiJV8Z5 z5aI1cQ3+Fg+Wlged{s&62&W*|>h?k#VU_(3$_ypa2L^O+slME3kAol<-dTcgsEj!+rG9nT6GGo=|Q2a}Vc`K&z)S#q?% zi+lsqE7}C*L|yuMGU9&sCh!B@BmtRx+Mf(2C4S_&^r@TQV~#T27Fd=bC1jW;W^zE5 zaNAmS^S`QH)Rj7rOK2WpCSLW$yA+ot+@L(>Zlyiz9Y0;(}b&)&=5huDFma-g?*E#2tQrjkJY%j|9+(Jdj z^e@7V?A5ih3jAv=U558})mi`4@B01MC+N(M@s3jqM>o`fJJrwW^!3SUL`5BNMx@Zj zdyV=y!B9*&w_w=eU<~>(LM~6JD-ozeHj|PYHe-@YF<(2I@!01IfqCvHGNlj1YM->jW^&e`#0S#mUQ9p^emn(-~{8$in=L#(Y?UVSUnZEz|H z62PDW5Ae}bbhk(2?G1CEB4PaBd#Fd62jlP7 zG^#Qj$}K%T%<^W&*Wf*BCg<6(Xm1I81B?g5)Yj#Y~=|lh=^`^-0t9&^@_Ukgl?%!KRUTwJ?h?0T2Nso_c zm~+E?8=E?-aW6?~v+nUD+M zU0lvA)c=$u4M@X6bfQOwC?u<~40LvYbaTQ^%f{c6dEt~p8LSGs{z@!c?SB#y?uYjnWj>QuhEA`(RVK7xZ$~dD@~M4AVM5z$ zWAH)xZFWp605crHAS{u5&-)XbMK;M>ILZh{=g`F60&gjQ9q!rPYzuDGo?s$c!hzsz zF=elRf$*!)=qh36q0^6z-(;{|Vnnt$#puG(QjOfEGfe2=d(|7c$&QOyZx(?+XkV$1 zCM?(!G-*3w1-Kt_<=aZ_$ZaF6(>O?5obi~%iDta~KdvoX7c1nt6hz|?G*`{c@Tl`2 z82odEEvUfhO{2CjkPNz3u)1d4A;t+>VDRY|$Hb`RjLr5|QdJh!Hcli`=&{Ub+UN;I z6dgGUrR_aZV-`Qf(>p)&2o471J9t>@2t$%rY?l%mMSNb4s#OkMuPO|iE;?_5SC7gy z52mnCdCB*PCTrqfG~a&7JT5{j#C(55F_mz@Y2Ie*9q~_!zPW&!NTcY5m=vUFmxHHp zo&G;C5_T0FlWJit!_HmQ@v#bne@{I_D>-Y%p;cUtt${nfp5<2Q-UG_+V8?Z?9Ylq} zI+m__S>>!AN2kA@87jbqTkR{Yw!B}Q&DTMmcZ8SUWehVS*)btJ63=#PS+Xzjc zg9c0ES0dY2KPTeNlaHsa@(hQc&GU4yv~z)V+UDdy@OT;>I}4i2+gJ25&ZC`4FHAYy zo=;^_=E}#{?ex&r3rAHWdM=J!{bg?Qb>@b7Im=H(Rnt3FI5@`oPdZxfiaIRB3e;2^^S|zF6rSo9!NHXjRJbzA^bzvaBu>tx zq>JS0JNUjnOC}&*9qiwi>VvK4kFWr4Z|$!av+PKC&lpj)=;2Du-*zf=TK}2m)lTpn zfZ(OyEc{%pRo1c!d2bg7#(8or6+Ei@?u`>H);0{ba*5%j;~K&S(V;TGETpMkPDpWN zXlo+W%y*FVc6=l(IK*tAw(vQ{i&<=6UiADzv71d=gp2aX{o@vTnemM(wwMT(_^bpx zpJmw`0~mkB)B%`Ei-qa@e4vcHLvUTSj|cWBf9gpe2%^Sim&N zE^gmb<-Xo$`?rmjK|oC1nu6sW2h5-1YAedP%TB_otYzhn{__73^;Q9OG)=TcXxMp2=4Cg5Zry^?(XjHzHxVljdS?^d(XWu^Eh4I(>+zSYSn7F+O#v|p9evQ?D*i2;f-u=Dbr{bk@$_n{B;0Q4FBYAD7EQnQ zRx+dusyfn$qhpviU#}1Z1+5J&BO;bf0yHpk*@D2?P`9ho647s8BlvvaxjmF)UN zLr6t_5|)wm>BkkUZQ2_6B?7N~paWJm=XPya@A!@2QpB|G5b3C()=W>*pM6zEg098C zuM<3~Kf9zujJ-8+gnF03EUG4;(@5rT-VM*f>m>~;@>20mxSqkY*YxvHBt;{EWea`Kw z^!b{*6OEk8Yzn8j2@VAGi0{z-j*c#-IxD)jty3h4u(#ysI3aP(WqOxZ!(bb7Jqc`I zFs&4$e|nsAR=%>;h1o?;B2G3hl@c>lXSc^ZjaQrf(%&;00Hu^Al^8b}DZQOjXJ!#c z<7$gHSaP*H0|maOtLm*#35DK@k>hzHAOGd}^KlzI4lnHPJVcb9E`+N`1-jO@FHxR@Q-T$ zYAS5hFw(Ay0^+eM7Loy8rl6At^piYJTlZ>?c4K6Zah-3iDtg0}hSt7!q7(1egu@&a z`!>!Z5AG%BzHvnY8SbAQT-OF%68KaTDkYx3hoZX~)L1$nQywn`hEZbz-W$_v@`xg5 zUcK*0*0m0F>Y1sAHpfZ`&XfkUg8wLW{ZI|$y?v_}ZOu&30kJIi^4ixK;HR{9XdG#) zSw*^jYcKw=_*LNe#pG}WG@mzZZl?$w`y+u#9~h<*fF(Oe8S8PWCepNjxelRW(`Hk0 zQ*FcstD$znHyK$aAz)3YeFGmTzD%Ko!94x(#JW=Q^lRP_!0R}ymTiWW$BfqxRxO8= zjB{#p$G`6&Wl_6SxqzBb4t==uo-2Qudtg%uAGIj3$#!8}-#VuPXEb`;5?G7zbx{crMQ2I- zS}RMVi!{FP=vHCA4QPPRj}$82umXsF7a1io4J;N*6RV z^b|J?Me=k_kE1Sns{>|^oW;gSpg=6P10Brc7aNz<9Qz05nbAH%T~!kMj(ksCkIhzd z!p&=v-m(Gyo9ihXo$p>BRqhs)n8Kd<;s{`8M>F zgsv=JOnrhAX^-kt0%S6PRQ!)$T{X@}$G~+z$OYzzp2BI

BYktS?%1j`vE|@Ngn& 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

I@xrv>c%-PLe}DB!+F3x$4(AV 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 Jr~}TyK)T^VF`j+_@xs!aHYv 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νDWEP?^pY*iElufT#&M?cSqeG1L!K+aacy%NqWd|BUQc@+Ez?m?LI{s&xwub>WTaB{1no#@UM=^_ z#FFFI>FQU2?iGa6?*!(W&~HcSd!!p_QGqclby>k|jjKZ&wlVUFKufLcS7``g0^c!7 zNhIN-Xn9s9w3!Ddp||}LyOkVUC;tHKRaCaOKZn)w|) zGEBBNa5lDo$mE43u#yyY5Cat3b?OM z2NeomKX-zX+0K4c?r1b-yL2&h?Skwt(iW?1;Fm$%vaD2G(g3`LWY{jwFKcwbpZ@>| z?@QGu-2Op#tu1zPB7n9{SIMJLl#>#Z_XIhiZwhI(3taui{{XQ&Q5sL&8x`6#P1&`T z8*I=(z{@03i$vFh-{?K!T#ya2ZdRZ_sxmqsYFpr2Kz6i6*-n=og*iZ#iY-qXr+h;YxNR0rsQdc)SGRt;VN2&6(z<93Hb_tEPu5lZk*HCCfj+r zw#m*WM*QWI%oKcRu~9@K_v9CL(RX&AQhx26qz%)Cj`b-`XeVO%6lo1Vd4YII`?_*a z=0ftyf=yAfDn$E|LxTCIu2&dOBkuWu0VI#vpLqCC;~w7wHk$G_n9%ok7DwH)c}M+G zt4c|(LCO8zLa{U@$)E|h%Lo4e!!+91ll?+bv|Yi~Z3a;JqKOs9l6p_vHEqySa5D+> z^Gy?IlF)wJp=I*p+14@FIHk4j6S^UWIDGj}^*^Zp02-2#@HW$aPW5(5)EZZZeVOzf znOc)e$6OmEWG%H`Vx>q?KvIDP&5lW}I_-~YTRMDOt5vR7?ujVzOG&r}bzYVK0N-&x z+Em@Je(19DEB2E8(es>C(r8E{ROvmx`|c+H0RD2DzCS2$#6$ec_cll3wvzyV<8G7x z0N-&x+Eo2W{EODF{LA-3lyOr?tblc1l+T~vkw4l}^&#>vTEFuz-3k%K9Ud@FtG@x}5y`f2dRs*=D}|1Q^$L+~IsX8?OVp3a9pk?(e&}s# z9s~A%)h-7l#o?+~`^;UUFi-uLMK1V!{{YDeLml(A`=Q^%r0}bS5PhFc-1G&VzKZsH zyfC%@0BK$4G5VT!ZGOxpa;6JWYxhH;JY3QW>8tdP-~IU${iQdl51;u7>s9R~`=d7a zyQ9&LZC|7|IsX95kw4l~_rv82*021__eRC>lSiZf0P5W$fA#D?_LS;X{IA?--BbSn z68+Jwd}Y!Ed%CkokNtZS{iRrkr{&3h;h{QL_?PaDPH~S&B?U{>`bYl&enkHOX;*4> zf0=&hpRH2=022MsPfqLoF{v`9^=^%2gnVy3s39Q<9%nA+@)ZoM`Y7SOztF3b)aa>s z+x-m^c<-R?7ar>0t8|^oZ2WRvyu?d6@hn`>EAGFwfsk=)x64drrsIG1 z2IM}Wl!CQ_wWrUJV0nt6UrwXcQplFy@hN0=NTiesSKIPO8s|FQhf!TDmi;FoJn$ju zTf}FrQd=Wq&dY?X`SalVR+6$3gM~VbSNxe4-0uAHDJ}m1f)krk(ilGB&dN#8q!XKib6IYj8YOYsEEnG8jz2j_$dh2{{T5iMpT516aDmrdcL%TYG1`jMhOK zBkDpvq$BD=JXeR#kr^J2qK1fx<$ubP^P)r|6*=KUV9joLRH7qvANfKmM4y18ztq(I zguIzE{{WVn{{ZkmzM{MnMy);n0F)+wZk|KPI?q8!kgcDFq$4^)GDk{6GNdE_*;OHp AxBvhE literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_integral.png b/app/src/main/res/mipmap-xxhdpi/ic_integral.png new file mode 100644 index 0000000000000000000000000000000000000000..d67a63afdb71fa8f206f94827f466c1f28bb5235 GIT binary patch literal 2565 zcmV+g3i|blP)Px;zez+vRCr$PTX}30=N13Gne~CMVAEg&hHwNhn1nzQ3^Zx&5OI2Kh-Bm{Pc6SzB1@JC7Er(r&gd?rY5y$2X!KUU2Hekob-rafC zEHSM2oL%qQNbpIcu{`hm&G&upz3tJHX$8sGXTxi0Le|>#Wn+b*7?XX=kj=jM@?~8mlJCvTGU> zW&@lDU;==_(J-8WO9Y%D;Ghe9BtfLwEnBpgq9MCa0OrWuT{TBBDv=1^LkR)w`8pV;)lo~2$3J~T1 z{36_d1RQ^n%-Y|C(i0Sb5YE>V(*{R^@Q;cQ7hVgcC>GC4m+hV)xOf@Bs{y2W>mZ^J zET+Pr2Gbo70Ik-Rl#+^rAWZWT&<*f<0h$eF^TJ!Pa4cMzrRDZX#JoDd65S-3wLb|Y zGavwE`dw>@gx~jOq$bF&m67bW;W`xwy?>hlCMvd?3M&IFVc&n3mF=1)h{8bzl02T) zNM>z8B!=}TPnpq{PmF3$oecWSYA*B}x%|!mz0v+#X8xmxkYfpP&VtRGm)z)2XCl?5 zGgQ6`&|9AT0>oT@36p;S47Pm?%;^z8fW>0g8X`5QzxkB#sp)oI_0&sDOD&ed3ZISA zpK&^ajeAWYcU&!A+ux4#MW4=KQEm0)P^8o)417Ok-_2K6Uz zS=o-!Bx=6y^%4VYg#MR+e)nrk@|zw4x|yiJYAXD^KOKowm)>CikipA6`9;#?m`n>! zsagX5qX1oy%!U11@kM|@nZdS%fRFnW1r+80F||&BxU?_jX9PZ}W+^k+N(r!fGlZQ7 zC<20Hf}H@pDLZM)wrz_}tF|tNgk?ti^ML#^G5O2*BFh97dxO^k+)1F1Smp{zDmoBD z|NM&1&#%@D%kFpyvaADPu|Fav-e@%ytqNvapR2(;!b#a2KNcWV#d>+@bhcScTuekS z0T>^|xj##0?dzdlOh^C}0b!m8)PZq`Kvgag_0c#F5P<2-m`k8p?t_w`Bg*Fip1K~` z6CrQF-JyoD7=$GNQbSF%7(YJ`#!iU5L)uz&FkD@#mOvn(CCh9hL>CqlFc*MQDfSN- z%#9#Az(Cc_7I9}))xxfD9q*wJ2!KwvE0ahpwpa=`su8|m!JdTlbk`hr5k>Ap)2R0a zn6aN2`z1+xNR3TB`Ao1n#xDS+hROv3Xitw4$*hfNrVM0fX!-ITgS#A>)*c^3iW_e- z%|Gi6oL|Sv43%dH^mq?3Gp|s4%BuFw#F|cLu)hWHtM~NKFC=r}22}v)3^paMD99ep`j5@2W3K(Gc*FF$}S`kQM|02S~GW%NbL;12^U=lhwc@!sV~KucS?+e!D;mX6MD zRqCJ-U3E@}_&Z5bzdxx4fU8F*wkNsXZu~ZT)ql=RNA0<%aJeNb6u|xReEjgUm^SV> zewh2&?c{{pze=9b_*b=xRRPd;bW|>pYysm*Pr(WZwdbay?wiTD)#1~fR%=5ymr4$DS1r+JHno{Apz(-I%=#;ay2tX1+r9T0reMiP~SKa4UIYY=4wFF zh@9(T~Uq$94*WCA^gYVqK9iP@c z_x_fBhFm7BvzoLu0iuQPzrAaLcVBr8gW_+8tA9Z08?R+!z2%L&Hn7Vz(`sFO#M>zU zy+N<$XwghNw0XM+)S+;dziE z_lk;Pej=lA`)iIWAgo&OcPRJ!aeQ(58EmZb4gXPXj>c&mSoCZa<~&vHPHFFl(cF@S z1IG(cbK*z-%!y5NbXdk^yfC#IPmixf>LBIQ-~Jz0S~GE|ArJeH6}W2&@6j*KQDqjm zGqh0+m^k8e%$LXc=CSUKv%WD0r<#0@06Z}mnC7UmKa3l89#bBx!?28IWTdvbv%E+~ zTW2a-+XlN+>#r_OR$B^3_hV^K!y|2uD(3=2Qd^Lk)OM#7j=NV9_bP`ScgkX=1a4_h zhw?0(5wp+by^VNae=y+2UL*vr7Q=aqVbFdFz&0R1nek_2X}Nuh!2B#RW-u_F z2osp2`=coUUodbqPT-?kw-#Lt1FV3gAS beg^y>_1$KDb7Qb!00000NkvXXu0mjfXS}!s literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a3fd90dcb342a38c2e617f66a5a24e76cd60f9aa GIT binary patch literal 9898 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_logo.png b/app/src/main/res/mipmap-xxhdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cb203f4ae353fd0d20be89d3526a35721a04eace GIT binary patch literal 16927 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 UP!>qO!~g&Q07*qoM6N<$f(?*v_W%F@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/icon_back.png b/app/src/main/res/mipmap-xxhdpi/icon_back.png new file mode 100644 index 0000000000000000000000000000000000000000..0e26468bf91c11c5d59136e997d754a84c1d87ef GIT binary patch literal 648 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 Uu6MPnApigX07*qoM6N<$f;XggK>z>% literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/nav_icon_home.png b/app/src/main/res/mipmap-xxhdpi/nav_icon_home.png new file mode 100644 index 0000000000000000000000000000000000000000..89a68fa05bbcf590972e151dc3b3d7d3c8c04559 GIT binary patch literal 3828 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/nav_icon_project.png b/app/src/main/res/mipmap-xxhdpi/nav_icon_project.png new file mode 100644 index 0000000000000000000000000000000000000000..8c35db08760e1383fb20b0991001d07afba0c5a8 GIT binary patch literal 2260 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..402352f6f75f2a77f12638fb447e845db8409bcd GIT binary patch literal 21415 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/navigation/nav_login.xml b/app/src/main/res/navigation/nav_login.xml new file mode 100644 index 0000000..1d44570 --- /dev/null +++ b/app/src/main/res/navigation/nav_login.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..0298831 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,36 @@ + + + #E57815 + #BA7815 + #F4B02F + #F3F6FF + + #F3F3F7 + + #FFFFFF + #000000 + #E96D6B + #66DFAA + #D7DBDC + #00000000 + #36000000 + #55000000 + #99000000 + + #EED7AD + #272727 + #6D7E82 + #999999 + #55333333 + #E6E6E6 + #BEBEBE + #CDCDCD + #EEEEEE + #DFDFDF + + #D4D4D4 + #F5F5F5 + #2a000000 + #0F000000 + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..a1efa86 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,20 @@ + + + 18sp + 16sp + 15sp + 14sp + 12sp + 10sp + + 5dp + 4dp + + 5dp + + 45dp + + 40dp + 5dp + 15dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..59d46f7 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,11 @@ + + WanAndroid + 玩安卓 + + 首页 + 项目 + 发现 + 公众号 + 我的 + 请登录 + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..23f25c4 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..b5b765b --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,25 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..dca93c0 --- /dev/null +++ b/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/test/java/com/holo/wanandroid/ExampleUnitTest.kt b/app/src/test/java/com/holo/wanandroid/ExampleUnitTest.kt new file mode 100644 index 0000000..ebe9ed3 --- /dev/null +++ b/app/src/test/java/com/holo/wanandroid/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.holo.wanandroid + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..c5d9c82 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,38 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + google() + mavenCentral() + maven ("https://jitpack.io") + //阿里云jcenter仓库 + maven("https://maven.aliyun.com/repository/jcenter") + maven("https://maven.aliyun.com/repository/public") + maven("https://s01.oss.sonatype.org/content/groups/public") + } + dependencies { + classpath(ModulePlugin.android) + classpath(ModulePlugin.kotlin) + classpath(ModulePlugin.hilt) + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10") + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle.kts.kts files + } +} + +allprojects { + repositories { + google() + mavenCentral() + maven ("https://jitpack.io") + //阿里云jcenter仓库 + maven("https://maven.aliyun.com/repository/jcenter") + maven("https://maven.aliyun.com/repository/public") + maven("https://s01.oss.sonatype.org/content/groups/public") + } +} + +tasks.register("clean", Delete::class) { + delete(rootProject.buildDir) +} \ No newline at end of file diff --git a/buildSrc/.gitignore b/buildSrc/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/buildSrc/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..5bd96b5 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,9 @@ +//import org.gradle.kotlin.dsl.`kotlin-dsl` +plugins { + `kotlin-dsl` +} + +repositories { + google() + mavenCentral() +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/AndroidX.kt b/buildSrc/src/main/kotlin/AndroidX.kt new file mode 100644 index 0000000..95f2fc6 --- /dev/null +++ b/buildSrc/src/main/kotlin/AndroidX.kt @@ -0,0 +1,100 @@ +/** + * androidx 相关依赖库 + * + * @Author holo + * @Date 2022/2/14 + */ +object Coroutines { + const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2" + const val android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2" +} + +object Android { + /** + * appcompat中默认引入了很多库(比如activity库、fragment库、core库、annotation库、drawerlayout库、appcompat-resources) + * 如果想使用其中某个库的更新版本,可以单独引用,比如下面的vectordrawable + * 提示:对于声明式依赖,同一个库的不同版本,gradle会自动使用最新版本来进行依赖替换、编译 + */ + const val appcompat = "androidx.appcompat:appcompat:1.4.1" + + const val recyclerView = "androidx.recyclerview:recyclerview:1.2.1" + + // startup + const val startup = "androidx.startup:startup-runtime:1.1.0" + + // activity+ktx扩展函数 + const val activityKtx = "androidx.activity:activity-ktx:1.4.0" + + // fragment+ktx扩展函数 + const val fragmentKtx = "androidx.fragment:fragment-ktx:1.4.0" + + // core包+ktx扩展函数 + const val coreKtx = "androidx.core:core-ktx:1.7.0" + + // 约束布局 + const val constraintLayout = "androidx.constraintlayout:constraintlayout:2.1.2" + + // swipeRefreshLayout + const val swipeRefreshLayout = "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01" + + //material包 + const val material = "com.google.android.material:material:1.5.0-alpha01" + + const val webkit = "androidx.webkit:webkit:1.4.0" + + const val flexBox = "com.google.android.flexbox:flexbox:3.0.0" +} + +object ViewPager { + //viewpager + const val viewpager = "androidx.viewpager:viewpager:1.0.0" + + //viewpager2 + const val viewpager2 = "androidx.viewpager2:viewpager2:1.1.0-beta01" +} + +object Room { + private const val version = "2.4.0" + const val compiler = "androidx.room:room-compiler:${version}" + const val ktx = "androidx.room:room-ktx:${version}" + const val runtime = "androidx.room:room-runtime:${version}" +} + +object Hilt { + private const val version = "2.40.5" + const val hiltAndroid = "com.google.dagger:hilt-android:${version}" + const val daggerCompiler = "com.google.dagger:hilt-android-compiler:${version}" + + private const val xversion = "1.0.0-alpha03" + const val hiltCompiler = "androidx.hilt:hilt-compiler:${xversion}" + const val hiltViewModel = "androidx.hilt:hilt-lifecycle-viewmodel:${xversion}" +} + +object Lifecycle { + private const val version = "2.4.0" + const val viewModel = "androidx.lifecycle:lifecycle-viewmodel-ktx:${version}" + const val liveData = "androidx.lifecycle:lifecycle-livedata-ktx:${version}" + const val runtimeKtx = "androidx.lifecycle:lifecycle-runtime-ktx:${version}" +} + +object Navigation { + //这个版本支持多返回栈了 + private const val version = "2.4.1" + + const val fragmentKtx = "androidx.navigation:navigation-fragment-ktx:$version" + const val uiKtx = "androidx.navigation:navigation-ui-ktx:$version" +} + +object Testing { + const val jUnit = "junit:junit:4.13.2" + const val extJUnit = "androidx.test.ext:junit:1.1.3" + const val testRunner = "androidx.test:runner:1.4.0" + const val espresso = "androidx.test.espresso:espresso-core:3.4.0" + + const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.1" + const val room = "androidx.room:room-testing:2.2.6" + const val okHttp = "com.squareup.okhttp3:mockwebserver:4.9.0" + const val core = "androidx.arch.core:core-testing:2.1.0" + const val truth = "com.google.truth:truth:1.1.3" +} + diff --git a/buildSrc/src/main/kotlin/Depends.kt b/buildSrc/src/main/kotlin/Depends.kt new file mode 100644 index 0000000..0d1a8fa --- /dev/null +++ b/buildSrc/src/main/kotlin/Depends.kt @@ -0,0 +1,114 @@ +/** + * + * + * @Author holo + * @Date 2022/2/14 + */ + +object Moshi { + const val moshi = "com.squareup.moshi:moshi-kotlin:1.13.0" + const val codeGen = "com.squareup.moshi:moshi-kotlin-codegen:1.13.0" +} + +object Retrofit { + //网路请求库retrofit + private const val version = "2.9.0" + const val retrofit = "com.squareup.retrofit2:retrofit:${version}" + + //gson序列化转换 + const val convertGson = "com.squareup.retrofit2:converter-gson:${version}" + + //moshi序列化转换 + const val convertMoshi = "com.squareup.retrofit2:converter-moshi:${version}" + + //日志拦截打印 + const val loggingInterceptor = "com.squareup.okhttp3:logging-interceptor:4.9.3" +} + +object Depends { + //gson解析 + const val gson = "com.google.code.gson:gson:2.8.7" + + // Kotlin 协程方式的加载图片库 https://github.com/coil-kt/coil/ + const val coil = "io.coil-kt:coil:2.0.0-rc01" + + // 腾讯内存映射组件,替代SP https://github.com/Tencent/MMKV/blob/master/README_CN.md + const val mmkv = "com.tencent:mmkv:1.2.11" + + // android 4.4以上沉浸式实现 https://github.com/gyf-dev/ImmersionBar + const val immersionBar = "com.geyifeng.immersionbar:immersionbar:3.2.0" + const val immersionBarKtx = "com.geyifeng.immersionbar:immersionbar-ktx:3.2.0" + + // UnPeekLiveData-解决数据倒灌困扰 https://github.com/KunMinX/UnPeek-LiveData + const val unPeekLiveData = "com.kunminx.arch:unpeek-livedata:7.2.0-beta1" + + //lottie用来加载json动画 + // 你可以使用转换工具将mp4转换成json【https://isotropic.co/video-to-lottie/】 + // 去这里下载素材【https://lottiefiles.com/】 + const val lottie = "com.airbnb.android:lottie:4.2.2" + + const val shadowLayout = "com.github.lihangleo2:ShadowLayout:3.2.4" + + // Android WebView ,极度容易使用以及功能强大的库 https://github.com/Justson/AgentWeb + const val agentWeb = "com.github.Justson.AgentWeb:agentweb-core:v5.0.0-alpha.1-androidx" + + // BRVAH 强大而灵活的RecyclerView Adapter https://github.com/CymChad/BaseRecyclerViewAdapterHelper + const val BRVAH = "com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7" + + // 加载反馈页管理框架 https://github.com/KingJA/LoadSir + const val loadSir = "com.kingja.loadsir:loadsir:1.3.8" + + // FaceBook shimmer闪烁动画库 https://github.com/facebook/shimmer-android + const val shimmer = "com.facebook.shimmer:shimmer:0.5.0" + + // 指示器框架 https://github.com/hackware1993/MagicIndicator + const val magicIndicator = "com.github.hackware1993:MagicIndicator:1.7.0" + + // 基于ViewPager2的Banner控件 https://github.com/youth5201314/banner + const val banner = "io.github.youth5201314:banner:2.2.2" + + // 权限申请库 https://github.com/guolindev/PermissionX + const val permissionX = "com.guolindev.permissionx:permissionx:1.6.1" + + // 点赞View https://github.com/qkxyjren/LikeView + const val likeView = "com.jaren:likeview:1.2.2" + + // 缺省页管理 https://github.com/HoloXia/LoadState + const val loadState = "com.github.HoloXia:LoadState:1.0" + + // Cookie持久化 https://github.com/franmontiel/PersistentCookieJar + const val persistentCookieJar = "com.github.franmontiel:PersistentCookieJar:v1.0.1" +} + +object SmartRefreshLayout { + // 智能下拉刷新框架 https://github.com/scwang90/SmartRefreshLayout + const val core = "io.github.scwang90:refresh-layout-kernel:2.0.5" + const val headerMaterial = "io.github.scwang90:refresh-header-material:2.0.5" + const val footerClassics = "io.github.scwang90:refresh-footer-classics:2.0.5" +} + +object DKVideoPlayer { + // 视频播放器 https://github.com/Doikki/DKVideoPlayer + private const val version = "3.3.5" + const val core = "xyz.doikki.android.dkplayer:dkplayer-java:$version" + const val ui = "xyz.doikki.android.dkplayer:dkplayer-ui:$version" + const val exo = "xyz.doikki.android.dkplayer:player-exo:$version" + const val ijk = "xyz.doikki.android.dkplayer:player-ijk:$version" + const val cache = "xyz.doikki.android.dkplayer:videocache:$version" +} + +/** + * 插入即用的dialog + */ +object MaterialDialogs { + // 项目地址 https://github.com/afollestad/material-dialogs + + private const val version = "3.3.0" + const val core = "com.afollestad.material-dialogs:core:$version" + const val input = "com.afollestad.material-dialogs:input:$version" + const val color = "com.afollestad.material-dialogs:color:$version" + const val files = "com.afollestad.material-dialogs:files:$version" + const val datetime = "com.afollestad.material-dialogs:datetime:$version" + const val bottomSheets = "com.afollestad.material-dialogs:bottomsheets:$version" + const val lifecycle = "com.afollestad.material-dialogs:lifecycle:$version" +} diff --git a/buildSrc/src/main/kotlin/ModuleConfig.kt b/buildSrc/src/main/kotlin/ModuleConfig.kt new file mode 100644 index 0000000..e09de6a --- /dev/null +++ b/buildSrc/src/main/kotlin/ModuleConfig.kt @@ -0,0 +1,15 @@ +/** + * @Desc 编译配置信息 + * + * @Author holo + * @Date 2022/1/11 + */ +object ModuleConfig { + const val compileSdkVersion = 31 + const val buildToolsVersion = "30.0.3" + const val minSdkVersion = 23 + const val targetSdkVersion = 31 + + const val versionCode = 1 + const val versionName = "1.0" +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/ModulePlugin.kt b/buildSrc/src/main/kotlin/ModulePlugin.kt new file mode 100644 index 0000000..dca0eaa --- /dev/null +++ b/buildSrc/src/main/kotlin/ModulePlugin.kt @@ -0,0 +1,16 @@ +/** + * Gradle插件库 + * + * @Author holo + * @Date 2022/2/14 + */ +object ModulePlugin { + private const val gradle_version = "7.0.4" + const val android = "com.android.tools.build:gradle:$gradle_version" + + private const val kotlin_version = "1.6.10" + const val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + + private const val hilt_version = "2.40.5" + const val hilt = "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ad372da --- /dev/null +++ b/gradle.properties @@ -0,0 +1,25 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 zcma&O1CT9Y(k9%tZQHhO+qUh#ZQHhO+qmuS+qP|E@9xZO?0h@l{(r>DQ>P;GjjD{w zH}lENr;dU&FbEU?00aa80D$0M0RRB{U*7-#kbjS|qAG&4l5%47zyJ#WrfA#1$1Ctx zf&Z_d{GW=lf^w2#qRJ|CvSJUi(^E3iv~=^Z(zH}F)3Z%V3`@+rNB7gTVU{Bb~90p|f+0(v;nz01EG7yDMX9@S~__vVgv%rS$+?IH+oZ03D5zYrv|^ zC1J)SruYHmCki$jLBlTaE5&dFG9-kq3!^i>^UQL`%gn6)jz54$WDmeYdsBE9;PqZ_ zoGd=P4+|(-u4U1dbAVQrFWoNgNd;0nrghPFbQrJctO>nwDdI`Q^i0XJDUYm|T|RWc zZ3^Qgo_Qk$%Fvjj-G}1NB#ZJqIkh;kX%V{THPqOyiq)d)0+(r9o(qKlSp*hmK#iIY zA^)Vr$-Hz<#SF=0@tL@;dCQsm`V9s1vYNq}K1B)!XSK?=I1)tX+bUV52$YQu*0%fnWEukW>mxkz+%3-S!oguE8u#MGzST8_Dy^#U?fA@S#K$S@9msUiX!gd_ow>08w5)nX{-KxqMOo7d?k2&?Vf z&diGDtZr(0cwPe9z9FAUSD9KC)7(n^lMWuayCfxzy8EZsns%OEblHFSzP=cL6}?J| z0U$H!4S_TVjj<`6dy^2j`V`)mC;cB%* z8{>_%E1^FH!*{>4a7*C1v>~1*@TMcLK{7nEQ!_igZC}ikJ$*<$yHy>7)oy79A~#xE zWavoJOIOC$5b6*q*F_qN1>2#MY)AXVyr$6x4b=$x^*aqF*L?vmj>Mgv+|ITnw_BoW zO?jwHvNy^prH{9$rrik1#fhyU^MpFqF2fYEt(;4`Q&XWOGDH8k6M=%@fics4ajI;st# zCU^r1CK&|jzUhRMv;+W~6N;u<;#DI6cCw-otsc@IsN3MoSD^O`eNflIoR~l4*&-%RBYk@gb^|-JXs&~KuSEmMxB}xSb z@K76cXD=Y|=I&SNC2E+>Zg?R6E%DGCH5J1nU!A|@eX9oS(WPaMm==k2s_ueCqdZw| z&hqHp)47`c{BgwgvY2{xz%OIkY1xDwkw!<0veB#yF4ZKJyabhyyVS`gZepcFIk%e2 zTcrmt2@-8`7i-@5Nz>oQWFuMC_KlroCl(PLSodswHqJ3fn<;gxg9=}~3x_L3P`9Sn zChIf}8vCHvTriz~T2~FamRi?rh?>3bX1j}%bLH+uFX+p&+^aXbOK7clZxdU~6Uxgy z8R=obwO4dL%pmVo*Ktf=lH6hnlz_5k3cG;m8lgaPp~?eD!Yn2kf)tU6PF{kLyn|oI@eQ`F z3IF7~Blqg8-uwUuWZScRKn%c2_}dXB6Dx_&xR*n9M9LXasJhtZdr$vBY!rP{c@=)& z#!?L$2UrkvClwQO>U*fSMs67oSj2mxiJ$t;E|>q%Kh_GzzWWO&3;ufU%2z%ucBU8H z3WIwr$n)cfCXR&>tyB7BcSInK>=ByZA%;cVEJhcg<#6N{aZC4>K41XF>ZgjG`z_u& zGY?;Ad?-sgiOnI`oppF1o1Gurqbi*;#x2>+SSV6|1^G@ooVy@fg?wyf@0Y!UZ4!}nGuLeC^l)6pwkh|oRY`s1Pm$>zZ3u-83T|9 zGaKJIV3_x+u1>cRibsaJpJqhcm%?0-L;2 zitBrdRxNmb0OO2J%Y&Ym(6*`_P3&&5Bw157{o7LFguvxC$4&zTy#U=W*l&(Q2MNO} zfaUwYm{XtILD$3864IA_nn34oVa_g^FRuHL5wdUd)+W-p-iWCKe8m_cMHk+=? zeKX)M?Dt(|{r5t7IenkAXo%&EXIb-i^w+0CX0D=xApC=|Xy(`xy+QG^UyFe z+#J6h_&T5i#sV)hj3D4WN%z;2+jJcZxcI3*CHXGmOF3^)JD5j&wfX)e?-|V0GPuA+ zQFot%aEqGNJJHn$!_}#PaAvQ^{3-Ye7b}rWwrUmX53(|~i0v{}G_sI9uDch_brX&6 zWl5Ndj-AYg(W9CGfQf<6!YmY>Ey)+uYd_JNXH=>|`OH-CDCmcH(0%iD_aLlNHKH z7bcW-^5+QV$jK?R*)wZ>r9t}loM@XN&M-Pw=F#xn(;u3!(3SXXY^@=aoj70;_=QE9 zGghsG3ekq#N||u{4We_25U=y#T*S{4I{++Ku)> zQ!DZW;pVcn>b;&g2;YE#+V`v*Bl&Y-i@X6D*OpNA{G@JAXho&aOk(_j^weW{#3X5Y z%$q_wpb07EYPdmyH(1^09i$ca{O<}7) zRWncXdSPgBE%BM#by!E>tdnc$8RwUJg1*x($6$}ae$e9Knj8gvVZe#bLi!<+&BkFj zg@nOpDneyc+hU9P-;jmOSMN|*H#>^Ez#?;%C3hg_65leSUm;iz)UkW)jX#p)e&S&M z1|a?wDzV5NVnlhRBCd_;F87wp>6c<&nkgvC+!@KGiIqWY4l}=&1w7|r6{oBN8xyzh zG$b#2=RJp_iq6)#t5%yLkKx(0@D=C3w+oiXtSuaQ%I1WIb-eiE$d~!)b@|4XLy!CZ z9p=t=%3ad@Ep+<9003D2KZ5VyP~_n$=;~r&YUg5UZ0KVD&tR1DHy9x)qWtKJp#Kq# zP*8p#W(8JJ_*h_3W}FlvRam?<4Z+-H77^$Lvi+#vmhL9J zJ<1SV45xi;SrO2f=-OB(7#iNA5)x1uNC-yNxUw|!00vcW2PufRm>e~toH;M0Q85MQLWd?3O{i8H+5VkR@l9Dg-ma ze2fZ%>G(u5(k9EHj2L6!;(KZ8%8|*-1V|B#EagbF(rc+5iL_5;Eu)L4Z-V;0HfK4d z*{utLse_rvHZeQ>V5H=f78M3Ntg1BPxFCVD{HbNA6?9*^YIq;B-DJd{Ca2L#)qWP? zvX^NhFmX?CTWw&Ns}lgs;r3i+Bq@y}Ul+U%pzOS0Fcv9~aB(0!>GT0)NO?p=25LjN z2bh>6RhgqD7bQj#k-KOm@JLgMa6>%-ok1WpOe)FS^XOU{c?d5shG(lIn3GiVBxmg`u%-j=)^v&pX1JecJics3&jvPI)mDut52? z3jEA)DM%}BYbxxKrizVYwq?(P&19EXlwD9^-6J+4!}9{ywR9Gk42jjAURAF&EO|~N z)?s>$Da@ikI4|^z0e{r`J8zIs>SpM~Vn^{3fArRu;?+43>lD+^XtUcY1HidJwnR6+ z!;oG2=B6Z_=M%*{z-RaHc(n|1RTKQdNjjV!Pn9lFt^4w|AeN06*j}ZyhqZ^!-=cyGP_ShV1rGxkx8t zB;8`h!S{LD%ot``700d0@Grql(DTt4Awgmi+Yr0@#jbe=2#UkK%rv=OLqF)9D7D1j z!~McAwMYkeaL$~kI~90)5vBhBzWYc3Cj1WI0RS`z000R8-@ET0dA~*r(gSiCJmQMN&4%1D zyVNf0?}sBH8zNbBLn>~(W{d3%@kL_eQ6jEcR{l>C|JK z(R-fA!z|TTRG40|zv}7E@PqCAXP3n`;%|SCQ|ZS%ym$I{`}t3KPL&^l5`3>yah4*6 zifO#{VNz3)?ZL$be;NEaAk9b#{tV?V7 zP|wf5YA*1;s<)9A4~l3BHzG&HH`1xNr#%){4xZ!jq%o=7nN*wMuXlFV{HaiQLJ`5G zBhDi#D(m`Q1pLh@Tq+L;OwuC52RdW7b8}~60WCOK5iYMUad9}7aWBuILb({5=z~YF zt?*Jr5NG+WadM{mDL>GyiByCuR)hd zA=HM?J6l1Xv0Dl+LW@w$OTcEoOda^nFCw*Sy^I@$sSuneMl{4ys)|RY#9&NxW4S)9 zq|%83IpslTLoz~&vTo!Ga@?rj_kw{|k{nv+w&Ku?fyk4Ki4I?);M|5Axm)t+BaE)D zm(`AQ#k^DWrjbuXoJf2{Aj^KT zFb1zMSqxq|vceV+Mf-)$oPflsO$@*A0n0Z!R{&(xh8s}=;t(lIy zv$S8x>m;vQNHuRzoaOo?eiWFe{0;$s`Bc+Osz~}Van${u;g(su`3lJ^TEfo~nERfP z)?aFzpDgnLYiERsKPu|0tq4l2wT)Atr6Qb%m-AUn6HnCue*yWICp7TjW$@sO zm5rm4aTcPQ(rfi7a`xP7cKCFrJD}*&_~xgLyr^-bmsL}y;A5P|al8J3WUoBSjqu%v zxC;mK!g(7r6RRJ852Z~feoC&sD3(6}^5-uLK8o)9{8L_%%rItZK9C){UxB|;G>JbP zsRRtS4-3B*5c+K2kvmgZK8472%l>3cntWUOVHxB|{Ay~aOg5RN;{PJgeVD*H%ac+y!h#wi%o2bF2Ca8IyMyH{>4#{E_8u^@+l-+n=V}Sq?$O z{091@v%Bd*3pk0^2UtiF9Z+(a@wy6 zUdw8J*ze$K#=$48IBi1U%;hmhO>lu!uU;+RS}p&6@rQila7WftH->*A4=5W|Fmtze z)7E}jh@cbmr9iup^i%*(uF%LG&!+Fyl@LFA-}Ca#bxRfDJAiR2dt6644TaYw1Ma79 zt8&DYj31j^5WPNf5P&{)J?WlCe@<3u^78wnd(Ja4^a>{^Tw}W>|Cjt^If|7l^l)^Q zbz|7~CF(k_9~n|h;ysZ+jHzkXf(*O*@5m zLzUmbHp=x!Q|!9NVXyipZ3)^GuIG$k;D)EK!a5=8MFLI_lpf`HPKl=-Ww%z8H_0$j ztJ||IfFG1lE9nmQ0+jPQy zCBdKkjArH@K7jVcMNz);Q(Q^R{d5G?-kk;Uu_IXSyWB)~KGIizZL(^&qF;|1PI7!E zTP`%l)gpX|OFn&)M%txpQ2F!hdA~hX1Cm5)IrdljqzRg!f{mN%G~H1&oqe`5eJCIF zHdD7O;AX-{XEV(a`gBFJ9ews#CVS2y!&>Cm_dm3C8*n3MA*e67(WC?uP@8TXuMroq z{#w$%z@CBIkRM7?}Xib+>hRjy?%G!fiw8! z8(gB+8J~KOU}yO7UGm&1g_MDJ$IXS!`+*b*QW2x)9>K~Y*E&bYMnjl6h!{17_8d!%&9D`a7r&LKZjC<&XOvTRaKJ1 zUY@hl5^R&kZl3lU3njk`3dPzxj$2foOL26r(9zsVF3n_F#v)s5vv3@dgs|lP#eylq62{<-vczqP!RpVBTgI>@O6&sU>W|do17+#OzQ7o5A$ICH z?GqwqnK^n2%LR;$^oZM;)+>$X3s2n}2jZ7CdWIW0lnGK-b#EG01)P@aU`pg}th&J-TrU`tIpb5t((0eu|!u zQz+3ZiOQ^?RxxK4;zs=l8q!-n7X{@jSwK(iqNFiRColuEOg}!7cyZi`iBX4g1pNBj zAPzL?P^Ljhn;1$r8?bc=#n|Ed7wB&oHcw()&*k#SS#h}jO?ZB246EGItsz*;^&tzp zu^YJ0=lwsi`eP_pU8}6JA7MS;9pfD;DsSsLo~ogzMNP70@@;Fm8f0^;>$Z>~}GWRw!W5J3tNX*^2+1f3hz{~rIzJo z6W%J(H!g-eI_J1>0juX$X4Cl6i+3wbc~k146UIX&G22}WE>0ga#WLsn9tY(&29zBvH1$`iWtTe zG2jYl@P!P)eb<5DsR72BdI7-zP&cZNI{7q3e@?N8IKc4DE#UVr->|-ryuJXk^u^>4 z$3wE~=q390;XuOQP~TNoDR?#|NSPJ%sTMInA6*rJ%go|=YjGe!B>z6u$IhgQSwoV* zjy3F2#I>uK{42{&IqP59)Y(1*Z>>#W8rCf4_eVsH)`v!P#^;BgzKDR`ARGEZzkNX+ zJUQu=*-ol=Xqqt5=`=pA@BIn@6a9G8C{c&`i^(i+BxQO9?YZ3iu%$$da&Kb?2kCCo zo7t$UpSFWqmydXf@l3bVJ=%K?SSw)|?srhJ-1ZdFu*5QhL$~-IQS!K1s@XzAtv6*Y zl8@(5BlWYLt1yAWy?rMD&bwze8bC3-GfNH=p zynNFCdxyX?K&G(ZZ)afguQ2|r;XoV^=^(;Cku#qYn4Lus`UeKt6rAlFo_rU`|Rq z&G?~iWMBio<78of-2X(ZYHx~=U0Vz4btyXkctMKdc9UM!vYr~B-(>)(Hc|D zMzkN4!PBg%tZoh+=Gba!0++d193gbMk2&krfDgcbx0jI92cq?FFESVg0D$>F+bil} zY~$)|>1HZsX=5sAZ2WgPB5P=8X#TI+NQ(M~GqyVB53c6IdX=k>Wu@A0Svf5#?uHaF zsYn|koIi3$(%GZ2+G+7Fv^lHTb#5b8sAHSTnL^qWZLM<(1|9|QFw9pnRU{svj}_Al zL)b9>fN{QiA($8peNEJyy`(a{&uh-T4_kdZFIVsKKVM(?05}76EEz?#W za^fiZOAd14IJ4zLX-n7Lq0qlQ^lW8Cvz4UKkV9~P}>sq0?xD3vg+$4vLm~C(+ zM{-3Z#qnZ09bJ>}j?6ry^h+@PfaD7*jZxBEY4)UG&daWb??6)TP+|3#Z&?GL?1i+280CFsE|vIXQbm| zM}Pk!U`U5NsNbyKzkrul-DzwB{X?n3E6?TUHr{M&+R*2%yOiXdW-_2Yd6?38M9Vy^ z*lE%gA{wwoSR~vN0=no}tP2Ul5Gk5M(Xq`$nw#ndFk`tcpd5A=Idue`XZ!FS>Q zG^0w#>P4pPG+*NC9gLP4x2m=cKP}YuS!l^?sHSFftZy{4CoQrb_ z^20(NnG`wAhMI=eq)SsIE~&Gp9Ne0nD4%Xiu|0Fj1UFk?6avDqjdXz{O1nKao*46y zT8~iA%Exu=G#{x=KD;_C&M+Zx4+n`sHT>^>=-1YM;H<72k>$py1?F3#T1*ef9mLZw z5naLQr?n7K;2l+{_uIw*_1nsTn~I|kkCgrn;|G~##hM;9l7Jy$yJfmk+&}W@JeKcF zx@@Woiz8qdi|D%aH3XTx5*wDlbs?dC1_nrFpm^QbG@wM=i2?Zg;$VK!c^Dp8<}BTI zyRhAq@#%2pGV49*Y5_mV4+OICP|%I(dQ7x=6Ob}>EjnB_-_18*xrY?b%-yEDT(wrO z9RY2QT0`_OpGfMObKHV;QLVnrK%mc?$WAdIT`kJQT^n%GuzE7|9@k3ci5fYOh(287 zuIbg!GB3xLg$YN=n)^pHGB0jH+_iIiC=nUcD;G6LuJsjn2VI1cyZx=a?ShCsF==QK z;q~*m&}L<-cb+mDDXzvvrRsybcgQ;Vg21P(uLv5I+eGc7o7tc6`;OA9{soHFOz zT~2?>Ts}gprIX$wRBb4yE>ot<8+*Bv`qbSDv*VtRi|cyWS>)Fjs>fkNOH-+PX&4(~ z&)T8Zam2L6puQl?;5zg9h<}k4#|yH9czHw;1jw-pwBM*O2hUR6yvHATrI%^mvs9q_ z&ccT0>f#eDG<^WG^q@oVqlJrhxH)dcq2cty@l3~|5#UDdExyXUmLQ}f4#;6fI{f^t zDCsgIJ~0`af%YR%Ma5VQq-p21k`vaBu6WE?66+5=XUd%Ay%D$irN>5LhluRWt7 zov-=f>QbMk*G##&DTQyou$s7UqjjW@k6=!I@!k+S{pP8R(2=e@io;N8E`EOB;OGoI zw6Q+{X1_I{OO0HPpBz!X!@`5YQ2)t{+!?M_iH25X(d~-Zx~cXnS9z>u?+If|iNJbx zyFU2d1!ITX64D|lE0Z{dLRqL1Ajj=CCMfC4lD3&mYR_R_VZ>_7_~|<^o*%_&jevU+ zQ4|qzci=0}Jydw|LXLCrOl1_P6Xf@c0$ieK2^7@A9UbF{@V_0p%lqW|L?5k>bVM8|p5v&2g;~r>B8uo<4N+`B zH{J)h;SYiIVx@#jI&p-v3dwL5QNV1oxPr8J%ooezTnLW>i*3Isb49%5i!&ac_dEXv zvXmVUck^QHmyrF8>CGXijC_R-y(Qr{3Zt~EmW)-nC!tiH`wlw5D*W7Pip;T?&j%kX z6DkZX4&}iw>hE(boLyjOoupf6JpvBG8}jIh!!VhnD0>}KSMMo{1#uU6kiFcA04~|7 zVO8eI&x1`g4CZ<2cYUI(n#wz2MtVFHx47yE5eL~8bot~>EHbevSt}LLMQX?odD{Ux zJMnam{d)W4da{l7&y-JrgiU~qY3$~}_F#G7|MxT)e;G{U`In&?`j<5D->}cb{}{T(4DF0BOk-=1195KB-E*o@c?`>y#4=dMtYtSY=&L{!TAjFVcq0y@AH`vH! z$41+u!Ld&}F^COPgL(EE{0X7LY&%D7-(?!kjFF7=qw<;`V{nwWBq<)1QiGJgUc^Vz ztMUlq1bZqKn17|6x6iAHbWc~l1HcmAxr%$Puv!znW)!JiukwIrqQ00|H$Z)OmGG@= zv%A8*4cq}(?qn4rN6o`$Y))(MyXr8R<2S^J+v(wmFmtac!%VOfN?&(8Nr!T@kV`N; z*Q33V3t`^rN&aBiHet)18wy{*wi1=W!B%B-Q6}SCrUl$~Hl{@!95ydml@FK8P=u4s z4e*7gV2s=YxEvskw2Ju!2%{8h01rx-3`NCPc(O zH&J0VH5etNB2KY6k4R@2Wvl^Ck$MoR3=)|SEclT2ccJ!RI9Nuter7u9@;sWf-%um;GfI!=eEIQ2l2p_YWUd{|6EG ze{yO6;lMc>;2tPrsNdi@&1K6(1;|$xe8vLgiouj%QD%gYk`4p{Ktv9|j+!OF-P?@p z;}SV|oIK)iwlBs+`ROXkhd&NK zzo__r!B>tOXpBJMDcv!Mq54P+n4(@dijL^EpO1wdg~q+!DT3lB<>9AANSe!T1XgC=J^)IP0XEZ()_vpu!!3HQyJhwh?r`Ae%Yr~b% zO*NY9t9#qWa@GCPYOF9aron7thfWT`eujS4`t2uG6)~JRTI;f(ZuoRQwjZjp5Pg34 z)rp$)Kr?R+KdJ;IO;pM{$6|2y=k_siqvp%)2||cHTe|b5Ht8&A{wazGNca zX$Ol?H)E_R@SDi~4{d-|8nGFhZPW;Cts1;08TwUvLLv&_2$O6Vt=M)X;g%HUr$&06 zISZb(6)Q3%?;3r~*3~USIg=HcJhFtHhIV(siOwV&QkQe#J%H9&E21!C*d@ln3E@J* zVqRO^<)V^ky-R|%{(9`l-(JXq9J)1r$`uQ8a}$vr9E^nNiI*thK8=&UZ0dsFN_eSl z(q~lnD?EymWLsNa3|1{CRPW60>DSkY9YQ;$4o3W7Ms&@&lv9eH!tk~N&dhqX&>K@} zi1g~GqglxkZ5pEFkllJ)Ta1I^c&Bt6#r(QLQ02yHTaJB~- zCcE=5tmi`UA>@P=1LBfBiqk)HB4t8D?02;9eXj~kVPwv?m{5&!&TFYhu>3=_ zsGmYZ^mo*-j69-42y&Jj0cBLLEulNRZ9vXE)8~mt9C#;tZs;=#M=1*hebkS;7(aGf zcs7zH(I8Eui9UU4L--))yy`&d&$In&VA2?DAEss4LAPCLd>-$i?lpXvn!gu^JJ$(DoUlc6wE98VLZ*z`QGQov5l4Fm_h?V-;mHLYDVOwKz7>e4+%AzeO>P6v}ndPW| zM>m#6Tnp7K?0mbK=>gV}=@k*0Mr_PVAgGMu$j+pWxzq4MAa&jpCDU&-5eH27Iz>m^ zax1?*HhG%pJ((tkR(V(O(L%7v7L%!_X->IjS3H5kuXQT2!ow(;%FDE>16&3r){!ex zhf==oJ!}YU89C9@mfDq!P3S4yx$aGB?rbtVH?sHpg?J5C->!_FHM%Hl3#D4eplxzQ zRA+<@LD%LKSkTk2NyWCg7u=$%F#;SIL44~S_OGR}JqX}X+=bc@swpiClB`Zbz|f!4 z7Ysah7OkR8liXfI`}IIwtEoL}(URrGe;IM8%{>b1SsqXh)~w}P>yiFRaE>}rEnNkT z!HXZUtxUp1NmFm)Dm@-{FI^aRQqpSkz}ZSyKR%Y}YHNzBk)ZIp} zMtS=aMvkgWKm9&oTcU0?S|L~CDqA+sHpOxwnswF-fEG)cXCzUR?ps@tZa$=O)=L+5 zf%m58cq8g_o}3?Bhh+c!w4(7AjxwQ3>WnVi<{{38g7yFboo>q|+7qs<$8CPXUFAN< zG&}BHbbyQ5n|qqSr?U~GY{@GJ{(Jny{bMaOG{|IkUj7tj^9pa9|FB_<+KHLxSxR;@ zHpS$4V)PP+tx}22fWx(Ku9y+}Ap;VZqD0AZW4gCDTPCG=zgJmF{|x;(rvdM|2|9a}cex6xrMkERnkE;}jvU-kmzd%_J50$M`lIPCKf+^*zL=@LW`1SaEc%=m zQ+lT06Gw+wVwvQ9fZ~#qd430v2HndFsBa9WjD0P}K(rZYdAt^5WQIvb%D^Q|pkVE^ zte$&#~zmULFACGfS#g=2OLOnIf2Of-k!(BIHjs77nr!5Q1*I9 z1%?=~#Oss!rV~?-6Gm~BWJiA4mJ5TY&iPm_$)H1_rTltuU1F3I(qTQ^U$S>%$l z)Wx1}R?ij0idp@8w-p!Oz{&*W;v*IA;JFHA9%nUvVDy7Q8woheC#|8QuDZb-L_5@R zOqHwrh|mVL9b=+$nJxM`3eE{O$sCt$UK^2@L$R(r^-_+z?lOo+me-VW=Zw z-Bn>$4ovfWd%SPY`ab-u9{INc*k2h+yH%toDHIyqQ zO68=u`N}RIIs7lsn1D){)~%>ByF<>i@qFb<-axvu(Z+6t7v<^z&gm9McRB~BIaDn$ z#xSGT!rzgad8o>~kyj#h1?7g96tOcCJniQ+*#=b7wPio>|6a1Z?_(TS{)KrPe}(8j z!#&A=k(&Pj^F;r)CI=Z{LVu>uj!_W1q4b`N1}E(i%;BWjbEcnD=mv$FL$l?zS6bW!{$7j1GR5ocn94P2u{ z70tAAcpqtQo<@cXw~@i-@6B23;317|l~S>CB?hR5qJ%J3EFgyBdJd^fHZu7AzHF(BQ!tyAz^L0`X z23S4Fe{2X$W0$zu9gm%rg~A>ijaE#GlYlrF9$ds^QtaszE#4M(OLVP2O-;XdT(XIC zatwzF*)1c+t~c{L=fMG8Z=k5lv>U0;C{caN1NItnuSMp)6G3mbahu>E#sj&oy94KC zpH}8oEw{G@N3pvHhp{^-YaZeH;K+T_1AUv;IKD<=mv^&Ueegrb!yf`4VlRl$M?wsl zZyFol(2|_QM`e_2lYSABpKR{{NlxlDSYQNkS;J66aT#MSiTx~;tUmvs-b*CrR4w=f z8+0;*th6kfZ3|5!Icx3RV11sp=?`0Jy3Fs0N4GZQMN=8HmT6%x9@{Dza)k}UwL6JT zHRDh;%!XwXr6yuuy`4;Xsn0zlR$k%r%9abS1;_v?`HX_hI|+EibVnlyE@3aL5vhQq zlIG?tN^w@0(v9M*&L+{_+RQZw=o|&BRPGB>e5=ys7H`nc8nx)|-g;s7mRc7hg{GJC zAe^vCIJhajmm7C6g! zL&!WAQ~5d_5)00?w_*|*H>3$loHrvFbitw#WvLB!JASO?#5Ig5$Ys10n>e4|3d;tS zELJ0|R4n3Az(Fl3-r^QiV_C;)lQ1_CW{5bKS15U|E9?ZgLec@%kXr84>5jV2a5v=w z?pB1GPdxD$IQL4)G||B_lI+A=08MUFFR4MxfGOu07vfIm+j=z9tp~5i_6jb`tR>qV z$#`=BQ*jpCjm$F0+F)L%xRlnS%#&gro6PiRfu^l!EVan|r3y}AHJQOORGx4~ z&<)3=K-tx518DZyp%|!EqpU!+X3Et7n2AaC5(AtrkW>_57i}$eqs$rupubg0a1+WO zGHZKLN2L0D;ab%{_S1Plm|hx8R?O14*w*f&2&bB050n!R2by zw!@XOQx$SqZ5I<(Qu$V6g>o#A!JVwErWv#(Pjx=KeS0@hxr4?13zj#oWwPS(7Ro|v z>Mp@Kmxo79q|}!5qtX2-O@U&&@6s~!I&)1WQIl?lTnh6UdKT_1R640S4~f=_xoN3- zI+O)$R@RjV$F=>Ti7BlnG1-cFKCC(t|Qjm{SalS~V-tX#+2ekRhwmN zZr`8{QF6y~Z!D|{=1*2D-JUa<(1Z=;!Ei!KiRNH?o{p5o3crFF=_pX9O-YyJchr$~ zRC`+G+8kx~fD2k*ZIiiIGR<8r&M@3H?%JVOfE>)})7ScOd&?OjgAGT@WVNSCZ8N(p zuQG~76GE3%(%h1*vUXg$vH{ua0b`sQ4f0*y=u~lgyb^!#CcPJa2mkSEHGLsnO^kb$ zru5_l#nu=Y{rSMWiYx?nO{8I!gH+?wEj~UM?IrG}E|bRIBUM>UlY<`T1EHpRr36vv zBi&dG8oxS|J$!zoaq{+JpJy+O^W(nt*|#g32bd&K^w-t>!Vu9N!k9eA8r!Xc{utY> zg9aZ(D2E0gL#W0MdjwES-7~Wa8iubPrd?8-$C4BP?*wok&O8+ykOx{P=Izx+G~hM8 z*9?BYz!T8~dzcZr#ux8kS7u7r@A#DogBH8km8Ry4slyie^n|GrTbO|cLhpqgMdsjX zJ_LdmM#I&4LqqsOUIXK8gW;V0B(7^$y#h3h>J0k^WJfAMeYek%Y-Dcb_+0zPJez!GM zAmJ1u;*rK=FNM0Nf}Y!!P9c4)HIkMnq^b;JFd!S3?_Qi2G#LIQ)TF|iHl~WKK6JmK zbv7rPE6VkYr_%_BT}CK8h=?%pk@3cz(UrZ{@h40%XgThP*-Oeo`T0eq9 zA8BnWZKzCy5e&&_GEsU4*;_k}(8l_&al5K-V*BFM=O~;MgRkYsOs%9eOY6s6AtE*<7GQAR2ulC3RAJrG_P1iQK5Z~&B z&f8X<>yJV6)oDGIlS$Y*D^Rj(cszTy5c81a5IwBr`BtnC6_e`ArI8CaTX_%rx7;cn zR-0?J_LFg*?(#n~G8cXut(1nVF0Oka$A$1FGcERU<^ggx;p@CZc?3UB41RY+wLS`LWFNSs~YP zuw1@DNN3lTd|jDL7gjBsd9}wIw}4xT2+8dBQzI00m<@?c2L%>}QLfK5%r!a-iII`p zX@`VEUH)uj^$;7jVUYdADQ2k*!1O3WdfgF?OMtUXNpQ1}QINamBTKDuv19^{$`8A1 zeq%q*O0mi@(%sZU>Xdb0Ru96CFqk9-L3pzLVsMQ`Xpa~N6CR{9Rm2)A|CI21L(%GW zh&)Y$BNHa=FD+=mBw3{qTgw)j0b!Eahs!rZnpu)z!!E$*eXE~##yaXz`KE5(nQM`s zD!$vW9XH)iMxu9R>r$VlLk9oIR%HxpUiW=BK@4U)|1WNQ=mz9a z^!KkO=>GaJ!GBXm{KJj^;kh-MkUlEQ%lza`-G&}C5y1>La1sR6hT=d*NeCnuK%_LV zOXt$}iP6(YJKc9j-Fxq~*ItVUqljQ8?oaysB-EYtFQp9oxZ|5m0^Hq(qV!S+hq#g( z?|i*H2MIr^Kxgz+3vIljQ*Feejy6S4v~jKEPTF~Qhq!(ms5>NGtRgO5vfPPc4Z^AM zTj!`5xEreIN)vaNxa|q6qWdg>+T`Ol0Uz)ckXBXEGvPNEL3R8hB3=C5`@=SYgAju1 z!)UBr{2~=~xa{b8>x2@C7weRAEuatC)3pkRhT#pMPTpSbA|tan%U7NGMvzmF?c!V8 z=pEWxbdXbTAGtWTyI?Fml%lEr-^AE}w#l(<7OIw;ctw}imYax&vR4UYNJZK6P7ZOd zP87XfhnUHxCUHhM@b*NbTi#(-8|wcv%3BGNs#zRCVV(W?1Qj6^PPQa<{yaBwZ`+<`w|;rqUY_C z&AeyKwwf*q#OW-F()lir=T^<^wjK65Lif$puuU5+tk$;e_EJ;Lu+pH>=-8=PDhkBg z8cWt%@$Sc#C6F$Vd+0507;{OOyT7Hs%nKS88q-W!$f~9*WGBpHGgNp}=C*7!RiZ5s zn1L_DbKF@B8kwhDiLKRB@lsXVVLK|ph=w%_`#owlf@s@V(pa`GY$8h%;-#h@TsO|Y8V=n@*!Rog7<7Cid%apR|x zOjhHCyfbIt%+*PCveTEcuiDi%Wx;O;+K=W?OFUV%)%~6;gl?<0%)?snDDqIvkHF{ zyI02)+lI9ov42^hL>ZRrh*HhjF9B$A@=H94iaBESBF=eC_KT$8A@uB^6$~o?3Wm5t1OIaqF^~><2?4e3c&)@wKn9bD? zoeCs;H>b8DL^F&>Xw-xjZEUFFTv>JD^O#1E#)CMBaG4DX9bD(Wtc8Rzq}9soQ8`jf zeSnHOL}<+WVSKp4kkq&?SbETjq6yr@4%SAqOG=9E(3YeLG9dtV+8vmzq+6PFPk{L; z(&d++iu=^F%b+ea$i2UeTC{R*0Isk;vFK!no<;L+(`y`3&H-~VTdKROkdyowo1iqR zbVW(3`+(PQ2>TKY>N!jGmGo7oeoB8O|P_!Ic@ zZ^;3dnuXo;WJ?S+)%P>{Hcg!Jz#2SI(s&dY4QAy_vRlmOh)QHvs_7c&zkJCmJGVvV zX;Mtb>QE+xp`KyciG$Cn*0?AK%-a|=o!+7x&&yzHQOS>8=B*R=niSnta^Pxp1`=md z#;$pS$4WCT?mbiCYU?FcHGZ#)kHVJTTBt^%XE(Q};aaO=Zik0UgLcc0I(tUpt(>|& zcxB_|fxCF7>&~5eJ=Dpn&5Aj{A^cV^^}(7w#p;HG&Q)EaN~~EqrE1qKrMAc&WXIE;>@<&)5;gD2?={Xf@Mvn@OJKw=8Mgn z!JUFMwD+s==JpjhroT&d{$kQAy%+d`a*XxDEVxy3`NHzmITrE`o!;5ClXNPb4t*8P zzAivdr{j_v!=9!^?T3y?gzmqDWX6mkzhIzJ-3S{T5bcCFMr&RPDryMcdwbBuZbsgN zGrp@^i?rcfN7v0NKGzDPGE#4yszxu=I_`MI%Z|10nFjU-UjQXXA?k8Pk|OE<(?ae) zE%vG#eZAlj*E7_3dx#Zz4kMLj>H^;}33UAankJiDy5ZvEhrjr`!9eMD8COp}U*hP+ zF}KIYx@pkccIgyxFm#LNw~G&`;o&5)2`5aogs`1~7cMZQ7zj!%L4E`2yzlQN6REX20&O<9 zKV6fyr)TScJPPzNTC2gL+0x#=u>(({{D7j)c-%tvqls3#Y?Z1m zV5WUE)zdJ{$p>yX;^P!UcXP?UD~YM;IRa#Rs5~l+*$&nO(;Ers`G=0D!twR(0GF@c zHl9E5DQI}Oz74n zfKP>&$q0($T4y$6w(p=ERAFh+>n%iaeRA%!T%<^+pg?M)@ucY<&59$x9M#n+V&>}=nO9wCV{O~lg&v#+jcUj(tQ z`0u1YH)-`U$15a{pBkGyPL0THv1P|4e@pf@3IBZS4dVJPo#H>pWq%Lr0YS-SeWash z8R7=jb28KPMI|_lo#GEO|5B?N_e``H*23{~a!AmUJ+fb4HX-%QI@lSEUxKlGV7z7Q zSKw@-TR>@1RL%w{x}dW#k1NgW+q4yt2Xf1J62Bx*O^WG8OJ|FqI4&@d3_o8Id@*)4 zYrk=>@!wv~mh7YWv*bZhxqSmFh2Xq)o=m;%n$I?GSz49l1$xRpPu_^N(vZ>*>Z<04 z2+rP70oM=NDysd!@fQdM2OcyT?3T^Eb@lIC-UG=Bw{BjQ&P`KCv$AcJ;?`vdZ4){d z&gkoUK{$!$$K`3*O-jyM1~p-7T*qb)Ys>Myt^;#1&a%O@x8A+E>! zY8=eD`ZG)LVagDLBeHg>=atOG?Kr%h4B%E6m@J^C+U|y)XX@f z8oyJDW|9g=<#f<{JRr{y#~euMnv)`7j=%cHWLc}ngjq~7k**6%4u>Px&W%4D94(r* z+akunK}O0DC2A%Xo9jyF;DobX?!1I(7%}@7F>i%&nk*LMO)bMGg2N+1iqtg+r(70q zF5{Msgsm5GS7DT`kBsjMvOrkx&|EU!{{~gL4d2MWrAT=KBQ-^zQCUq{5PD1orxlIL zq;CvlWx#f1NWvh`hg011I%?T_s!e38l*lWVt|~z-PO4~~1g)SrJ|>*tXh=QfXT)%( z+ex+inPvD&O4Ur;JGz>$sUOnWdpSLcm1X%aQDw4{dB!cnj`^muI$CJ2%p&-kULVCE z>$eMR36kN$wCPR+OFDM3-U(VOrp9k3)lI&YVFqd;Kpz~K)@Fa&FRw}L(SoD z9B4a+hQzZT-BnVltst&=kq6Y(f^S4hIGNKYBgMxGJ^;2yrO}P3;r)(-I-CZ)26Y6? z&rzHI_1GCvGkgy-t1E;r^3Le30|%$ebDRu2+gdLG)r=A~Qz`}~&L@aGJ{}vVs_GE* zVUjFnzHiXfKQbpv&bR&}l2bzIjAooB)=-XNcYmrGmBh(&iu@o!^hn0^#}m2yZZUK8 zufVm7Gq0y`Mj;9b>`c?&PZkU0j4>IL=UL&-Lp3j&47B5pAW4JceG{!XCA)kT<%2nqCxj<)uy6XR_uws~>_MEKPOpAQ!H zkn>FKh)<9DwwS*|Y(q?$^N!6(51O0 z^JM~Ax{AI1Oj$fs-S5d4T7Z_i1?{%0SsIuQ&r8#(JA=2iLcTN+?>wOL532%&dMYkT z*T5xepC+V6zxhS@vNbMoi|i)=rpli@R9~P!39tWbSSb904ekv7D#quKbgFEMTb48P zuq(VJ+&L8aWU(_FCD$3^uD!YM%O^K(dvy~Wm2hUuh6bD|#(I39Xt>N1Y{ZqXL`Fg6 zKQ?T2htHN!(Bx;tV2bfTtIj7e)liN-29s1kew>v(D^@)#v;}C4-G=7x#;-dM4yRWm zyY`cS21ulzMK{PoaQ6xChEZ}o_#}X-o}<&0)$1#3we?+QeLt;aVCjeA)hn!}UaKt< zat1fHEx13y-rXNMvpUUmCVzocPmN~-Y4(YJvQ#db)4|%B!rBsgAe+*yor~}FrNH08 z3V!97S}D7d$zbSD{$z;@IYMxM6aHdypIuS*pr_U6;#Y!_?0i|&yU*@16l z*dcMqDQgfNBf}?quiu4e>H)yTVfsp#f+Du0@=Kc41QockXkCkvu>FBd6Q+@FL!(Yx z2`YuX#eMEiLEDhp+9uFqME_E^faV&~9qjBHJkIp~%$x^bN=N)K@kvSVEMdDuzA0sn z88CBG?`RX1@#hQNd`o^V{37)!w|nA)QfiYBE^m=yQKv-fQF+UCMcuEe1d4BH7$?>b zJl-r9@0^Ie=)guO1vOd=i$_4sz>y3x^R7n4ED!5oXL3@5**h(xr%Hv)_gILarO46q+MaDOF%ChaymKoI6JU5Pg;7#2n9-18|S1;AK+ zgsn6;k6-%!QD>D?cFy}8F;r@z8H9xN1jsOBw2vQONVqBVEbkiNUqgw~*!^##ht>w0 zUOykwH=$LwX2j&nLy=@{hr)2O&-wm-NyjW7n~Zs9UlH;P7iP3 zI}S(r0YFVYacnKH(+{*)Tbw)@;6>%=&Th=+Z6NHo_tR|JCI8TJiXv2N7ei7M^Q+RM z?9o`meH$5Yi;@9XaNR#jIK^&{N|DYNNbtdb)XW1Lv2k{E>;?F`#Pq|&_;gm~&~Zc9 zf+6ZE%{x4|{YdtE?a^gKyzr}dA>OxQv+pq|@IXL%WS0CiX!V zm$fCePA%lU{%pTKD7|5NJHeXg=I0jL@$tOF@K*MI$)f?om)D63K*M|r`gb9edD1~Y zc|w7N)Y%do7=0{RC|AziW7#am$)9jciRJ?IWl9PE{G3U+$%FcyKs_0Cgq`=K3@ttV z9g;M!3z~f_?P%y3-ph%vBMeS@p7P&Ea8M@97+%XEj*(1E6vHj==d zjsoviB>j^$_^OI_DEPvFkVo(BGRo%cJeD){6Uckei=~1}>sp299|IRjhXe)%?uP0I zF5+>?0#Ye}T^Y$u_rc4=lPcq4K^D(TZG-w30-YiEM=dcK+4#o*>lJ8&JLi+3UcpZk z!^?95S^C0ja^jwP`|{<+3cBVog$(mRdQmadS+Vh~z zS@|P}=|z3P6uS+&@QsMp0no9Od&27O&14zHXGAOEy zh~OKpymK5C%;LLb467@KgIiVwYbYd6wFxI{0-~MOGfTq$nBTB!{SrWmL9Hs}C&l&l#m?s*{tA?BHS4mVKHAVMqm63H<|c5n0~k)-kbg zXidai&9ZUy0~WFYYKT;oe~rytRk?)r8bptITsWj(@HLI;@=v5|XUnSls7$uaxFRL+ zRVMGuL3w}NbV1`^=Pw*0?>bm8+xfeY(1PikW*PB>>Tq(FR`91N0c2&>lL2sZo5=VD zQY{>7dh_TX98L2)n{2OV=T10~*YzX27i2Q7W86M4$?gZIXZaBq#sA*{PH8){|GUi;oM>e?ua7eF4WFuFYZSG| zze?srg|5Ti8Og{O zeFxuw9!U+zhyk?@w zjsA6(oKD=Ka;A>Ca)oPORxK+kxH#O@zhC!!XS4@=swnuMk>t+JmLmFiE^1aX3f<)D@`%K0FGK^gg1a1j>zi z2KhV>sjU7AX3F$SEqrXSC}fRx64GDoc%!u2Yag68Lw@w9v;xOONf@o)Lc|Uh3<21ctTYu-mFZuHk*+R{GjXHIGq3p)tFtQp%TYqD=j1&y)>@zxoxUJ!G@ zgI0XKmP6MNzw>nRxK$-Gbzs}dyfFzt>#5;f6oR27ql!%+{tr+(`(>%51|k`ML} zY4eE)Lxq|JMas(;JibNQds1bUB&r}ydMQXBY4x(^&fY_&LlQC)3hylc$~8&~|06-D z#T+%66rYbHX%^KuqJED_wuGB+=h`nWA!>1n0)3wZrBG3%`b^Ozv6__dNa@%V14|!D zQ?o$z5u0^8`giv%qE!BzZ!3j;BlDlJDk)h@9{nSQeEk!z9RGW) z${RSF3phEM*ce*>Xdp}585vj$|40=&S{S-GTiE?Op*vY&Lvr9}BO$XWy80IF+6@%n z5*2ueT_g@ofP#u5pxb7n*fv^Xtt7&?SRc{*2Ka-*!BuOpf}neHGCiHy$@Ka1^Dint z;DkmIL$-e)rj4o2WQV%Gy;Xg(_Bh#qeOsTM2f@KEe~4kJ8kNLQ+;(!j^bgJMcNhvklP5Z6I+9Fq@c&D~8Fb-4rmDT!MB5QC{Dsb;BharP*O;SF4& zc$wj-7Oep7#$WZN!1nznc@Vb<_Dn%ga-O#J(l=OGB`dy=Sy&$(5-n3zzu%d7E#^8`T@}V+5B;PP8J14#4cCPw-SQTdGa2gWL0*zKM z#DfSXs_iWOMt)0*+Y>Lkd=LlyoHjublNLefhKBv@JoC>P7N1_#> zv=mLWe96%EY;!ZGSQDbZWb#;tzqAGgx~uk+-$+2_8U`!ypbwXl z^2E-FkM1?lY@yt8=J3%QK+xaZ6ok=-y%=KXCD^0r!5vUneW>95PzCkOPO*t}p$;-> ze5j-BLT_;)cZQzR2CEsm@rU7GZfFtdp*a|g4wDr%8?2QkIGasRfDWT-Dvy*U{?IHT z*}wGnzdlSptl#ZF^sf)KT|BJs&kLG91^A6ls{CzFprZ6-Y!V0Xysh%9p%iMd7HLsS zN+^Un$tDV)T@i!v?3o0Fsx2qI(AX_$dDkBzQ@fRM%n zRXk6hb9Py#JXUs+7)w@eo;g%QQ95Yq!K_d=z{0dGS+pToEI6=Bo8+{k$7&Z zo4>PH(`ce8E-Ps&uv`NQ;U$%t;w~|@E3WVOCi~R4oj5wP?%<*1C%}Jq%a^q~T7u>K zML5AKfQDv6>PuT`{SrKHRAF+^&edg6+5R_#H?Lz3iGoWo#PCEd0DS;)2U({{X#zU^ zw_xv{4x7|t!S)>44J;KfA|DC?;uQ($l+5Vp7oeqf7{GBF9356nx|&B~gs+@N^gSdd zvb*>&W)|u#F{Z_b`f#GVtQ`pYv3#||N{xj1NgB<#=Odt6{eB%#9RLt5v zIi|0u70`#ai}9fJjKv7dE!9ZrOIX!3{$z_K5FBd-Kp-&e4(J$LD-)NMTp^_pB`RT; zftVVlK2g@+1Ahv2$D){@Y#cL#dUj9*&%#6 zd2m9{1NYp>)6=oAvqdCn5#cx{AJ%S8skUgMglu2*IAtd+z1>B&`MuEAS(D(<6X#Lj z?f4CFx$)M&$=7*>9v1ER4b6!SIz-m0e{o0BfkySREchp?WdVPpQCh!q$t>?rL!&Jg zd#heM;&~A}VEm8Dvy&P|J*eAV&w!&Nx6HFV&B8jJFVTmgLaswn!cx$&%JbTsloz!3 zMEz1d`k==`Ueub_JAy_&`!ogbwx27^ZXgFNAbx=g_I~5nO^r)}&myw~+yY*cJl4$I znNJ32M&K=0(2Dj_>@39`3=FX!v3nZHno_@q^!y}%(yw0PqOo=);6Y@&ylVe>nMOZ~ zd>j#QQSBn3oaWd;qy$&5(5H$Ayi)0haAYO6TH>FR?rhqHmNOO+(})NB zLI@B@v0)eq!ug`>G<@htRlp3n!EpU|n+G+AvXFrWSUsLMBfL*ZB`CRsIVHNTR&b?K zxBgsN0BjfB>UVcJ|x%=-zb%OV7lmZc& zxiupadZVF7)6QuhoY;;FK2b*qL0J-Rn-8!X4ZY$-ZSUXV5DFd7`T41c(#lAeLMoeT z4%g655v@7AqT!i@)Edt5JMbN(=Q-6{=L4iG8RA%}w;&pKmtWvI4?G9pVRp|RTw`g0 zD5c12B&A2&P6Ng~8WM2eIW=wxd?r7A*N+&!Be7PX3s|7~z=APxm=A?5 zt>xB4WG|*Td@VX{Rs)PV0|yK`oI3^xn(4c_j&vgxk_Y3o(-`_5o`V zRTghg6%l@(qodXN;dB#+OKJEEvhfcnc#BeO2|E(5df-!fKDZ!%9!^BJ_4)9P+9Dq5 zK1=(v?KmIp34r?z{NEWnLB3Px{XYwy-akun4F7xTRr2^zeYW{gcK9)>aJDdU5;w5@ zak=<+-PLH-|04pelTb%ULpuuuJC7DgyT@D|p{!V!0v3KpDnRjANN12q6SUR3mb9<- z>2r~IApQGhstZ!3*?5V z8#)hJ0TdZg0M-BK#nGFP>$i=qk82DO z7h;Ft!D5E15OgW)&%lej*?^1~2=*Z5$2VX>V{x8SC+{i10BbtUk9@I#Vi&hX)q

Q!LwySI{Bnv%Sm)yh{^sSVJ8&h_D-BJ_YZe5eCaAWU9b$O2c z$T|{vWVRtOL!xC0DTc(Qbe`ItNtt5hr<)VijD0{U;T#bUEp381_y`%ZIav?kuYG{iyYdEBPW=*xNSc;Rlt6~F4M`5G+VtOjc z*0qGzCb@gME5udTjJA-9O<&TWd~}ysBd(eVT1-H82-doyH9RST)|+Pb{o*;$j9Tjs zhU!IlsPsj8=(x3bAKJTopW3^6AKROHR^7wZ185wJGVhA~hEc|LP;k7NEz-@4p5o}F z`AD6naG3(n=NF9HTH81=F+Q|JOz$7wm9I<+#BSmB@o_cLt2GkW9|?7mM;r!JZp89l zbo!Hp8=n!XH1{GwaDU+k)pGp`C|cXkCU5%vcH)+v@0eK>%7gWxmuMu9YLlChA|_D@ zi#5zovN_!a-0?~pUV-Rj*1P)KwdU-LguR>YM&*Nen+ln8Q$?WFCJg%DY%K}2!!1FE zDv-A%Cbwo^p(lzac&_TZ-l#9kq`mhLcY3h9ZTUVCM(Ad&=EriQY5{jJv<5K&g|*Lk zgV%ILnf1%8V2B0E&;Sp4sYbYOvvMebLwYwzkRQ#F8GpTQq#uv=J`uaSJ34OWITeSGo6+-8Xw znCk*n{kdDEi)Hi&u^)~cs@iyCkFWB2SWZU|Uc%^43ZIZQ-vWNExCCtDWjqHs;;tWf$v{}0{p0Rvxkq``)*>+Akq%|Na zA`@~-Vfe|+(AIlqru+7Ceh4nsVmO9p9jc8}HX^W&ViBDXT+uXbT#R#idPn&L>+#b6 zflC-4C5-X;kUnR~L>PSLh*gvL68}RBsu#2l`s_9KjUWRhiqF`j)`y`2`YU(>3bdBj z?>iyjEhe-~$^I5!nn%B6Wh+I`FvLNvauve~eX<+Ipl&04 zT}};W&1a3%W?dJ2=N#0t?e+aK+%t}5q%jSLvp3jZ%?&F}nOOWr>+{GFIa%wO_2`et z=JzoRR~}iKuuR+azPI8;Gf9)z3kyA4EIOSl!sRR$DlW}0>&?GbgPojmjmnln;cTqCt=ADbE zZ8GAnoM+S1(5$i8^O4t`ue;vO4i}z0wz-QEIVe5_u03;}-!G1NyY8;h^}y;tzY}i5 zqQr#Ur3Fy8sSa$Q0ys+f`!`+>9WbvU_I`Sj;$4{S>O3?#inLHCrtLy~!s#WXV=oVP zeE93*Nc`PBi4q@%Ao$x4lw9vLHM!6mn3-b_cebF|n-2vt-zYVF_&sDE--J-P;2WHo z+@n2areE0o$LjvjlV2X7ZU@j+`{*8zq`JR3gKF#EW|#+{nMyo-a>nFFTg&vhyT=b} zDa8+v0(Dgx0yRL@ZXOYIlVSZ0|MFizy0VPW8;AfA5|pe!#j zX}Py^8fl5SyS4g1WSKKtnyP+_PoOwMMwu`(i@Z)diJp~U54*-miOchy7Z35eL>^M z4p<-aIxH4VUZgS783@H%M7P9hX>t{|RU7$n4T(brCG#h9e9p! z+o`i;EGGq3&pF;~5V~eBD}lC)>if$w%Vf}AFxGqO88|ApfHf&Bvu+xdG)@vuF}Yvk z)o;~k-%+0K0g+L`Wala!$=ZV|z$e%>f0%XoLib%)!R^RoS+{!#X?h-6uu zF&&KxORdZU&EwQFITIRLo(7TA3W}y6X{?Y%y2j0It!ekU#<)$qghZtpcS>L3uh`Uj z7GY;6f$9qKynP#oS3$$a{p^{D+0oJQ71`1?OAn_m8)UGZmj3l*ZI)`V-a>MKGGFG< z&^jg#Ok%(hhm>hSrZ5;Qga4u(?^i>GiW_j9%_7M>j(^|Om$#{k+^*ULnEgzW_1gCICtAD^WpC`A z{9&DXkG#01Xo)U$OC(L5Y$DQ|Q4C6CjUKk1UkPj$nXH##J{c8e#K|&{mA*;b$r0E4 zUNo0jthwA(c&N1l=PEe8Rw_8cEl|-eya9z&H3#n`B$t#+aJ03RFMzrV@gowbe8v(c zIFM60^0&lCFO10NU4w@|61xiZ4CVXeaKjd;d?sv52XM*lS8XiVjgWpRB;&U_C0g+`6B5V&w|O6B*_q zsATxL!M}+$He)1eOWECce#eS@2n^xhlB4<_Nn?yCVEQWDs(r`|@2GqLe<#(|&P0U? z$7V5IgpWf09uIf_RazRwC?qEqRaHyL?iiS05UiGesJy%^>-C{{ypTBI&B0-iUYhk> zIk<5xpsuV@g|z(AZD+C-;A!fTG=df1=<%nxy(a(IS+U{ME4ZbDEBtcD_3V=icT6*_ z)>|J?>&6%nvHhZERBtjK+s4xnut*@>GAmA5m*OTp$!^CHTr}vM4n(X1Q*;{e-Rd2BCF-u@1ZGm z!S8hJ6L=Gl4T_SDa7Xx|-{4mxveJg=ctf`BJ*fy!yF6Dz&?w(Q_6B}WQVtNI!BVBC zKfX<>7vd6C96}XAQmF-Jd?1Q4eTfRB3q7hCh0f!(JkdWT5<{iAE#dKy*Jxq&3a1@~ z8C||Dn2mFNyrUV|<-)C^_y7@8c2Fz+2jrae9deBDu;U}tJ{^xAdxCD248(k;dCJ%o z`y3sADe>U%suxwwv~8A1+R$VB=Q?%U?4joI$um;aH+eCrBqpn- z%79D_7rb;R-;-9RTrwi9dPlg8&@tfWhhZ(Vx&1PQ+6(huX`;M9x~LrW~~#3{j0Bh2kDU$}@!fFQej4VGkJv?M4rU^x!RU zEwhu$!CA_iDjFjrJa`aocySDX16?~;+wgav;}Zut6Mg%C4>}8FL?8)Kgwc(Qlj{@#2Pt0?G`$h7P#M+qoXtlV@d}%c&OzO+QYKK`kyXaK{U(O^2DyIXCZlNQjt0^8~8JzNGrIxhj}}M z&~QZlbx%t;MJ(Vux;2tgNKGlAqphLq%pd}JG9uoVHUo?|hN{pLQ6Em%r*+7t^<);X zm~6=qChlNAVXNN*Sow->*4;}T;l;D1I-5T{Bif@4_}=>l`tK;qqDdt5zvisCKhMAH z#r}`)7VW?LZqfdmXQ%zo5bJ00{Xb9^YKrk0Nf|oIW*K@(=`o2Vndz}ZDyk{!u}PVx zzd--+_WC*U{~DH3{?GI64IB+@On&@9X>EUAo&L+G{L^dozaI4C3G#2wr~hseW@K&g zKWs{uHu-9Je!3;4pE>eBltKUXb^*hG8I&413)$J&{D4N%7PcloU6bn%jPxJyQL?g* z9g+YFFEDiE`8rW^laCNzQmi7CTnPfwyg3VDHRAl>h=In6jeaVOP@!-CP60j3+#vpL zEYmh_oP0{-gTe7Or`L6x)6w?77QVi~jD8lWN@3RHcm80iV%M1A!+Y6iHM)05iC64tb$X2lV_%Txk@0l^hZqi^%Z?#- zE;LE0uFx)R08_S-#(wC=dS&}vj6P4>5ZWjhthP=*Hht&TdLtKDR;rXEX4*z0h74FA zMCINqrh3Vq;s%3MC1YL`{WjIAPkVL#3rj^9Pj9Ss7>7duy!9H0vYF%>1jh)EPqvlr6h%R%CxDsk| z!BACz7E%j?bm=pH6Eaw{+suniuY7C9Ut~1cWfOX9KW9=H><&kQlinPV3h9R>3nJvK z4L9(DRM=x;R&d#a@oFY7mB|m8h4692U5eYfcw|QKwqRsshN(q^v$4$)HgPpAJDJ`I zkqjq(8Cd!K!+wCd=d@w%~e$=gdUgD&wj$LQ1r>-E=O@c ze+Z$x{>6(JA-fNVr)X;*)40Eym1TtUZI1Pwwx1hUi+G1Jlk~vCYeXMNYtr)1?qwyg zsX_e*$h?380O00ou?0R@7-Fc59o$UvyVs4cUbujHUA>sH!}L54>`e` zHUx#Q+Hn&Og#YVOuo*niy*GU3rH;%f``nk#NN5-xrZ34NeH$l`4@t);4(+0|Z#I>Y z)~Kzs#exIAaf--65L0UHT_SvV8O2WYeD>Mq^Y6L!Xu8%vnpofG@w!}R7M28?i1*T&zp3X4^OMCY6(Dg<-! zXmcGQrRgHXGYre7GfTJ)rhl|rs%abKT_Nt24_Q``XH{88NVPW+`x4ZdrMuO0iZ0g` z%p}y};~T5gbb9SeL8BSc`SO#ixC$@QhXxZ=B}L`tP}&k?1oSPS=4%{UOHe0<_XWln zwbl5cn(j-qK`)vGHY5B5C|QZd5)W7c@{bNVXqJ!!n$^ufc?N9C-BF2QK1(kv++h!>$QbAjq)_b$$PcJdV+F7hz0Hu@ zqj+}m0qn{t^tD3DfBb~0B36|Q`bs*xs|$i^G4uNUEBl4g;op-;Wl~iThgga?+dL7s zUP(8lMO?g{GcYpDS{NM!UA8Hco?#}eNEioRBHy4`mq!Pd-9@-97|k$hpEX>xoX+dY zDr$wfm^P&}Wu{!%?)U_(%Mn79$(ywvu*kJ9r4u|MyYLI_67U7%6Gd_vb##Nerf@>& z8W11z$$~xEZt$dPG}+*IZky+os5Ju2eRi;1=rUEeIn>t-AzC_IGM-IXWK3^6QNU+2pe=MBn4I*R@A%-iLDCOHTE-O^wo$sL_h{dcPl=^muAQb`_BRm};=cy{qSkui;`WSsj9%c^+bIDQ z0`_?KX0<-=o!t{u(Ln)v>%VGL z0pC=GB7*AQ?N7N{ut*a%MH-tdtNmNC+Yf$|KS)BW(gQJ*z$d{+{j?(e&hgTy^2|AR9vx1Xre2fagGv0YXWqtNkg*v%40v?BJBt|f9wX5 z{QTlCM}b-0{mV?IG>TW_BdviUKhtosrBqdfq&Frdz>cF~yK{P@(w{Vr7z2qKFwLhc zQuogKO@~YwyS9%+d-zD7mJG~@?EFJLSn!a&mhE5$_4xBl&6QHMzL?CdzEnC~C3$X@ zvY!{_GR06ep5;<#cKCSJ%srxX=+pn?ywDwtJ2{TV;0DKBO2t++B(tIO4)Wh`rD13P z4fE$#%zkd=UzOB74gi=-*CuID&Z3zI^-`4U^S?dHxK8fP*;fE|a(KYMgMUo`THIS1f!*6dOI2 zFjC3O=-AL`6=9pp;`CYPTdVX z8(*?V&%QoipuH0>WKlL8A*zTKckD!paN@~hh zmXzm~qZhMGVdQGd=AG8&20HW0RGV8X{$9LldFZYm zE?}`Q3i?xJRz43S?VFMmqRyvWaS#(~Lempg9nTM$EFDP(Gzx#$r)W&lpFKqcAoJh-AxEw$-bjW>`_+gEi z2w`99#UbFZGiQjS8kj~@PGqpsPX`T{YOj`CaEqTFag;$jY z8_{Wzz>HXx&G*Dx<5skhpETxIdhKH?DtY@b9l8$l?UkM#J-Snmts7bd7xayKTFJ(u zyAT&@6cAYcs{PBfpqZa%sxhJ5nSZBPji?Zlf&}#L?t)vC4X5VLp%~fz2Sx<*oN<7` z?ge=k<=X7r<~F7Tvp9#HB{!mA!QWBOf%EiSJ6KIF8QZNjg&x~-%e*tflL(ji_S^sO ztmib1rp09uon}RcsFi#k)oLs@$?vs(i>5k3YN%$T(5Or(TZ5JW9mA6mIMD08=749$ z!d+l*iu{Il7^Yu}H;lgw=En1sJpCKPSqTCHy4(f&NPelr31^*l%KHq^QE>z>Ks_bH zjbD?({~8Din7IvZeJ>8Ey=e;I?thpzD=zE5UHeO|neioJwG;IyLk?xOz(yO&0DTU~ z^#)xcs|s>Flgmp;SmYJ4g(|HMu3v7#;c*Aa8iF#UZo7CvDq4>8#qLJ|YdZ!AsH%^_7N1IQjCro

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..78a613f --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Apr 15 12:05:42 CST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..5ad9a85 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,3 @@ +rootProject.name = "WanAndroid" +include(":app") +include(":BaseMvvm")