├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ ├── WanAndroid-release.apk │ └── output.json ├── src │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── cxz │ │ │ └── wanandroid │ │ │ └── ExampleInstrumentedTest.kt │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ ├── jianshu │ │ │ │ ├── common.css │ │ │ │ └── jianshu.css │ │ │ └── litepal.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── cxz │ │ │ │ └── wanandroid │ │ │ │ ├── adapter │ │ │ │ ├── CollectAdapter.kt │ │ │ │ ├── HomeAdapter.kt │ │ │ │ ├── KnowledgeAdapter.kt │ │ │ │ ├── KnowledgePagerAdapter.kt │ │ │ │ ├── KnowledgeTreeAdapter.kt │ │ │ │ ├── NavigationAdapter.kt │ │ │ │ ├── NavigationTabAdapter.kt │ │ │ │ ├── ProjectAdapter.kt │ │ │ │ ├── ProjectPagerAdapter.kt │ │ │ │ ├── RankAdapter.kt │ │ │ │ ├── ScoreAdapter.kt │ │ │ │ ├── SearchHistoryAdapter.kt │ │ │ │ ├── ShareAdapter.kt │ │ │ │ ├── TodoAdapter.kt │ │ │ │ ├── TodoPagerAdapter.kt │ │ │ │ ├── TodoPopupAdapter.kt │ │ │ │ └── WeChatPagerAdapter.kt │ │ │ │ ├── api │ │ │ │ └── ApiService.kt │ │ │ │ ├── app │ │ │ │ └── App.kt │ │ │ │ ├── base │ │ │ │ ├── BaseActivity.kt │ │ │ │ ├── BaseFragment.kt │ │ │ │ ├── BaseFragmentAdapter.kt │ │ │ │ ├── BaseModel.kt │ │ │ │ ├── BaseMvpActivity.kt │ │ │ │ ├── BaseMvpFragment.kt │ │ │ │ ├── BaseMvpListFragment.kt │ │ │ │ ├── BaseMvpSwipeBackActivity.kt │ │ │ │ ├── BasePresenter.kt │ │ │ │ ├── BaseSwipeBackActivity.kt │ │ │ │ ├── IModel.kt │ │ │ │ ├── IPresenter.kt │ │ │ │ └── IView.kt │ │ │ │ ├── common │ │ │ │ ├── CommonUtil.kt │ │ │ │ └── adapter │ │ │ │ │ ├── CommonAdapter.kt │ │ │ │ │ ├── MultipleType.kt │ │ │ │ │ ├── OnItemClickListener.kt │ │ │ │ │ ├── OnItemLongClickListener.kt │ │ │ │ │ └── ViewHolder.kt │ │ │ │ ├── constant │ │ │ │ ├── Constant.kt │ │ │ │ └── HttpConstant.kt │ │ │ │ ├── event │ │ │ │ ├── ColorEvent.kt │ │ │ │ ├── LoginEvent.kt │ │ │ │ ├── NetworkChangeEvent.kt │ │ │ │ ├── RefreshHomeEvent.kt │ │ │ │ ├── RefreshShareEvent.kt │ │ │ │ ├── RefreshTodoEvent.kt │ │ │ │ └── TodoEvent.kt │ │ │ │ ├── ext │ │ │ │ ├── BaseQuickAdapterExt.kt │ │ │ │ ├── Ext.kt │ │ │ │ └── RxExt.kt │ │ │ │ ├── http │ │ │ │ ├── RetrofitHelper.kt │ │ │ │ ├── cookies │ │ │ │ │ ├── CookieManager.kt │ │ │ │ │ ├── OkHttpCookies.kt │ │ │ │ │ └── PersistentCookieStore.kt │ │ │ │ ├── exception │ │ │ │ │ ├── ApiException.kt │ │ │ │ │ ├── ErrorStatus.kt │ │ │ │ │ └── ExceptionHandle.kt │ │ │ │ ├── function │ │ │ │ │ └── RetryWithDelay.kt │ │ │ │ └── interceptor │ │ │ │ │ ├── CacheInterceptor.kt │ │ │ │ │ ├── HeaderInterceptor.kt │ │ │ │ │ ├── NetCacheInterceptor.kt │ │ │ │ │ ├── OfflineCacheInterceptor.kt │ │ │ │ │ ├── QueryParameterInterceptor.kt │ │ │ │ │ └── SaveCookieInterceptor.kt │ │ │ │ ├── mvp │ │ │ │ ├── contract │ │ │ │ │ ├── AddTodoContract.kt │ │ │ │ │ ├── CollectContract.kt │ │ │ │ │ ├── CommonContract.kt │ │ │ │ │ ├── ContentContract.kt │ │ │ │ │ ├── HomeContract.kt │ │ │ │ │ ├── KnowledgeContract.kt │ │ │ │ │ ├── KnowledgeTreeContract.kt │ │ │ │ │ ├── LoginContract.kt │ │ │ │ │ ├── MainContract.kt │ │ │ │ │ ├── NavigationContract.kt │ │ │ │ │ ├── ProjectContract.kt │ │ │ │ │ ├── ProjectListContract.kt │ │ │ │ │ ├── RankContract.kt │ │ │ │ │ ├── RegisterContract.kt │ │ │ │ │ ├── ScoreContract.kt │ │ │ │ │ ├── SearchContract.kt │ │ │ │ │ ├── SearchListContract.kt │ │ │ │ │ ├── ShareArticleContract.kt │ │ │ │ │ ├── ShareContract.kt │ │ │ │ │ ├── SquareContract.kt │ │ │ │ │ ├── SystemContract.kt │ │ │ │ │ ├── TodoContract.kt │ │ │ │ │ └── WeChatContract.kt │ │ │ │ ├── model │ │ │ │ │ ├── AddTodoModel.kt │ │ │ │ │ ├── CollectModel.kt │ │ │ │ │ ├── CommonModel.kt │ │ │ │ │ ├── ContentModel.kt │ │ │ │ │ ├── HomeModel.kt │ │ │ │ │ ├── KnowledgeModel.kt │ │ │ │ │ ├── KnowledgeTreeModel.kt │ │ │ │ │ ├── LoginModel.kt │ │ │ │ │ ├── MainModel.kt │ │ │ │ │ ├── NavigationModel.kt │ │ │ │ │ ├── ProjectListModel.kt │ │ │ │ │ ├── ProjectModel.kt │ │ │ │ │ ├── RankModel.kt │ │ │ │ │ ├── RegisterModel.kt │ │ │ │ │ ├── ScoreModel.kt │ │ │ │ │ ├── SearchListModel.kt │ │ │ │ │ ├── SearchModel.kt │ │ │ │ │ ├── ShareArticleModel.kt │ │ │ │ │ ├── ShareModel.kt │ │ │ │ │ ├── SquareModel.kt │ │ │ │ │ ├── SystemModel.kt │ │ │ │ │ ├── TodoModel.kt │ │ │ │ │ ├── WeChatModel.kt │ │ │ │ │ └── bean │ │ │ │ │ │ ├── BaseBean.kt │ │ │ │ │ │ ├── DataRepo.kt │ │ │ │ │ │ └── TodoDataBean.kt │ │ │ │ └── presenter │ │ │ │ │ ├── AddTodoPresenter.kt │ │ │ │ │ ├── CollectPresenter.kt │ │ │ │ │ ├── CommonPresenter.kt │ │ │ │ │ ├── ContentPresenter.kt │ │ │ │ │ ├── HomePresenter.kt │ │ │ │ │ ├── KnowledgePresenter.kt │ │ │ │ │ ├── KnowledgeTreePresenter.kt │ │ │ │ │ ├── LoginPresenter.kt │ │ │ │ │ ├── MainPresenter.kt │ │ │ │ │ ├── NavigationPresenter.kt │ │ │ │ │ ├── ProjectListPresenter.kt │ │ │ │ │ ├── ProjectPresenter.kt │ │ │ │ │ ├── RankPresenter.kt │ │ │ │ │ ├── RegisterPresenter.kt │ │ │ │ │ ├── ScorePresenter.kt │ │ │ │ │ ├── SearchListPresenter.kt │ │ │ │ │ ├── SearchPresenter.kt │ │ │ │ │ ├── ShareArticlePresenter.kt │ │ │ │ │ ├── SharePresenter.kt │ │ │ │ │ ├── SquarePresenter.kt │ │ │ │ │ ├── SystemPresenter.kt │ │ │ │ │ ├── TodoPresenter.kt │ │ │ │ │ └── WeChatPresenter.kt │ │ │ │ ├── receiver │ │ │ │ └── NetworkChangeReceiver.kt │ │ │ │ ├── rx │ │ │ │ ├── BaseObserver.kt │ │ │ │ ├── BaseSubscriber.kt │ │ │ │ ├── SchedulerUtils.kt │ │ │ │ └── scheduler │ │ │ │ │ ├── BaseScheduler.kt │ │ │ │ │ ├── ComputationMainScheduler.kt │ │ │ │ │ ├── IoMainScheduler.kt │ │ │ │ │ ├── NewThreadMainScheduler.kt │ │ │ │ │ ├── SingleMainScheduler.kt │ │ │ │ │ └── TrampolineMainScheduler.kt │ │ │ │ ├── ui │ │ │ │ ├── activity │ │ │ │ │ ├── CommonActivity.kt │ │ │ │ │ ├── ContentActivity.kt │ │ │ │ │ ├── KnowledgeActivity.kt │ │ │ │ │ ├── LoginActivity.kt │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ ├── RankActivity.kt │ │ │ │ │ ├── RegisterActivity.kt │ │ │ │ │ ├── ScoreActivity.kt │ │ │ │ │ ├── SearchActivity.kt │ │ │ │ │ ├── ShareActivity.kt │ │ │ │ │ ├── SplashActivity.kt │ │ │ │ │ └── TodoActivity.kt │ │ │ │ ├── fragment │ │ │ │ │ ├── AboutFragment.kt │ │ │ │ │ ├── AddTodoFragment.kt │ │ │ │ │ ├── CollectFragment.kt │ │ │ │ │ ├── HomeFragment.kt │ │ │ │ │ ├── KnowledgeFragment.kt │ │ │ │ │ ├── KnowledgeTreeFragment.kt │ │ │ │ │ ├── NavigationFragment.kt │ │ │ │ │ ├── ProjectFragment.kt │ │ │ │ │ ├── ProjectListFragment.kt │ │ │ │ │ ├── QrCodeFragment.kt │ │ │ │ │ ├── SearchListFragment.kt │ │ │ │ │ ├── SettingFragment.kt │ │ │ │ │ ├── ShareArticleFragment.kt │ │ │ │ │ ├── SquareFragment.kt │ │ │ │ │ ├── SystemFragment.kt │ │ │ │ │ ├── TodoFragment.kt │ │ │ │ │ └── WeChatFragment.kt │ │ │ │ └── setting │ │ │ │ │ ├── AutoNightModeFragment.kt │ │ │ │ │ ├── SettingActivity.kt │ │ │ │ │ └── SettingFragment.kt │ │ │ │ ├── utils │ │ │ │ ├── AnimatorUtil.kt │ │ │ │ ├── AppUtils.kt │ │ │ │ ├── AutoDensityUtil.kt │ │ │ │ ├── CacheDataUtil.kt │ │ │ │ ├── ColorUtil.kt │ │ │ │ ├── CommonUtil.kt │ │ │ │ ├── DialogUtil.kt │ │ │ │ ├── DisplayManager.kt │ │ │ │ ├── FileProvider7.kt │ │ │ │ ├── ImageLoader.kt │ │ │ │ ├── KeyBoardUtil.kt │ │ │ │ ├── NetWorkUtil.kt │ │ │ │ ├── Preference.kt │ │ │ │ ├── RomUtil.kt │ │ │ │ ├── SettingUtil.kt │ │ │ │ ├── StatusBarUtil.kt │ │ │ │ ├── StatusBarUtil2.kt │ │ │ │ ├── StringUtil.kt │ │ │ │ └── Wget.kt │ │ │ │ ├── webclient │ │ │ │ ├── BaseWebClient.kt │ │ │ │ ├── JianShuWebClient.kt │ │ │ │ └── WebClientFactory.kt │ │ │ │ └── widget │ │ │ │ ├── CircleImageView.kt │ │ │ │ ├── ClearEditText.kt │ │ │ │ ├── CustomToast.kt │ │ │ │ ├── IconListPreference.kt │ │ │ │ ├── IconPreference.kt │ │ │ │ ├── NestedScrollAgentWebView.kt │ │ │ │ ├── RecyclerViewItemDecoration.kt │ │ │ │ ├── SpaceItemDecoration.kt │ │ │ │ ├── SwipeItemLayout.java │ │ │ │ ├── TiltTextView.kt │ │ │ │ ├── WebContainer.kt │ │ │ │ ├── behavior │ │ │ │ ├── BottomNavigationBehavior.kt │ │ │ │ ├── ScaleDownShowBehavior.kt │ │ │ │ ├── ScrollAwareFAB2Behavior.kt │ │ │ │ └── ScrollAwareFABBehavior.kt │ │ │ │ └── helper │ │ │ │ ├── BottomNavigationViewHelper.kt │ │ │ │ └── TabLayoutHelper.kt │ │ └── res │ │ │ ├── anim │ │ │ ├── fade_in.xml │ │ │ ├── fade_out.xml │ │ │ ├── jump_from_down.xml │ │ │ ├── jump_to_down.xml │ │ │ ├── push_up_in.xml │ │ │ └── push_up_out.xml │ │ │ ├── drawable-v21 │ │ │ ├── item_flow_selector.xml │ │ │ └── search_bg.xml │ │ │ ├── drawable-v24 │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── placeholder_banner.png │ │ │ ├── drawable │ │ │ ├── bg_delete.xml │ │ │ ├── bg_divider.xml │ │ │ ├── bg_done.xml │ │ │ ├── bg_fresh.xml │ │ │ ├── bg_logo.xml │ │ │ ├── bg_placeholder.xml │ │ │ ├── bg_tag.xml │ │ │ ├── bg_tag_one.xml │ │ │ ├── bg_toast_custom.xml │ │ │ ├── bg_upgrade_bottom.xml │ │ │ ├── btn_login_bg.xml │ │ │ ├── fab_label_background.xml │ │ │ ├── ic_about_us_white_24dp.xml │ │ │ ├── ic_action_browser.xml │ │ │ ├── ic_action_share.xml │ │ │ ├── ic_action_white_like.xml │ │ │ ├── ic_add_24dp.xml │ │ │ ├── ic_apps_black_24dp.xml │ │ │ ├── ic_arrow_right_24dp.xml │ │ │ ├── ic_arrow_upward_white_24dp.xml │ │ │ ├── ic_back.xml │ │ │ ├── ic_back_press.xml │ │ │ ├── ic_clear_grey_24dp.xml │ │ │ ├── ic_done_24dp.xml │ │ │ ├── ic_help_white_24dp.xml │ │ │ ├── ic_home_black_24dp.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_like.xml │ │ │ ├── ic_like_not.xml │ │ │ ├── ic_logout_white_24dp.xml │ │ │ ├── ic_navigation_black_24dp.xml │ │ │ ├── ic_night_24dp.xml │ │ │ ├── ic_night_white_24dp.xml │ │ │ ├── ic_project_black_24dp.xml │ │ │ ├── ic_rank_white_24dp.xml │ │ │ ├── ic_score_white_24dp.xml │ │ │ ├── ic_search.xml │ │ │ ├── ic_search_black_24dp.xml │ │ │ ├── ic_search_white_24dp.xml │ │ │ ├── ic_setting_24dp.xml │ │ │ ├── ic_setting_white_24dp.xml │ │ │ ├── ic_share_white_24dp.xml │ │ │ ├── ic_square_black_24dp.xml │ │ │ ├── ic_switch_white_24dp.xml │ │ │ ├── ic_todo_24dp.xml │ │ │ ├── ic_todo_default_24dp.xml │ │ │ ├── ic_wechat_black_24dp.xml │ │ │ ├── item_flow_selector.xml │ │ │ ├── nav_item_color_state.xml │ │ │ ├── selector_back_arrow_bg.xml │ │ │ └── shape_cursor.xml │ │ │ ├── layout │ │ │ ├── activity_common.xml │ │ │ ├── activity_content.xml │ │ │ ├── activity_knowledge.xml │ │ │ ├── activity_login.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_rank.xml │ │ │ ├── activity_register.xml │ │ │ ├── activity_score.xml │ │ │ ├── activity_search.xml │ │ │ ├── activity_setting.xml │ │ │ ├── activity_share.xml │ │ │ ├── activity_splash.xml │ │ │ ├── activity_todo.xml │ │ │ ├── container.xml │ │ │ ├── custom_preference_layout.xml │ │ │ ├── flow_layout_tv.xml │ │ │ ├── fragment_about.xml │ │ │ ├── fragment_add_todo.xml │ │ │ ├── fragment_collect.xml │ │ │ ├── fragment_empty_layout.xml │ │ │ ├── fragment_navigation.xml │ │ │ ├── fragment_project.xml │ │ │ ├── fragment_qr_code.xml │ │ │ ├── fragment_refresh_layout.xml │ │ │ ├── fragment_score.xml │ │ │ ├── fragment_search_list.xml │ │ │ ├── fragment_setting.xml │ │ │ ├── fragment_share_article.xml │ │ │ ├── fragment_square.xml │ │ │ ├── fragment_system.xml │ │ │ ├── fragment_todo.xml │ │ │ ├── fragment_wechat.xml │ │ │ ├── item_collect_list.xml │ │ │ ├── item_home_banner.xml │ │ │ ├── item_home_list.xml │ │ │ ├── item_icon_listpreference.xml │ │ │ ├── item_icon_listpreference_preview.xml │ │ │ ├── item_icon_preference_preview.xml │ │ │ ├── item_knowledge_list.xml │ │ │ ├── item_knowledge_tree_list.xml │ │ │ ├── item_navigation_list.xml │ │ │ ├── item_project_list.xml │ │ │ ├── item_rank_list.xml │ │ │ ├── item_search_history.xml │ │ │ ├── item_share_list.xml │ │ │ ├── item_socre_list.xml │ │ │ ├── item_sticky_header.xml │ │ │ ├── item_todo_list.xml │ │ │ ├── item_todo_popup_list.xml │ │ │ ├── layout_empty_view.xml │ │ │ ├── layout_error_view.xml │ │ │ ├── layout_loading_view.xml │ │ │ ├── layout_network_tip.xml │ │ │ ├── layout_network_view.xml │ │ │ ├── layout_popup_todo.xml │ │ │ ├── layout_upgrade_dialog.xml │ │ │ ├── nav_header_main.xml │ │ │ ├── search_empty_view.xml │ │ │ ├── toast_custom.xml │ │ │ ├── toolbar.xml │ │ │ └── toolbar_search.xml │ │ │ ├── menu │ │ │ ├── bottom_navigation_main.xml │ │ │ ├── bottom_navigation_todo.xml │ │ │ ├── menu_activity_main.xml │ │ │ ├── menu_content.xml │ │ │ ├── menu_score.xml │ │ │ ├── menu_search.xml │ │ │ ├── menu_share.xml │ │ │ ├── menu_share_article.xml │ │ │ ├── menu_square.xml │ │ │ ├── menu_todo.xml │ │ │ ├── menu_type_content.xml │ │ │ └── nav_menu.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_default_avatar.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_action_clear.png │ │ │ ├── ic_empty.png │ │ │ ├── ic_error.png │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ ├── ic_upgrade_top.png │ │ │ ├── logo.png │ │ │ └── qr_code.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── values-en │ │ │ └── strings.xml │ │ │ ├── values-night │ │ │ └── colors.xml │ │ │ ├── values-v19 │ │ │ └── styles.xml │ │ │ ├── values-v21 │ │ │ └── styles.xml │ │ │ ├── values │ │ │ ├── arrays.xml │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── ids.xml │ │ │ ├── notranslate.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ ├── file_paths.xml │ │ │ ├── network_security_config.xml │ │ │ ├── pref_autonight.xml │ │ │ ├── pref_setting.xml │ │ │ └── provider_paths.xml │ └── test │ │ └── java │ │ └── com │ │ └── cxz │ │ └── wanandroid │ │ └── ExampleUnitTest.kt └── tinker-support.gradle ├── art ├── 01.png ├── 02.png ├── 03.png ├── 04.png ├── 05.jpg ├── 06.jpg ├── 07.jpg ├── 08.jpg ├── 09.jpg ├── 10.jpg ├── 11.jpg ├── 12.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 16.jpg ├── 17.jpg ├── 18.jpg ├── 19.jpg ├── 20.jpg └── qr-code.png ├── build.gradle ├── config.gradle ├── cxz.jks.enc ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── lib_multiple_view ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── cxz │ │ └── multipleview │ │ └── MultipleStatusView.kt │ └── res │ ├── layout │ ├── empty_view.xml │ ├── error_view.xml │ ├── loading_view.xml │ └── no_network_view.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | /cxz.jks 10 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/release/WanAndroid-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/release/WanAndroid-release.apk -------------------------------------------------------------------------------- /app/release/output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "outputType": { 4 | "type": "APK" 5 | }, 6 | "apkData": { 7 | "type": "MAIN", 8 | "splits": [], 9 | "versionCode": 19, 10 | "versionName": "1.1.8", 11 | "enabled": true, 12 | "outputFile": "WanAndroid-release.apk", 13 | "fullName": "release", 14 | "baseName": "release" 15 | }, 16 | "path": "WanAndroid-release.apk", 17 | "properties": {} 18 | } 19 | ] -------------------------------------------------------------------------------- /app/src/androidTest/java/com/cxz/wanandroid/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getTargetContext() 22 | assertEquals("com.cxz.wanandroid", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/KnowledgePagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import android.text.Html 4 | import androidx.fragment.app.Fragment 5 | import androidx.fragment.app.FragmentManager 6 | import androidx.fragment.app.FragmentStatePagerAdapter 7 | import com.cxz.wanandroid.mvp.model.bean.Knowledge 8 | import com.cxz.wanandroid.ui.fragment.KnowledgeFragment 9 | 10 | /** 11 | * Created by chenxz on 2018/5/10. 12 | */ 13 | class KnowledgePagerAdapter(val list: List, fm: FragmentManager) : FragmentStatePagerAdapter(fm) { 14 | 15 | private val fragments = mutableListOf() 16 | 17 | init { 18 | fragments.clear() 19 | list.forEach { 20 | fragments.add(KnowledgeFragment.getInstance(it.id)) 21 | } 22 | } 23 | 24 | override fun getItem(position: Int): Fragment = fragments[position] 25 | 26 | override fun getCount(): Int = list.size 27 | 28 | override fun getPageTitle(position: Int): CharSequence? = Html.fromHtml(list[position].name) 29 | 30 | override fun getItemPosition(`object`: Any): Int = POSITION_NONE 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/KnowledgeTreeAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import android.text.Html 4 | import com.chad.library.adapter.base.BaseQuickAdapter 5 | import com.chad.library.adapter.base.module.LoadMoreModule 6 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 7 | import com.cxz.wanandroid.R 8 | import com.cxz.wanandroid.mvp.model.bean.KnowledgeTreeBody 9 | 10 | /** 11 | * Created by chenxz on 2018/5/9. 12 | */ 13 | class KnowledgeTreeAdapter : BaseQuickAdapter(R.layout.item_knowledge_tree_list), 14 | LoadMoreModule { 15 | 16 | override fun convert(holder: BaseViewHolder, item: KnowledgeTreeBody) { 17 | holder.setText(R.id.title_first, item.name) 18 | item.children.let { 19 | holder.setText( 20 | R.id.title_second, 21 | it.joinToString(" ", transform = { child -> 22 | Html.fromHtml(child.name) 23 | }) 24 | ) 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/NavigationTabAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import android.content.Context 4 | import androidx.core.content.ContextCompat 5 | import com.cxz.wanandroid.R 6 | import com.cxz.wanandroid.mvp.model.bean.NavigationBean 7 | import q.rorbin.verticaltablayout.adapter.TabAdapter 8 | import q.rorbin.verticaltablayout.widget.ITabView 9 | 10 | /** 11 | * Created by chenxz on 2018/5/13. 12 | */ 13 | class NavigationTabAdapter(context: Context?, list: List) : TabAdapter { 14 | 15 | private var context: Context = context!! 16 | private var list = mutableListOf() 17 | 18 | init { 19 | this.list = list as MutableList 20 | } 21 | 22 | override fun getIcon(position: Int): ITabView.TabIcon? = null 23 | 24 | 25 | override fun getBadge(position: Int): ITabView.TabBadge? = null 26 | 27 | override fun getBackground(position: Int): Int = -1 28 | 29 | override fun getTitle(position: Int): ITabView.TabTitle { 30 | return ITabView.TabTitle.Builder() 31 | .setContent(list[position].name) 32 | .setTextColor(ContextCompat.getColor(context, R.color.colorAccent), 33 | ContextCompat.getColor(context, R.color.Grey500)) 34 | .build() 35 | } 36 | 37 | override fun getCount(): Int = list.size 38 | 39 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/ProjectAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import android.text.Html 4 | import com.chad.library.adapter.base.BaseQuickAdapter 5 | import com.chad.library.adapter.base.module.LoadMoreModule 6 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 7 | import com.cxz.wanandroid.R 8 | import com.cxz.wanandroid.mvp.model.bean.Article 9 | import com.cxz.wanandroid.utils.ImageLoader 10 | 11 | /** 12 | * Created by chenxz on 2018/5/20. 13 | */ 14 | class ProjectAdapter : BaseQuickAdapter(R.layout.item_project_list), LoadMoreModule { 15 | 16 | init { 17 | addChildClickViewIds(R.id.item_project_list_like_iv) 18 | } 19 | 20 | override fun convert(holder: BaseViewHolder, item: Article) { 21 | val authorStr = if (item.author.isNotEmpty()) item.author else item.shareUser 22 | holder.setText(R.id.item_project_list_title_tv, Html.fromHtml(item.title)) 23 | .setText(R.id.item_project_list_content_tv, Html.fromHtml(item.desc)) 24 | .setText(R.id.item_project_list_time_tv, item.niceDate) 25 | .setText(R.id.item_project_list_author_tv, authorStr) 26 | .setImageResource( 27 | R.id.item_project_list_like_iv, 28 | if (item.collect) R.drawable.ic_like else R.drawable.ic_like_not 29 | ) 30 | ImageLoader.load(context, item.envelopePic, holder.getView(R.id.item_project_list_iv)) 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/ProjectPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentManager 5 | import android.text.Html 6 | import androidx.fragment.app.FragmentStatePagerAdapter 7 | import com.cxz.wanandroid.mvp.model.bean.ProjectTreeBean 8 | import com.cxz.wanandroid.ui.fragment.ProjectListFragment 9 | 10 | /** 11 | * Created by chenxz on 2018/5/20. 12 | */ 13 | class ProjectPagerAdapter(private val list: MutableList, fm: FragmentManager) : FragmentStatePagerAdapter(fm) { 14 | 15 | private val fragments = mutableListOf() 16 | 17 | init { 18 | fragments.clear() 19 | list.forEach { 20 | fragments.add(ProjectListFragment.getInstance(it.id)) 21 | } 22 | } 23 | 24 | override fun getItem(position: Int): Fragment = fragments[position] 25 | 26 | override fun getCount(): Int = list.size 27 | 28 | override fun getPageTitle(position: Int): CharSequence? = Html.fromHtml(list[position].name) 29 | 30 | override fun getItemPosition(`object`: Any): Int = POSITION_NONE 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/RankAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import com.chad.library.adapter.base.BaseQuickAdapter 4 | import com.chad.library.adapter.base.module.LoadMoreModule 5 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 6 | import com.cxz.wanandroid.R 7 | import com.cxz.wanandroid.mvp.model.bean.CoinInfoBean 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2019/9/5 12 | * @desc 13 | */ 14 | class RankAdapter : BaseQuickAdapter(R.layout.item_rank_list), LoadMoreModule { 15 | 16 | override fun convert(holder: BaseViewHolder, item: CoinInfoBean) { 17 | val index = holder.layoutPosition 18 | holder.setText(R.id.tv_username, item.username) 19 | .setText(R.id.tv_score, item.coinCount.toString()) 20 | .setText(R.id.tv_ranking, (index + 1).toString()) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/ScoreAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import com.chad.library.adapter.base.BaseQuickAdapter 4 | import com.chad.library.adapter.base.module.LoadMoreModule 5 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 6 | import com.cxz.wanandroid.R 7 | import com.cxz.wanandroid.mvp.model.bean.UserScoreBean 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2019/9/5 12 | * @desc 13 | */ 14 | class ScoreAdapter : BaseQuickAdapter(R.layout.item_socre_list), LoadMoreModule { 15 | 16 | override fun convert(holder: BaseViewHolder, item: UserScoreBean) { 17 | holder.setText(R.id.tv_reason, item.reason) 18 | .setText(R.id.tv_desc, item.desc) 19 | .setText(R.id.tv_score, "+${item.coinCount}") 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/SearchHistoryAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import com.chad.library.adapter.base.BaseQuickAdapter 4 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 5 | import com.cxz.wanandroid.R 6 | import com.cxz.wanandroid.mvp.model.bean.SearchHistoryBean 7 | 8 | class SearchHistoryAdapter : BaseQuickAdapter(R.layout.item_search_history) { 9 | 10 | init { 11 | addChildClickViewIds(R.id.iv_clear) 12 | } 13 | 14 | override fun convert(holder: BaseViewHolder, item: SearchHistoryBean) { 15 | holder.setText(R.id.tv_search_key, item.key) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/TodoPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentManager 5 | import androidx.fragment.app.FragmentPagerAdapter 6 | import com.cxz.wanandroid.mvp.model.bean.TodoTypeBean 7 | import com.cxz.wanandroid.ui.fragment.TodoFragment 8 | 9 | /** 10 | * Created by chenxz on 2018/8/6. 11 | */ 12 | class TodoPagerAdapter(val list: List, fm: FragmentManager) : FragmentPagerAdapter(fm) { 13 | 14 | private val fragments = mutableListOf() 15 | 16 | init { 17 | list.forEach { 18 | fragments.add(TodoFragment.getInstance(it.type)) 19 | } 20 | } 21 | 22 | override fun getItem(position: Int): Fragment = fragments[position] 23 | 24 | override fun getCount(): Int = list.size 25 | 26 | override fun getPageTitle(position: Int): CharSequence? = list[position].name 27 | 28 | override fun getItemPosition(`object`: Any): Int = POSITION_NONE 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/TodoPopupAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import android.widget.TextView 4 | import com.chad.library.adapter.base.BaseQuickAdapter 5 | import com.chad.library.adapter.base.viewholder.BaseViewHolder 6 | import com.cxz.wanandroid.R 7 | import com.cxz.wanandroid.mvp.model.bean.TodoTypeBean 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2018/11/25 12 | * @desc 13 | */ 14 | class TodoPopupAdapter : BaseQuickAdapter(R.layout.item_todo_popup_list) { 15 | 16 | override fun convert(helper: BaseViewHolder, item: TodoTypeBean) { 17 | val tv_popup = helper.getView(R.id.tv_popup) 18 | tv_popup.text = item.name 19 | if (item.isSelected) { 20 | tv_popup.setTextColor(context.resources.getColor(R.color.colorAccent)) 21 | } else { 22 | tv_popup.setTextColor(context.resources.getColor(R.color.common_color)) 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/adapter/WeChatPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.adapter 2 | 3 | import android.text.Html 4 | import androidx.fragment.app.Fragment 5 | import androidx.fragment.app.FragmentManager 6 | import androidx.fragment.app.FragmentStatePagerAdapter 7 | import com.cxz.wanandroid.mvp.model.bean.WXChapterBean 8 | import com.cxz.wanandroid.ui.fragment.KnowledgeFragment 9 | 10 | /** 11 | * @author chenxz 12 | * @date 2018/10/28 13 | * @desc 14 | */ 15 | class WeChatPagerAdapter(private val list: MutableList, fm: FragmentManager) : 16 | FragmentStatePagerAdapter(fm) { 17 | 18 | private val fragments = mutableListOf() 19 | 20 | init { 21 | fragments.clear() 22 | list.forEach { 23 | fragments.add(KnowledgeFragment.getInstance(it.id)) 24 | } 25 | } 26 | 27 | override fun getItem(position: Int): Fragment = fragments[position] 28 | 29 | override fun getCount(): Int = list.size 30 | 31 | override fun getPageTitle(position: Int): CharSequence? = Html.fromHtml(list[position].name) 32 | 33 | override fun getItemPosition(`object`: Any): Int = POSITION_NONE 34 | 35 | 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/base/BaseModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.base 2 | 3 | import androidx.lifecycle.Lifecycle 4 | import androidx.lifecycle.LifecycleObserver 5 | import androidx.lifecycle.LifecycleOwner 6 | import androidx.lifecycle.OnLifecycleEvent 7 | import io.reactivex.disposables.CompositeDisposable 8 | import io.reactivex.disposables.Disposable 9 | 10 | /** 11 | * Created by chenxz on 2018/8/18. 12 | */ 13 | abstract class BaseModel : IModel, LifecycleObserver { 14 | 15 | private var mCompositeDisposable: CompositeDisposable? = null 16 | 17 | override fun addDisposable(disposable: Disposable?) { 18 | if (mCompositeDisposable == null) { 19 | mCompositeDisposable = CompositeDisposable() 20 | } 21 | disposable?.let { mCompositeDisposable?.add(it) } 22 | } 23 | 24 | override fun onDetach() { 25 | unDispose() 26 | } 27 | 28 | private fun unDispose() { 29 | mCompositeDisposable?.clear() // 保证Activity结束时取消 30 | mCompositeDisposable = null 31 | } 32 | 33 | @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 34 | internal fun onDestroy(owner: LifecycleOwner) { 35 | owner.lifecycle.removeObserver(this) 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/base/BaseMvpActivity.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.base 2 | 3 | import com.cxz.wanandroid.ext.showToast 4 | 5 | /** 6 | * @author chenxz 7 | * @date 2018/9/7 8 | * @desc BaseMvpActivity 9 | */ 10 | @Suppress("UNCHECKED_CAST") 11 | abstract class BaseMvpActivity> : BaseActivity(), IView { 12 | 13 | /** 14 | * Presenter 15 | */ 16 | protected var mPresenter: P? = null 17 | 18 | protected abstract fun createPresenter(): P 19 | 20 | override fun initView() { 21 | mPresenter = createPresenter() 22 | mPresenter?.attachView(this as V) 23 | } 24 | 25 | override fun onDestroy() { 26 | super.onDestroy() 27 | mPresenter?.detachView() 28 | this.mPresenter = null 29 | } 30 | 31 | override fun showLoading() { 32 | } 33 | 34 | override fun hideLoading() { 35 | } 36 | 37 | override fun showError(errorMsg: String) { 38 | showToast(errorMsg) 39 | } 40 | 41 | override fun showDefaultMsg(msg: String) { 42 | showToast(msg) 43 | } 44 | 45 | override fun showMsg(msg: String) { 46 | showToast(msg) 47 | } 48 | 49 | 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/base/BaseMvpFragment.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.base 2 | 3 | import android.view.View 4 | import com.cxz.wanandroid.ext.showToast 5 | 6 | /** 7 | * @author chenxz 8 | * @date 2018/9/7 9 | * @desc BaseMvpFragment 10 | */ 11 | @Suppress("UNCHECKED_CAST") 12 | abstract class BaseMvpFragment> : BaseFragment(), IView { 13 | 14 | /** 15 | * Presenter 16 | */ 17 | protected var mPresenter: P? = null 18 | 19 | protected abstract fun createPresenter(): P 20 | 21 | override fun initView(view: View) { 22 | mPresenter = createPresenter() 23 | mPresenter?.attachView(this as V) 24 | } 25 | 26 | override fun onDestroyView() { 27 | super.onDestroyView() 28 | mPresenter?.detachView() 29 | this.mPresenter = null 30 | } 31 | 32 | override fun showLoading() { 33 | } 34 | 35 | override fun hideLoading() { 36 | } 37 | 38 | override fun showError(errorMsg: String) { 39 | showToast(errorMsg) 40 | } 41 | 42 | override fun showDefaultMsg(msg: String) { 43 | showToast(msg) 44 | } 45 | 46 | override fun showMsg(msg: String) { 47 | showToast(msg) 48 | } 49 | 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/base/IModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.base 2 | 3 | import io.reactivex.disposables.Disposable 4 | 5 | /** 6 | * Created by chenxz on 2018/8/18. 7 | */ 8 | interface IModel { 9 | 10 | fun addDisposable(disposable: Disposable?) 11 | 12 | fun onDetach() 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/base/IPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.base 2 | 3 | /** 4 | * Created by chenxz on 2018/4/21. 5 | */ 6 | interface IPresenter { 7 | 8 | /** 9 | * 绑定 View 10 | */ 11 | fun attachView(mView: V) 12 | 13 | /** 14 | * 解绑 View 15 | */ 16 | fun detachView() 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/base/IView.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.base 2 | 3 | /** 4 | * Created by chenxz on 2018/4/21. 5 | */ 6 | interface IView { 7 | 8 | /** 9 | * 显示加载 10 | */ 11 | fun showLoading() 12 | 13 | /** 14 | * 隐藏加载 15 | */ 16 | fun hideLoading() 17 | 18 | /** 19 | * 使用默认的样式显示信息: CustomToast 20 | */ 21 | fun showDefaultMsg(msg: String) 22 | 23 | /** 24 | * 显示信息 25 | */ 26 | fun showMsg(msg: String) 27 | 28 | /** 29 | * 显示错误信息 30 | */ 31 | fun showError(errorMsg: String) 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/common/CommonUtil.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.common 2 | 3 | /** 4 | * Created by chenxz on 2018/5/21. 5 | */ 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/common/adapter/MultipleType.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.common.adapter 2 | 3 | /** 4 | * desc: 多布局条目类型 5 | */ 6 | @Deprecated("") 7 | interface MultipleType { 8 | fun getLayoutId(item: T, position: Int): Int 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/common/adapter/OnItemClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.common.adapter 2 | 3 | /** 4 | * Description: Adapter条目的点击事件 5 | */ 6 | @Deprecated("") 7 | interface OnItemClickListener { 8 | 9 | fun onItemClick(obj: Any?, position: Int) 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/common/adapter/OnItemLongClickListener.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.common.adapter 2 | 3 | /** 4 | * Description: Adapter条目的长按事件 5 | */ 6 | @Deprecated("") 7 | interface OnItemLongClickListener { 8 | 9 | fun onItemLongClick(obj: Any?, position: Int): Boolean 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/event/ColorEvent.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.event 2 | 3 | import com.cxz.wanandroid.utils.SettingUtil 4 | 5 | /** 6 | * Created by chenxz on 2018/6/18. 7 | */ 8 | class ColorEvent(var isRefresh: Boolean, var color: Int = SettingUtil.getColor()) -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/event/LoginEvent.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.event 2 | 3 | /** 4 | * Created by chenxz on 2018/6/3. 5 | */ 6 | class LoginEvent(var isLogin: Boolean) -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/event/NetworkChangeEvent.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.event 2 | 3 | /** 4 | * Created by chenxz on 2018/8/1. 5 | */ 6 | class NetworkChangeEvent(var isConnected: Boolean) -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/event/RefreshHomeEvent.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.event 2 | 3 | /** 4 | * Created by chenxz on 2018/6/10. 5 | */ 6 | class RefreshHomeEvent(var isRefresh: Boolean) -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/event/RefreshShareEvent.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.event 2 | 3 | /** 4 | * @author chenxz 5 | * @date 2019/11/17 6 | * @desc 7 | */ 8 | 9 | class RefreshShareEvent(var isRefresh: Boolean) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/event/RefreshTodoEvent.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.event 2 | 3 | /** 4 | * Created by chenxz on 2018/8/12. 5 | */ 6 | class RefreshTodoEvent(var isRefresh: Boolean, var type: Int) -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/event/TodoEvent.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.event 2 | 3 | /** 4 | * Created by chenxz on 2018/8/11. 5 | */ 6 | class TodoEvent(var type: String, var curIndex: Int) 7 | 8 | class TodoTypeEvent(var type: Int) -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/http/cookies/CookieManager.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.http.cookies 2 | 3 | import okhttp3.Cookie 4 | import okhttp3.CookieJar 5 | import okhttp3.HttpUrl 6 | 7 | /** 8 | * Created by chenxz on 2018/6/6. 9 | */ 10 | class CookieManager : CookieJar { 11 | 12 | private val COOKIE_STORE = PersistentCookieStore() 13 | 14 | override fun saveFromResponse(url: HttpUrl?, cookies: MutableList?) { 15 | cookies ?: return 16 | url ?: return 17 | if (cookies.size > 0) { 18 | for (cookie in cookies) { 19 | COOKIE_STORE.add(url, cookie) 20 | } 21 | } 22 | } 23 | 24 | override fun loadForRequest(url: HttpUrl): List = COOKIE_STORE.get(url) 25 | 26 | /** 27 | * 清除所有cookie 28 | */ 29 | fun clearAllCookies() { 30 | COOKIE_STORE.removeAll() 31 | } 32 | 33 | /** 34 | * 清除指定cookie 35 | * 36 | * @param url HttpUrl 37 | * @param cookie Cookie 38 | * @return if clear cookies 39 | */ 40 | fun clearCookies(url: HttpUrl, cookie: Cookie): Boolean { 41 | return COOKIE_STORE.remove(url, cookie) 42 | } 43 | 44 | /** 45 | * 获取cookies 46 | * 47 | * @return List 48 | */ 49 | fun getCookies(): List { 50 | return COOKIE_STORE.getCookies() 51 | } 52 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/http/exception/ApiException.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.http.exception 2 | 3 | /** 4 | * Created by chenxz on 2018/4/21. 5 | */ 6 | class ApiException : RuntimeException { 7 | 8 | private var code: Int? = null 9 | 10 | constructor(throwable: Throwable, code: Int) : super(throwable) { 11 | this.code = code 12 | } 13 | 14 | constructor(message: String) : super(Throwable(message)) 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/http/exception/ErrorStatus.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.http.exception 2 | 3 | /** 4 | * Created by chenxz on 2018/4/21. 5 | */ 6 | object ErrorStatus { 7 | /** 8 | * 响应成功 9 | */ 10 | const val SUCCESS = 0 11 | 12 | /** 13 | * Token 过期 14 | */ 15 | const val TOKEN_INVALID = 401 16 | 17 | /** 18 | * 未知错误 19 | */ 20 | const val UNKNOWN_ERROR = 1002 21 | 22 | /** 23 | * 服务器内部错误 24 | */ 25 | const val SERVER_ERROR = 1003 26 | 27 | /** 28 | * 网络连接超时 29 | */ 30 | const val NETWORK_ERROR = 1004 31 | 32 | /** 33 | * API解析异常(或者第三方数据结构更改)等其他异常 34 | */ 35 | const val API_ERROR = 1005 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/http/interceptor/NetCacheInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.http.interceptor 2 | 3 | import com.cxz.wanandroid.app.App 4 | import com.cxz.wanandroid.utils.NetWorkUtil 5 | import okhttp3.Interceptor 6 | import okhttp3.Response 7 | 8 | /** 9 | * @author chenxz 10 | * @date 2018/11/15 11 | * @desc NetCacheInterceptor: 有网的时候缓存 12 | */ 13 | class NetCacheInterceptor : Interceptor { 14 | 15 | override fun intercept(chain: Interceptor.Chain): Response { 16 | val request = chain.request() 17 | val response = chain.proceed(request) 18 | if (NetWorkUtil.isNetworkAvailable(App.context)) { 19 | val maxAge = 60 * 3 20 | // 有网络时 设置缓存超时时间0时 ,意思就是不读取缓存数据,只对get有用,post没有缓冲 21 | response.newBuilder() 22 | .header("Cache-Control", "public, max-age=$maxAge") 23 | .removeHeader("Retrofit")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效 24 | .build() 25 | } 26 | 27 | return response 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/http/interceptor/OfflineCacheInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.http.interceptor 2 | 3 | import com.cxz.wanandroid.app.App 4 | import com.cxz.wanandroid.utils.NetWorkUtil 5 | import okhttp3.Interceptor 6 | import okhttp3.Response 7 | 8 | /** 9 | * @author chenxz 10 | * @date 2018/11/15 11 | * @desc OfflineCacheInterceptor: 没有网时缓存 12 | */ 13 | class OfflineCacheInterceptor : Interceptor { 14 | 15 | override fun intercept(chain: Interceptor.Chain): Response { 16 | val request = chain.request() 17 | val response = chain.proceed(request) 18 | if (!NetWorkUtil.isNetworkAvailable(App.context)) { 19 | // 无网络时,设置超时为4周 只对get有用,post没有缓冲 20 | val maxStale = 60 * 60 * 24 * 28 21 | response.newBuilder() 22 | .header("Cache-Control", "public, only-if-cached, max-stale=$maxStale") 23 | .removeHeader("nyn") 24 | .build() 25 | } 26 | 27 | return response 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/http/interceptor/QueryParameterInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.http.interceptor 2 | 3 | import okhttp3.Interceptor 4 | import okhttp3.Request 5 | import okhttp3.Response 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2018/9/26 10 | * @desc QueryParameterInterceptor 设置公共参数 11 | */ 12 | class QueryParameterInterceptor : Interceptor { 13 | 14 | override fun intercept(chain: Interceptor.Chain): Response { 15 | val originalRequest = chain.request() 16 | val request: Request 17 | val modifiedUrl = originalRequest.url().newBuilder() 18 | // Provide your custom parameter here 19 | .addQueryParameter("phoneSystem", "") 20 | .addQueryParameter("phoneModel", "") 21 | .build() 22 | request = originalRequest.newBuilder().url(modifiedUrl).build() 23 | return chain.proceed(request) 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/http/interceptor/SaveCookieInterceptor.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.http.interceptor 2 | 3 | import com.cxz.wanandroid.constant.HttpConstant 4 | import okhttp3.Interceptor 5 | import okhttp3.Response 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2018/9/26 10 | * @desc SaveCookieInterceptor: 保存 Cookie 11 | */ 12 | class SaveCookieInterceptor : Interceptor { 13 | 14 | override fun intercept(chain: Interceptor.Chain): Response { 15 | val request = chain.request() 16 | val response = chain.proceed(request) 17 | val requestUrl = request.url().toString() 18 | val domain = request.url().host() 19 | // set-cookie maybe has multi, login to save cookie 20 | if ((requestUrl.contains(HttpConstant.SAVE_USER_LOGIN_KEY) 21 | || requestUrl.contains(HttpConstant.SAVE_USER_REGISTER_KEY)) 22 | && !response.headers(HttpConstant.SET_COOKIE_KEY).isEmpty()) { 23 | val cookies = response.headers(HttpConstant.SET_COOKIE_KEY) 24 | val cookie = HttpConstant.encodeCookie(cookies) 25 | HttpConstant.saveCookie(requestUrl, domain, cookie) 26 | } 27 | return response 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/AddTodoContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * Created by chenxz on 2018/8/11. 11 | */ 12 | interface AddTodoContract { 13 | 14 | interface View : IView { 15 | 16 | fun showAddTodo(success: Boolean) 17 | 18 | fun showUpdateTodo(success: Boolean) 19 | 20 | fun getType(): Int 21 | fun getCurrentDate(): String 22 | fun getTitle(): String 23 | fun getContent(): String 24 | fun getStatus(): Int 25 | fun getItemId(): Int 26 | fun getPriority(): String 27 | 28 | } 29 | 30 | interface Presenter : IPresenter { 31 | 32 | fun addTodo() 33 | 34 | fun updateTodo(id: Int) 35 | 36 | } 37 | 38 | interface Model : IModel { 39 | 40 | fun addTodo(map: MutableMap): Observable> 41 | 42 | fun updateTodo(id: Int, map: MutableMap): Observable> 43 | 44 | } 45 | 46 | 47 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/CollectContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.CollectionArticle 7 | import com.cxz.wanandroid.mvp.model.bean.BaseListResponseBody 8 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * Created by chenxz on 2018/6/9. 13 | */ 14 | interface CollectContract { 15 | 16 | interface View : IView { 17 | 18 | fun setCollectList(articles: BaseListResponseBody) 19 | 20 | fun showRemoveCollectSuccess(success: Boolean) 21 | 22 | fun scrollToTop() 23 | 24 | } 25 | 26 | interface Presenter : IPresenter { 27 | 28 | fun getCollectList(page: Int) 29 | 30 | fun removeCollectArticle(id: Int, originId: Int) 31 | 32 | } 33 | 34 | interface Model : IModel { 35 | 36 | fun getCollectList(page: Int): Observable>> 37 | 38 | fun removeCollectArticle(id: Int, originId: Int): Observable> 39 | 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/CommonContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * Created by chenxz on 2018/6/10. 11 | */ 12 | interface CommonContract { 13 | 14 | interface View : IView { 15 | 16 | fun showCollectSuccess(success: Boolean) 17 | 18 | fun showCancelCollectSuccess(success: Boolean) 19 | } 20 | 21 | interface Presenter : IPresenter { 22 | 23 | fun addCollectArticle(id: Int) 24 | 25 | fun cancelCollectArticle(id: Int) 26 | 27 | } 28 | 29 | interface Model : IModel { 30 | 31 | fun addCollectArticle(id: Int): Observable> 32 | 33 | fun cancelCollectArticle(id: Int): Observable> 34 | 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/ContentContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | /** 4 | * Created by chenxz on 2018/6/10. 5 | */ 6 | interface ContentContract { 7 | 8 | interface View : CommonContract.View { 9 | 10 | } 11 | 12 | interface Presenter : CommonContract.Presenter { 13 | 14 | } 15 | 16 | interface Model : CommonContract.Model { 17 | 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/HomeContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.mvp.model.bean.Article 4 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 5 | import com.cxz.wanandroid.mvp.model.bean.Banner 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * Created by chenxz on 2018/4/21. 11 | */ 12 | interface HomeContract { 13 | 14 | interface View : CommonContract.View { 15 | 16 | fun scrollToTop() 17 | 18 | fun setBanner(banners: List) 19 | 20 | fun setArticles(articles: ArticleResponseBody) 21 | 22 | } 23 | 24 | interface Presenter : CommonContract.Presenter { 25 | 26 | fun requestBanner() 27 | 28 | fun requestHomeData() 29 | 30 | fun requestArticles(num: Int) 31 | 32 | } 33 | 34 | interface Model : CommonContract.Model { 35 | 36 | fun requestBanner(): Observable>> 37 | 38 | fun requestTopArticles(): Observable>> 39 | 40 | fun requestArticles(num: Int): Observable> 41 | } 42 | 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/KnowledgeContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 4 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 5 | import io.reactivex.Observable 6 | 7 | /** 8 | * Created by chenxz on 2018/5/12. 9 | */ 10 | interface KnowledgeContract { 11 | 12 | interface View : CommonContract.View { 13 | 14 | fun scrollToTop() 15 | 16 | fun setKnowledgeList(articles: ArticleResponseBody) 17 | 18 | } 19 | 20 | interface Presenter : CommonContract.Presenter { 21 | 22 | fun requestKnowledgeList(page: Int, cid: Int) 23 | 24 | } 25 | 26 | interface Model : CommonContract.Model { 27 | 28 | fun requestKnowledgeList(page: Int, cid: Int): Observable> 29 | 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/KnowledgeTreeContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.KnowledgeTreeBody 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/5/8. 12 | */ 13 | interface KnowledgeTreeContract { 14 | 15 | interface View : IView { 16 | 17 | fun scrollToTop() 18 | 19 | fun setKnowledgeTree(lists: List) 20 | 21 | } 22 | 23 | interface Presenter : IPresenter { 24 | 25 | fun requestKnowledgeTree() 26 | 27 | } 28 | 29 | interface Model : IModel { 30 | 31 | fun requestKnowledgeTree(): Observable>> 32 | 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/LoginContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.LoginData 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/5/27. 12 | */ 13 | interface LoginContract { 14 | 15 | interface View : IView { 16 | 17 | fun loginSuccess(data: LoginData) 18 | 19 | fun loginFail() 20 | 21 | } 22 | 23 | interface Presenter : IPresenter { 24 | 25 | fun loginWanAndroid(username: String, password: String) 26 | 27 | } 28 | 29 | interface Model : IModel { 30 | 31 | fun loginWanAndroid(username: String, password: String): Observable> 32 | 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/MainContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.UserInfoBody 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * @author chenxz 12 | * @date 2018/8/30 13 | * @desc 14 | */ 15 | interface MainContract { 16 | 17 | interface View : IView { 18 | fun showLogoutSuccess(success: Boolean) 19 | fun showUserInfo(bean: UserInfoBody) 20 | } 21 | 22 | interface Presenter : IPresenter { 23 | fun logout() 24 | fun getUserInfo() 25 | } 26 | 27 | interface Model : IModel { 28 | fun logout(): Observable> 29 | fun getUserInfo(): Observable> 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/NavigationContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.NavigationBean 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/5/13. 12 | */ 13 | interface NavigationContract { 14 | 15 | interface View : IView { 16 | fun setNavigationData(list: List) 17 | } 18 | 19 | interface Presenter : IPresenter { 20 | fun requestNavigationList() 21 | } 22 | 23 | interface Model : IModel { 24 | fun requestNavigationList(): Observable>> 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/ProjectContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import com.cxz.wanandroid.mvp.model.bean.ProjectTreeBean 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * Created by chenxz on 2018/5/15. 13 | */ 14 | interface ProjectContract { 15 | 16 | interface View : IView { 17 | 18 | fun scrollToTop() 19 | 20 | fun setProjectTree(list: List) 21 | 22 | } 23 | 24 | interface Presenter : IPresenter { 25 | 26 | fun requestProjectTree() 27 | 28 | } 29 | 30 | interface Model : IModel { 31 | fun requestProjectTree(): Observable>> 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/ProjectListContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 4 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 5 | import io.reactivex.Observable 6 | 7 | /** 8 | * Created by chenxz on 2018/5/20. 9 | */ 10 | interface ProjectListContract { 11 | 12 | interface View : CommonContract.View { 13 | 14 | fun scrollToTop() 15 | 16 | fun setProjectList(articles: ArticleResponseBody) 17 | 18 | } 19 | 20 | interface Presenter : CommonContract.Presenter { 21 | 22 | fun requestProjectList(page: Int, cid: Int) 23 | 24 | } 25 | 26 | interface Model : CommonContract.Model { 27 | 28 | fun requestProjectList(page: Int, cid: Int): Observable> 29 | 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/RankContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.BaseListResponseBody 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import com.cxz.wanandroid.mvp.model.bean.CoinInfoBean 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * @author chenxz 13 | * @date 2019/9/5 14 | * @desc 15 | */ 16 | interface RankContract { 17 | 18 | interface View : IView { 19 | fun showRankList(body: BaseListResponseBody) 20 | } 21 | 22 | interface Presenter : IPresenter { 23 | fun getRankList(page: Int) 24 | } 25 | 26 | interface Model : IModel { 27 | fun getRankList(page: Int): Observable>> 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/RegisterContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.LoginData 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/6/3. 12 | */ 13 | interface RegisterContract { 14 | 15 | interface View : IView { 16 | 17 | fun registerSuccess(data: LoginData) 18 | 19 | fun registerFail() 20 | } 21 | 22 | interface Presenter : IPresenter { 23 | 24 | fun registerWanAndroid(username: String, password: String, repassword: String) 25 | 26 | } 27 | 28 | interface Model : IModel { 29 | fun registerWanAndroid(username: String, password: String, repassword: String): Observable> 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/ScoreContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.BaseListResponseBody 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import com.cxz.wanandroid.mvp.model.bean.UserScoreBean 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * @author chenxz 13 | * @date 2019/9/5 14 | * @desc 15 | */ 16 | interface ScoreContract { 17 | 18 | interface View : IView { 19 | fun showUserScoreList(body: BaseListResponseBody) 20 | } 21 | 22 | interface Presenter : IPresenter { 23 | fun getUserScoreList(page: Int) 24 | } 25 | 26 | interface Model : IModel { 27 | fun getUserScoreList(page: Int): Observable>> 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/SearchContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HotSearchBean 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import com.cxz.wanandroid.mvp.model.bean.SearchHistoryBean 9 | import io.reactivex.Observable 10 | 11 | interface SearchContract { 12 | 13 | interface View : IView { 14 | 15 | fun showHistoryData(historyBeans: MutableList) 16 | 17 | fun showHotSearchData(hotSearchDatas: MutableList) 18 | 19 | } 20 | 21 | interface Presenter : IPresenter { 22 | 23 | fun queryHistory() 24 | 25 | fun saveSearchKey(key: String) 26 | 27 | fun deleteById(id: Long) 28 | 29 | fun clearAllHistory() 30 | 31 | fun getHotSearchData() 32 | 33 | } 34 | 35 | interface Model : IModel { 36 | 37 | fun getHotSearchData(): Observable>> 38 | 39 | } 40 | 41 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/SearchListContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 4 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 5 | import io.reactivex.Observable 6 | 7 | interface SearchListContract { 8 | 9 | interface View : CommonContract.View { 10 | 11 | fun showArticles(articles: ArticleResponseBody) 12 | 13 | fun scrollToTop() 14 | 15 | } 16 | 17 | interface Presenter : CommonContract.Presenter { 18 | 19 | fun queryBySearchKey(page: Int, key: String) 20 | 21 | } 22 | 23 | interface Model : CommonContract.Model { 24 | 25 | fun queryBySearchKey(page: Int, key: String): Observable> 26 | 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/ShareArticleContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2019/11/15 12 | * @desc 13 | */ 14 | interface ShareArticleContract { 15 | 16 | interface View : IView { 17 | fun getArticleTitle(): String 18 | fun getArticleLink(): String 19 | 20 | fun showShareArticle(success: Boolean) 21 | } 22 | 23 | interface Presenter : IPresenter { 24 | fun shareArticle() 25 | } 26 | 27 | interface Model : IModel { 28 | fun shareArticle(map: MutableMap): Observable> 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/ShareContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 4 | import com.cxz.wanandroid.mvp.model.bean.ShareResponseBody 5 | import io.reactivex.Observable 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/15 10 | * @desc 11 | */ 12 | interface ShareContract { 13 | 14 | interface View : CommonContract.View { 15 | fun showShareList(body: ShareResponseBody) 16 | fun showDeleteArticle(success: Boolean) 17 | } 18 | 19 | interface Presenter : CommonContract.Presenter { 20 | fun getShareList(page: Int) 21 | fun deleteShareArticle(id: Int) 22 | } 23 | 24 | interface Model : CommonContract.Model { 25 | fun getShareList(page: Int): Observable> 26 | fun deleteShareArticle(id: Int): Observable> 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/SquareContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 4 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 5 | import io.reactivex.Observable 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/16 10 | * @desc 11 | */ 12 | interface SquareContract { 13 | 14 | interface View : CommonContract.View { 15 | fun scrollToTop() 16 | fun showSquareList(body: ArticleResponseBody) 17 | } 18 | 19 | interface Presenter : CommonContract.Presenter { 20 | fun getSquareList(page: Int) 21 | } 22 | 23 | interface Model : CommonContract.Model { 24 | fun getSquareList(page: Int): Observable> 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/SystemContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/17 10 | * @desc 11 | */ 12 | interface SystemContract { 13 | 14 | interface View : IView { 15 | fun scrollToTop() 16 | } 17 | 18 | interface Presenter : IPresenter { 19 | 20 | } 21 | 22 | interface Model : IModel { 23 | 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/contract/WeChatContract.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.contract 2 | 3 | import com.cxz.wanandroid.base.IModel 4 | import com.cxz.wanandroid.base.IPresenter 5 | import com.cxz.wanandroid.base.IView 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.WXChapterBean 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * @author chenxz 12 | * @date 2018/10/28 13 | * @desc 14 | */ 15 | interface WeChatContract { 16 | 17 | interface View : IView { 18 | 19 | fun scrollToTop() 20 | 21 | fun showWXChapters(chapters: MutableList) 22 | 23 | } 24 | 25 | interface Presenter : IPresenter { 26 | fun getWXChapters() 27 | } 28 | 29 | interface Model : IModel { 30 | fun getWXChapters(): Observable>> 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/AddTodoModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.AddTodoContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * Created by chenxz on 2018/8/11. 11 | */ 12 | class AddTodoModel : BaseModel(), AddTodoContract.Model { 13 | 14 | override fun addTodo(map: MutableMap): Observable> { 15 | return RetrofitHelper.service.addTodo(map) 16 | } 17 | 18 | override fun updateTodo(id: Int, map: MutableMap): Observable> { 19 | return RetrofitHelper.service.updateTodo(id, map) 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/CollectModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.CollectContract 6 | import com.cxz.wanandroid.mvp.model.bean.CollectionArticle 7 | import com.cxz.wanandroid.mvp.model.bean.BaseListResponseBody 8 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * Created by chenxz on 2018/6/9. 13 | */ 14 | class CollectModel : BaseModel(), CollectContract.Model { 15 | 16 | override fun getCollectList(page: Int): Observable>> { 17 | return RetrofitHelper.service.getCollectList(page) 18 | } 19 | 20 | override fun removeCollectArticle(id: Int, originId: Int): Observable> { 21 | return RetrofitHelper.service.removeCollectArticle(id, originId) 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/CommonModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.CommonContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * Created by chenxz on 2018/6/10. 11 | */ 12 | open class CommonModel : BaseModel(), CommonContract.Model { 13 | 14 | override fun addCollectArticle(id: Int): Observable> { 15 | return RetrofitHelper.service.addCollectArticle(id) 16 | } 17 | 18 | override fun cancelCollectArticle(id: Int): Observable> { 19 | return RetrofitHelper.service.cancelCollectArticle(id) 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/ContentModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.mvp.contract.ContentContract 4 | 5 | /** 6 | * Created by chenxz on 2018/6/10. 7 | */ 8 | class ContentModel : CommonModel(), ContentContract.Model { 9 | 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/HomeModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.http.RetrofitHelper 4 | import com.cxz.wanandroid.mvp.contract.HomeContract 5 | import com.cxz.wanandroid.mvp.model.bean.Article 6 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 7 | import com.cxz.wanandroid.mvp.model.bean.Banner 8 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * Created by chenxz on 2018/4/21. 13 | */ 14 | class HomeModel : CommonModel(), HomeContract.Model { 15 | 16 | override fun requestBanner(): Observable>> { 17 | return RetrofitHelper.service.getBanners() 18 | } 19 | 20 | override fun requestTopArticles(): Observable>> { 21 | return RetrofitHelper.service.getTopArticles() 22 | } 23 | 24 | override fun requestArticles(num: Int): Observable> { 25 | return RetrofitHelper.service.getArticles(num) 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/KnowledgeModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.http.RetrofitHelper 4 | import com.cxz.wanandroid.mvp.contract.KnowledgeContract 5 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * Created by chenxz on 2018/5/12. 11 | */ 12 | class KnowledgeModel : CommonModel(), KnowledgeContract.Model { 13 | 14 | override fun requestKnowledgeList(page: Int, cid: Int): Observable> { 15 | return RetrofitHelper.service.getKnowledgeList(page, cid) 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/KnowledgeTreeModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.KnowledgeTreeContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.KnowledgeTreeBody 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/5/8. 12 | */ 13 | class KnowledgeTreeModel : BaseModel(), KnowledgeTreeContract.Model { 14 | 15 | override fun requestKnowledgeTree(): Observable>> { 16 | return RetrofitHelper.service.getKnowledgeTree() 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/LoginModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.LoginContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.LoginData 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/5/27. 12 | */ 13 | class LoginModel : BaseModel(), LoginContract.Model { 14 | 15 | override fun loginWanAndroid(username: String, password: String): Observable> { 16 | return RetrofitHelper.service.loginWanAndroid(username, password) 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/MainModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.MainContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.UserInfoBody 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * @author chenxz 12 | * @date 2018/8/30 13 | * @desc 14 | */ 15 | class MainModel : BaseModel(), MainContract.Model { 16 | 17 | override fun logout(): Observable> { 18 | return RetrofitHelper.service.logout() 19 | } 20 | 21 | override fun getUserInfo(): Observable> { 22 | return RetrofitHelper.service.getUserInfo() 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/NavigationModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.NavigationContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.NavigationBean 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/5/13. 12 | */ 13 | class NavigationModel : BaseModel(), NavigationContract.Model { 14 | 15 | override fun requestNavigationList(): Observable>> { 16 | return RetrofitHelper.service.getNavigationList() 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/ProjectListModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.http.RetrofitHelper 4 | import com.cxz.wanandroid.mvp.contract.ProjectListContract 5 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * Created by chenxz on 2018/5/20. 11 | */ 12 | class ProjectListModel : CommonModel(), ProjectListContract.Model { 13 | 14 | override fun requestProjectList(page: Int, cid: Int): Observable> { 15 | return RetrofitHelper.service.getProjectList(page, cid) 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/ProjectModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.ProjectContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.ProjectTreeBean 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/5/15. 12 | */ 13 | class ProjectModel : BaseModel(), ProjectContract.Model { 14 | 15 | override fun requestProjectTree(): Observable>> { 16 | return RetrofitHelper.service.getProjectTree() 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/RankModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.RankContract 6 | import com.cxz.wanandroid.mvp.model.bean.BaseListResponseBody 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import com.cxz.wanandroid.mvp.model.bean.CoinInfoBean 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * @author chenxz 13 | * @date 2019/9/5 14 | * @desc 15 | */ 16 | class RankModel : BaseModel(), RankContract.Model { 17 | override fun getRankList(page: Int): Observable>> { 18 | return RetrofitHelper.service.getRankList(page) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/RegisterModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.RegisterContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.LoginData 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * Created by chenxz on 2018/6/3. 12 | */ 13 | class RegisterModel : BaseModel(), RegisterContract.Model { 14 | 15 | override fun registerWanAndroid(username: String, password: String, repassword: String): Observable> { 16 | return RetrofitHelper.service.registerWanAndroid(username, password, repassword) 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/ScoreModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.ScoreContract 6 | import com.cxz.wanandroid.mvp.model.bean.BaseListResponseBody 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import com.cxz.wanandroid.mvp.model.bean.UserScoreBean 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * @author chenxz 13 | * @date 2019/9/5 14 | * @desc 15 | */ 16 | class ScoreModel : BaseModel(), ScoreContract.Model { 17 | override fun getUserScoreList(page: Int): Observable>> { 18 | return RetrofitHelper.service.getUserScoreList(page) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/SearchListModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.http.RetrofitHelper 4 | import com.cxz.wanandroid.mvp.contract.SearchListContract 5 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | class SearchListModel : CommonModel(), SearchListContract.Model { 10 | 11 | override fun queryBySearchKey(page: Int, key: String): Observable> { 12 | return RetrofitHelper.service.queryBySearchKey(page, key) 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/SearchModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.SearchContract 6 | import com.cxz.wanandroid.mvp.model.bean.HotSearchBean 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import io.reactivex.Observable 9 | 10 | class SearchModel : BaseModel(), SearchContract.Model { 11 | 12 | override fun getHotSearchData(): Observable>> { 13 | return RetrofitHelper.service.getHotSearchData() 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/ShareArticleModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.ShareArticleContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2019/11/15 12 | * @desc 13 | */ 14 | class ShareArticleModel : BaseModel(), ShareArticleContract.Model { 15 | override fun shareArticle(map: MutableMap): Observable> { 16 | return RetrofitHelper.service.shareArticle(map) 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/ShareModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.http.RetrofitHelper 4 | import com.cxz.wanandroid.mvp.contract.ShareContract 5 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 6 | import com.cxz.wanandroid.mvp.model.bean.ShareResponseBody 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2019/11/15 12 | * @desc 13 | */ 14 | class ShareModel : CommonModel(), ShareContract.Model { 15 | override fun getShareList(page: Int): Observable> { 16 | return RetrofitHelper.service.getShareList(page) 17 | } 18 | 19 | override fun deleteShareArticle(id: Int): Observable> { 20 | return RetrofitHelper.service.deleteShareArticle(id) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/SquareModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.http.RetrofitHelper 4 | import com.cxz.wanandroid.mvp.contract.SquareContract 5 | import com.cxz.wanandroid.mvp.model.bean.ArticleResponseBody 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import io.reactivex.Observable 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2019/11/16 12 | * @desc 13 | */ 14 | class SquareModel : CommonModel(), SquareContract.Model { 15 | override fun getSquareList(page: Int): Observable> { 16 | return RetrofitHelper.service.getSquareList(page) 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/SystemModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.mvp.contract.SystemContract 5 | 6 | /** 7 | * @author chenxz 8 | * @date 2019/11/17 9 | * @desc 10 | */ 11 | class SystemModel : BaseModel(), SystemContract.Model { 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/TodoModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.TodoContract 6 | import com.cxz.wanandroid.mvp.model.bean.AllTodoResponseBody 7 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 8 | import com.cxz.wanandroid.mvp.model.bean.TodoResponseBody 9 | import io.reactivex.Observable 10 | 11 | /** 12 | * Created by chenxz on 2018/8/7. 13 | */ 14 | class TodoModel : BaseModel(), TodoContract.Model { 15 | 16 | override fun getTodoList(type: Int): Observable> { 17 | return RetrofitHelper.service.getTodoList(type) 18 | } 19 | 20 | override fun getNoTodoList(page: Int, type: Int): Observable> { 21 | return RetrofitHelper.service.getNoTodoList(page, type) 22 | } 23 | 24 | override fun getDoneList(page: Int, type: Int): Observable> { 25 | return RetrofitHelper.service.getDoneList(page, type) 26 | } 27 | 28 | override fun deleteTodoById(id: Int): Observable> { 29 | return RetrofitHelper.service.deleteTodoById(id) 30 | } 31 | 32 | override fun updateTodoById(id: Int, status: Int): Observable> { 33 | return RetrofitHelper.service.updateTodoById(id, status) 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/WeChatModel.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model 2 | 3 | import com.cxz.wanandroid.base.BaseModel 4 | import com.cxz.wanandroid.http.RetrofitHelper 5 | import com.cxz.wanandroid.mvp.contract.WeChatContract 6 | import com.cxz.wanandroid.mvp.model.bean.HttpResult 7 | import com.cxz.wanandroid.mvp.model.bean.WXChapterBean 8 | import io.reactivex.Observable 9 | 10 | /** 11 | * @author chenxz 12 | * @date 2018/10/28 13 | * @desc 14 | */ 15 | class WeChatModel : BaseModel(), WeChatContract.Model { 16 | 17 | override fun getWXChapters(): Observable>> { 18 | return RetrofitHelper.service.getWXChapters() 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/bean/BaseBean.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model.bean 2 | 3 | /** 4 | * @author admin 5 | * @date 2018/11/21 6 | * @desc 7 | */ 8 | open class BaseBean { 9 | var errorCode: Int = 0 10 | var errorMsg: String = "" 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/model/bean/TodoDataBean.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.model.bean 2 | 3 | import com.chad.library.adapter.base.entity.SectionEntity 4 | 5 | /** 6 | * Created by chenxz on 2018/8/11. 7 | */ 8 | class TodoDataBean(var headerName: String = "", var todoBean: TodoBean? = null) : SectionEntity { 9 | 10 | override val isHeader: Boolean 11 | get() = headerName.isNotEmpty() 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/CollectPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.CollectContract 6 | import com.cxz.wanandroid.mvp.model.CollectModel 7 | 8 | /** 9 | * Created by chenxz on 2018/6/9. 10 | */ 11 | class CollectPresenter : BasePresenter(), CollectContract.Presenter { 12 | 13 | override fun createModel(): CollectContract.Model? = CollectModel() 14 | 15 | override fun getCollectList(page: Int) { 16 | mModel?.getCollectList(page)?.ss(mModel, mView, page == 0) { 17 | mView?.setCollectList(it.data) 18 | } 19 | } 20 | 21 | override fun removeCollectArticle(id: Int, originId: Int) { 22 | mModel?.removeCollectArticle(id, originId)?.ss(mModel, mView) { 23 | mView?.showRemoveCollectSuccess(true) 24 | } 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/CommonPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.CommonContract 6 | 7 | /** 8 | * Created by chenxz on 2018/6/10. 9 | */ 10 | open class CommonPresenter 11 | : BasePresenter(), CommonContract.Presenter { 12 | 13 | override fun addCollectArticle(id: Int) { 14 | mModel?.addCollectArticle(id)?.ss(mModel, mView) { 15 | mView?.showCollectSuccess(true) 16 | } 17 | } 18 | 19 | override fun cancelCollectArticle(id: Int) { 20 | mModel?.cancelCollectArticle(id)?.ss(mModel, mView) { 21 | mView?.showCancelCollectSuccess(true) 22 | } 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/ContentPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.mvp.contract.ContentContract 4 | import com.cxz.wanandroid.mvp.model.ContentModel 5 | 6 | /** 7 | * Created by chenxz on 2018/6/10. 8 | */ 9 | class ContentPresenter : CommonPresenter(), ContentContract.Presenter { 10 | 11 | override fun createModel(): ContentContract.Model? = ContentModel() 12 | 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/KnowledgePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.ext.ss 4 | import com.cxz.wanandroid.mvp.contract.KnowledgeContract 5 | import com.cxz.wanandroid.mvp.model.KnowledgeModel 6 | 7 | /** 8 | * Created by chenxz on 2018/5/12. 9 | */ 10 | class KnowledgePresenter : CommonPresenter(), KnowledgeContract.Presenter { 11 | 12 | override fun createModel(): KnowledgeContract.Model? = KnowledgeModel() 13 | 14 | override fun requestKnowledgeList(page: Int, cid: Int) { 15 | mModel?.requestKnowledgeList(page, cid)?.ss(mModel, mView) { 16 | mView?.setKnowledgeList(it.data) 17 | } 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/KnowledgeTreePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.KnowledgeTreeContract 6 | import com.cxz.wanandroid.mvp.model.KnowledgeTreeModel 7 | 8 | /** 9 | * Created by chenxz on 2018/5/8. 10 | */ 11 | class KnowledgeTreePresenter : BasePresenter(), KnowledgeTreeContract.Presenter { 12 | 13 | override fun createModel(): KnowledgeTreeContract.Model? = KnowledgeTreeModel() 14 | 15 | override fun requestKnowledgeTree() { 16 | mModel?.requestKnowledgeTree()?.ss(mModel, mView) { 17 | mView?.setKnowledgeTree(it.data) 18 | } 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/LoginPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.LoginContract 6 | import com.cxz.wanandroid.mvp.model.LoginModel 7 | 8 | /** 9 | * Created by chenxz on 2018/5/27. 10 | */ 11 | class LoginPresenter : BasePresenter(), LoginContract.Presenter { 12 | 13 | override fun createModel(): LoginContract.Model? = LoginModel() 14 | 15 | override fun loginWanAndroid(username: String, password: String) { 16 | mModel?.loginWanAndroid(username, password)?.ss(mModel, mView) { 17 | mView?.loginSuccess(it.data) 18 | } 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/MainPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.ext.sss 6 | import com.cxz.wanandroid.mvp.contract.MainContract 7 | import com.cxz.wanandroid.mvp.model.MainModel 8 | 9 | /** 10 | * @author chenxz 11 | * @date 2018/8/30 12 | * @desc 13 | */ 14 | class MainPresenter : BasePresenter(), MainContract.Presenter { 15 | 16 | override fun createModel(): MainContract.Model? = MainModel() 17 | 18 | override fun logout() { 19 | mModel?.logout()?.ss(mModel, mView) { 20 | mView?.showLogoutSuccess(success = true) 21 | } 22 | } 23 | 24 | override fun getUserInfo() { 25 | mModel?.getUserInfo()?.sss(mView, false, { 26 | mView?.showUserInfo(it.data) 27 | }, {}) 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/NavigationPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.NavigationContract 6 | import com.cxz.wanandroid.mvp.model.NavigationModel 7 | 8 | /** 9 | * Created by chenxz on 2018/5/13. 10 | */ 11 | class NavigationPresenter : BasePresenter(), NavigationContract.Presenter { 12 | 13 | override fun createModel(): NavigationContract.Model? = NavigationModel() 14 | 15 | override fun requestNavigationList() { 16 | mModel?.requestNavigationList()?.ss(mModel, mView) { 17 | mView?.setNavigationData(it.data) 18 | } 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/ProjectListPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.ext.ss 4 | import com.cxz.wanandroid.mvp.contract.ProjectListContract 5 | import com.cxz.wanandroid.mvp.model.ProjectListModel 6 | 7 | /** 8 | * Created by chenxz on 2018/5/20. 9 | */ 10 | class ProjectListPresenter : CommonPresenter(), ProjectListContract.Presenter { 11 | 12 | override fun createModel(): ProjectListContract.Model? = ProjectListModel() 13 | 14 | override fun requestProjectList(page: Int, cid: Int) { 15 | mModel?.requestProjectList(page, cid)?.ss(mModel, mView, page == 1) { 16 | mView?.setProjectList(it.data) 17 | } 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/ProjectPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.ProjectContract 6 | import com.cxz.wanandroid.mvp.model.ProjectModel 7 | 8 | /** 9 | * Created by chenxz on 2018/5/15. 10 | */ 11 | class ProjectPresenter : BasePresenter(), ProjectContract.Presenter { 12 | 13 | override fun createModel(): ProjectContract.Model? = ProjectModel() 14 | 15 | override fun requestProjectTree() { 16 | mModel?.requestProjectTree()?.ss(mModel, mView) { 17 | mView?.setProjectTree(it.data) 18 | } 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/RankPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.RankContract 6 | import com.cxz.wanandroid.mvp.model.RankModel 7 | 8 | /** 9 | * @author chenxz 10 | * @date 2019/9/5 11 | * @desc 12 | */ 13 | class RankPresenter : BasePresenter(), RankContract.Presenter { 14 | 15 | override fun createModel(): RankContract.Model? = RankModel() 16 | 17 | override fun getRankList(page: Int) { 18 | mModel?.getRankList(page)?.ss(mModel, mView) { 19 | mView?.showRankList(it.data) 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/RegisterPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.RegisterContract 6 | import com.cxz.wanandroid.mvp.model.RegisterModel 7 | 8 | /** 9 | * Created by chenxz on 2018/6/3. 10 | */ 11 | class RegisterPresenter : BasePresenter(), RegisterContract.Presenter { 12 | 13 | override fun createModel(): RegisterContract.Model? = RegisterModel() 14 | 15 | override fun registerWanAndroid(username: String, password: String, repassword: String) { 16 | mModel?.registerWanAndroid(username, password, repassword)?.ss(mModel, mView) { 17 | mView?.apply { 18 | if (it.errorCode != 0) { 19 | registerFail() 20 | } else { 21 | registerSuccess(it.data) 22 | } 23 | } 24 | } 25 | } 26 | 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/ScorePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.ScoreContract 6 | import com.cxz.wanandroid.mvp.model.ScoreModel 7 | 8 | /** 9 | * @author chenxz 10 | * @date 2019/9/5 11 | * @desc 12 | */ 13 | class ScorePresenter : BasePresenter(), ScoreContract.Presenter { 14 | 15 | override fun createModel(): ScoreContract.Model? = ScoreModel() 16 | 17 | override fun getUserScoreList(page: Int) { 18 | mModel?.getUserScoreList(page)?.ss(mModel, mView) { 19 | mView?.showUserScoreList(it.data) 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/SearchListPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.ext.ss 4 | import com.cxz.wanandroid.mvp.contract.SearchListContract 5 | import com.cxz.wanandroid.mvp.model.SearchListModel 6 | 7 | class SearchListPresenter : CommonPresenter(), SearchListContract.Presenter { 8 | 9 | override fun createModel(): SearchListContract.Model? = SearchListModel() 10 | 11 | override fun queryBySearchKey(page: Int, key: String) { 12 | mModel?.queryBySearchKey(page, key)?.ss(mModel, mView, page == 0) { 13 | mView?.showArticles(it.data) 14 | } 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/ShareArticlePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.ShareArticleContract 6 | import com.cxz.wanandroid.mvp.model.ShareArticleModel 7 | 8 | /** 9 | * @author chenxz 10 | * @date 2019/11/16 11 | * @desc 12 | */ 13 | class ShareArticlePresenter : BasePresenter(), ShareArticleContract.Presenter { 14 | 15 | override fun createModel(): ShareArticleModel? = ShareArticleModel() 16 | 17 | override fun shareArticle() { 18 | val title = mView?.getArticleTitle().toString() 19 | val link = mView?.getArticleLink().toString() 20 | 21 | if (title.isEmpty()) { 22 | mView?.showMsg("文章标题不能为空") 23 | return 24 | } 25 | if (link.isEmpty()) { 26 | mView?.showMsg("文章链接不能为空") 27 | return 28 | } 29 | val map = mutableMapOf() 30 | map["title"] = title 31 | map["link"] = link 32 | mModel?.shareArticle(map)?.ss(mModel, mView, true) { 33 | mView?.showShareArticle(true) 34 | } 35 | 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/SharePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.ext.ss 4 | import com.cxz.wanandroid.mvp.contract.ShareContract 5 | import com.cxz.wanandroid.mvp.model.ShareModel 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/15 10 | * @desc 11 | */ 12 | class SharePresenter : CommonPresenter(), ShareContract.Presenter { 13 | 14 | override fun createModel(): ShareModel? = ShareModel() 15 | 16 | override fun getShareList(page: Int) { 17 | mModel?.getShareList(page)?.ss(mModel, mView, page == 1) { 18 | mView?.showShareList(it.data) 19 | } 20 | } 21 | 22 | override fun deleteShareArticle(id: Int) { 23 | mModel?.deleteShareArticle(id)?.ss(mModel, mView, true) { 24 | mView?.showDeleteArticle(true) 25 | } 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/SquarePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.ext.ss 4 | import com.cxz.wanandroid.mvp.contract.SquareContract 5 | import com.cxz.wanandroid.mvp.model.SquareModel 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/16 10 | * @desc 11 | */ 12 | class SquarePresenter : CommonPresenter(), SquareContract.Presenter { 13 | 14 | override fun createModel(): SquareModel? = SquareModel() 15 | 16 | override fun getSquareList(page: Int) { 17 | mModel?.getSquareList(page)?.ss(mModel, mView, page == 0) { 18 | mView?.showSquareList(it.data) 19 | } 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/SystemPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.mvp.contract.SystemContract 5 | import com.cxz.wanandroid.mvp.model.SystemModel 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/17 10 | * @desc 11 | */ 12 | class SystemPresenter : BasePresenter(), 13 | SystemContract.Presenter { 14 | 15 | override fun createModel(): SystemModel? = SystemModel() 16 | 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/TodoPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.TodoContract 6 | import com.cxz.wanandroid.mvp.model.TodoModel 7 | 8 | /** 9 | * Created by chenxz on 2018/8/7. 10 | */ 11 | class TodoPresenter : BasePresenter(), TodoContract.Presenter { 12 | 13 | override fun createModel(): TodoContract.Model? = TodoModel() 14 | 15 | override fun getAllTodoList(type: Int) { 16 | mModel?.getTodoList(type)?.ss(mModel, mView) { 17 | 18 | } 19 | } 20 | 21 | override fun getNoTodoList(page: Int, type: Int) { 22 | mModel?.getNoTodoList(page, type)?.ss(mModel, mView, page == 1) { 23 | mView?.showNoTodoList(it.data) 24 | } 25 | } 26 | 27 | override fun getDoneList(page: Int, type: Int) { 28 | mModel?.getDoneList(page, type)?.ss(mModel, mView, page == 1) { 29 | mView?.showNoTodoList(it.data) 30 | } 31 | } 32 | 33 | override fun deleteTodoById(id: Int) { 34 | mModel?.deleteTodoById(id)?.ss(mModel, mView) { 35 | mView?.showDeleteSuccess(true) 36 | } 37 | } 38 | 39 | override fun updateTodoById(id: Int, status: Int) { 40 | mModel?.updateTodoById(id, status)?.ss(mModel, mView) { 41 | mView?.showUpdateSuccess(true) 42 | } 43 | } 44 | 45 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/mvp/presenter/WeChatPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.mvp.presenter 2 | 3 | import com.cxz.wanandroid.base.BasePresenter 4 | import com.cxz.wanandroid.ext.ss 5 | import com.cxz.wanandroid.mvp.contract.WeChatContract 6 | import com.cxz.wanandroid.mvp.model.WeChatModel 7 | 8 | /** 9 | * @author chenxz 10 | * @date 2018/10/28 11 | * @desc 12 | */ 13 | class WeChatPresenter : BasePresenter(), WeChatContract.Presenter { 14 | 15 | override fun createModel(): WeChatContract.Model? = WeChatModel() 16 | 17 | override fun getWXChapters() { 18 | mModel?.getWXChapters()?.ss(mModel, mView) { 19 | mView?.showWXChapters(it.data) 20 | } 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/receiver/NetworkChangeReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.receiver 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.cxz.wanandroid.constant.Constant 7 | import com.cxz.wanandroid.event.NetworkChangeEvent 8 | import com.cxz.wanandroid.utils.NetWorkUtil 9 | import com.cxz.wanandroid.utils.Preference 10 | import org.greenrobot.eventbus.EventBus 11 | 12 | /** 13 | * Created by chenxz on 2018/8/1. 14 | */ 15 | class NetworkChangeReceiver : BroadcastReceiver() { 16 | 17 | /** 18 | * 缓存上一次的网络状态 19 | */ 20 | private var hasNetwork: Boolean by Preference(Constant.HAS_NETWORK_KEY, true) 21 | 22 | override fun onReceive(context: Context, intent: Intent) { 23 | val isConnected = NetWorkUtil.isNetworkConnected(context) 24 | if (isConnected) { 25 | if (isConnected != hasNetwork) { 26 | EventBus.getDefault().post(NetworkChangeEvent(isConnected)) 27 | } 28 | } else { 29 | EventBus.getDefault().post(NetworkChangeEvent(isConnected)) 30 | } 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/rx/SchedulerUtils.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.rx 2 | 3 | import com.cxz.wanandroid.rx.scheduler.IoMainScheduler 4 | 5 | /** 6 | * Created by chenxz on 2018/4/21. 7 | */ 8 | object SchedulerUtils { 9 | 10 | fun ioToMain(): IoMainScheduler { 11 | return IoMainScheduler() 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/rx/scheduler/BaseScheduler.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.rx.scheduler 2 | 3 | import io.reactivex.* 4 | import org.reactivestreams.Publisher 5 | 6 | /** 7 | * Created by chenxz on 2018/4/21. 8 | */ 9 | abstract class BaseScheduler protected constructor(private val subscribeOnScheduler: Scheduler, 10 | private val observeOnScheduler: Scheduler) : ObservableTransformer, 11 | SingleTransformer, 12 | MaybeTransformer, 13 | CompletableTransformer, 14 | FlowableTransformer { 15 | 16 | override fun apply(upstream: Completable): CompletableSource { 17 | return upstream.subscribeOn(subscribeOnScheduler) 18 | .observeOn(observeOnScheduler) 19 | } 20 | 21 | override fun apply(upstream: Flowable): Publisher { 22 | return upstream.subscribeOn(subscribeOnScheduler) 23 | .observeOn(observeOnScheduler) 24 | } 25 | 26 | override fun apply(upstream: Maybe): MaybeSource { 27 | return upstream.subscribeOn(subscribeOnScheduler) 28 | .observeOn(observeOnScheduler) 29 | } 30 | 31 | override fun apply(upstream: Observable): ObservableSource { 32 | return upstream.subscribeOn(subscribeOnScheduler) 33 | .observeOn(observeOnScheduler) 34 | } 35 | 36 | override fun apply(upstream: Single): SingleSource { 37 | return upstream.subscribeOn(subscribeOnScheduler) 38 | .observeOn(observeOnScheduler) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/rx/scheduler/ComputationMainScheduler.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.rx.scheduler 2 | 3 | import io.reactivex.android.schedulers.AndroidSchedulers 4 | import io.reactivex.schedulers.Schedulers 5 | 6 | /** 7 | * Created by chenxz on 2018/4/21. 8 | */ 9 | class ComputationMainScheduler private constructor() : BaseScheduler(Schedulers.computation(), AndroidSchedulers.mainThread()) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/rx/scheduler/IoMainScheduler.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.rx.scheduler 2 | 3 | import io.reactivex.android.schedulers.AndroidSchedulers 4 | import io.reactivex.schedulers.Schedulers 5 | 6 | /** 7 | * Created by chenxz on 2018/4/21. 8 | */ 9 | class IoMainScheduler : BaseScheduler(Schedulers.io(), AndroidSchedulers.mainThread()) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/rx/scheduler/NewThreadMainScheduler.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.rx.scheduler 2 | 3 | import io.reactivex.android.schedulers.AndroidSchedulers 4 | import io.reactivex.schedulers.Schedulers 5 | 6 | /** 7 | * Created by chenxz on 2018/4/21. 8 | */ 9 | class NewThreadMainScheduler private constructor() : BaseScheduler(Schedulers.newThread(), AndroidSchedulers.mainThread()) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/rx/scheduler/SingleMainScheduler.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.rx.scheduler 2 | 3 | import io.reactivex.android.schedulers.AndroidSchedulers 4 | import io.reactivex.schedulers.Schedulers 5 | 6 | /** 7 | * Created by chenxz on 2018/4/21. 8 | */ 9 | class SingleMainScheduler private constructor() : BaseScheduler(Schedulers.single(), AndroidSchedulers.mainThread()) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/rx/scheduler/TrampolineMainScheduler.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.rx.scheduler 2 | 3 | import io.reactivex.android.schedulers.AndroidSchedulers 4 | import io.reactivex.schedulers.Schedulers 5 | 6 | /** 7 | * Created by chenxz on 2018/4/21. 8 | */ 9 | class TrampolineMainScheduler private constructor() : BaseScheduler(Schedulers.trampoline(), AndroidSchedulers.mainThread()) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/ui/fragment/QrCodeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.ui.fragment 2 | 3 | import android.view.View 4 | import com.cxz.wanandroid.R 5 | import com.cxz.wanandroid.base.BaseFragment 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/17 10 | * @desc 扫码下载 11 | */ 12 | class QrCodeFragment : BaseFragment() { 13 | 14 | companion object { 15 | fun getInstance(): QrCodeFragment = QrCodeFragment() 16 | } 17 | 18 | override fun attachLayoutRes(): Int = R.layout.fragment_qr_code 19 | 20 | override fun initView(view: View) { 21 | } 22 | 23 | override fun lazyLoad() { 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/ui/fragment/SettingFragment.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.ui.fragment 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import com.cxz.wanandroid.R 6 | import com.cxz.wanandroid.base.BaseFragment 7 | 8 | /** 9 | * Created by chenxz on 2018/6/10. 10 | */ 11 | class SettingFragment : BaseFragment() { 12 | 13 | companion object { 14 | fun getInstance(bundle: Bundle): SettingFragment { 15 | val fragment = SettingFragment() 16 | fragment.arguments = bundle 17 | return fragment 18 | } 19 | } 20 | 21 | override fun attachLayoutRes(): Int = R.layout.fragment_setting 22 | 23 | override fun initView(view: View) { 24 | } 25 | 26 | override fun lazyLoad() { 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/utils/ImageLoader.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.utils 2 | 3 | import android.content.Context 4 | import android.widget.ImageView 5 | import com.bumptech.glide.Glide 6 | import com.bumptech.glide.load.engine.DiskCacheStrategy 7 | import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions 8 | import com.bumptech.glide.request.RequestOptions 9 | import com.cxz.wanandroid.R 10 | import com.cxz.wanandroid.app.App 11 | 12 | /** 13 | * Created by chenxz on 2018/6/12. 14 | */ 15 | object ImageLoader { 16 | 17 | // 1.开启无图模式 2.非WiFi环境 不加载图片 18 | private val isLoadImage = !SettingUtil.getIsNoPhotoMode() || NetWorkUtil.isWifi(App.context) 19 | 20 | /** 21 | * 加载图片 22 | * @param context 23 | * @param url 24 | * @param iv 25 | */ 26 | fun load(context: Context?, url: String?, iv: ImageView?) { 27 | if (isLoadImage) { 28 | iv?.apply { 29 | Glide.with(context!!).clear(iv) 30 | val options = RequestOptions() 31 | .diskCacheStrategy(DiskCacheStrategy.DATA) 32 | .placeholder(R.drawable.bg_placeholder) 33 | Glide.with(context!!) 34 | .load(url) 35 | .transition(DrawableTransitionOptions().crossFade()) 36 | .apply(options) 37 | .into(iv) 38 | } 39 | } 40 | 41 | } 42 | 43 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/utils/StringUtil.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.utils 2 | 3 | import java.io.BufferedReader 4 | import java.io.InputStream 5 | import java.io.InputStreamReader 6 | 7 | /** 8 | * @author chenxz 9 | * @date 2019/11/24 10 | * @desc StringUtil 11 | */ 12 | object StringUtil { 13 | 14 | fun getString(stream: InputStream): String { 15 | val reader = BufferedReader(InputStreamReader(stream, "utf-8")) 16 | val sb = StringBuilder() 17 | var s: String? = reader.readLine() 18 | while (s != null) { 19 | sb.append(s).append("\n") 20 | s = reader.readLine() 21 | } 22 | return sb.toString() 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/utils/Wget.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.utils 2 | 3 | import okhttp3.OkHttpClient 4 | import okhttp3.Request 5 | 6 | object Wget { 7 | 8 | fun get(url: String): String { 9 | val client = OkHttpClient.Builder() 10 | .build() 11 | val request = Request.Builder() 12 | .url(url) 13 | .header("user-agent", 14 | "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3887.7 Mobile Safari/537.36") 15 | .build() 16 | val response = client.newCall(request).execute() 17 | return response.body()?.string() ?: "" 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/webclient/WebClientFactory.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.webclient 2 | 3 | import android.webkit.WebViewClient 4 | 5 | /** 6 | * @author chenxz 7 | * @date 2019/11/24 8 | * @desc WebClientFactory 9 | */ 10 | object WebClientFactory { 11 | 12 | val JIAN_SHU = "https://www.jianshu.com" 13 | 14 | fun create(url: String): WebViewClient { 15 | return when { 16 | url.startsWith(JIAN_SHU) -> JianShuWebClient() 17 | else -> BaseWebClient() 18 | } 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/widget/CustomToast.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.widget 2 | 3 | import android.content.Context 4 | import android.view.Gravity 5 | import android.view.View 6 | import android.widget.TextView 7 | import android.widget.Toast 8 | import com.cxz.wanandroid.R 9 | 10 | /** 11 | * Created by chenxz on 2018/6/9. 12 | * 自定义Toast 13 | */ 14 | class CustomToast { 15 | 16 | private var toast: Toast? = null 17 | private var textView: TextView? = null 18 | 19 | constructor(context: Context?, message: String) : this(context, message, Toast.LENGTH_SHORT) 20 | 21 | constructor(context: Context?, message: String, duration: Int) { 22 | toast = Toast(context) 23 | toast?.duration = duration 24 | val view = View.inflate(context, R.layout.toast_custom, null) 25 | textView = view.findViewById(R.id.tv_prompt) 26 | textView?.text = message 27 | toast?.view = view 28 | toast?.setGravity(Gravity.CENTER, 0, 0) 29 | } 30 | 31 | fun show() { 32 | toast?.show() 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/widget/IconPreference.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.widget 2 | 3 | import android.content.Context 4 | import android.preference.Preference 5 | import android.util.AttributeSet 6 | import android.view.View 7 | import com.afollestad.materialdialogs.color.CircleView 8 | import com.cxz.wanandroid.R 9 | import com.cxz.wanandroid.utils.SettingUtil 10 | 11 | /** 12 | * Created by chenxz on 2018/6/13. 13 | */ 14 | class IconPreference(context: Context, attrs: AttributeSet) : Preference(context, attrs) { 15 | 16 | private var circleImageView: CircleView? = null 17 | 18 | init { 19 | 20 | widgetLayoutResource = R.layout.item_icon_preference_preview 21 | } 22 | 23 | override fun onBindView(view: View) { 24 | super.onBindView(view) 25 | val color = SettingUtil.getColor() 26 | circleImageView = view.findViewById(R.id.iv_preview) 27 | circleImageView!!.setBackgroundColor(color) 28 | } 29 | 30 | fun setView() { 31 | val color = SettingUtil.getColor() 32 | circleImageView!!.setBackgroundColor(color) 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/widget/WebContainer.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.widget 2 | 3 | import android.content.Context 4 | import android.graphics.Canvas 5 | import android.graphics.Color 6 | import android.util.AttributeSet 7 | import androidx.coordinatorlayout.widget.CoordinatorLayout 8 | import androidx.core.content.ContextCompat 9 | import com.cxz.wanandroid.R 10 | import com.cxz.wanandroid.utils.ColorUtil 11 | import com.cxz.wanandroid.utils.SettingUtil 12 | 13 | /** 14 | * @author chenxz 15 | * @date 2019/11/24 16 | * @desc WebContainer 17 | */ 18 | class WebContainer : CoordinatorLayout { 19 | 20 | private var mDarkTheme: Boolean = false 21 | 22 | private var mMaskColor = Color.TRANSPARENT 23 | 24 | init { 25 | mDarkTheme = SettingUtil.getIsNightMode() 26 | if (mDarkTheme) { 27 | mMaskColor = ColorUtil.alphaColor(ContextCompat.getColor(getContext(), R.color.mask_color), 0.6f) 28 | } 29 | } 30 | 31 | constructor(context: Context) : super(context) 32 | 33 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) 34 | 35 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) 36 | 37 | override fun dispatchDraw(canvas: Canvas) { 38 | super.dispatchDraw(canvas) 39 | if (mDarkTheme) { 40 | canvas.drawColor(mMaskColor) 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/cxz/wanandroid/widget/helper/BottomNavigationViewHelper.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid.widget.helper 2 | 3 | import android.annotation.SuppressLint 4 | import android.util.Log 5 | import com.google.android.material.bottomnavigation.BottomNavigationItemView 6 | import com.google.android.material.bottomnavigation.BottomNavigationMenuView 7 | import com.google.android.material.bottomnavigation.BottomNavigationView 8 | 9 | /** 10 | * Created by chenxz on 2018/6/10. 11 | */ 12 | object BottomNavigationViewHelper { 13 | 14 | @SuppressLint("RestrictedApi") 15 | fun disableShiftMode(view: BottomNavigationView) { 16 | val menuView = view.getChildAt(0) as BottomNavigationMenuView 17 | try { 18 | val shiftingMode = menuView.javaClass.getDeclaredField("mShiftingMode") 19 | shiftingMode.isAccessible = true 20 | shiftingMode.setBoolean(menuView, false) 21 | shiftingMode.isAccessible = false 22 | for (i in 0 until menuView.childCount) { 23 | val item = menuView.getChildAt(i) as BottomNavigationItemView 24 | 25 | // item.setShiftingMode(false) 26 | // set once again checked value, so view will be updated 27 | 28 | item.setChecked(item.itemData.isChecked) 29 | } 30 | } catch (e: NoSuchFieldException) { 31 | Log.e("BNVHelper", "Unable to get shift mode field", e) 32 | } catch (e: IllegalAccessException) { 33 | Log.e("BNVHelper", "Unable to change value of shift mode", e) 34 | } 35 | 36 | } 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/jump_from_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/anim/jump_to_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/anim/push_up_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/push_up_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/item_flow_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/search_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/placeholder_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/drawable-v24/placeholder_banner.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_done.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_fresh.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_logo.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_placeholder.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_tag_one.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_toast_custom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_upgrade_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_login_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fab_label_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_about_us_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_action_share.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_action_white_like.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_24dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apps_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_right_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_upward_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back_press.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_grey_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_done_24dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_like.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_like_not.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logout_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_navigation_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_night_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_night_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_project_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rank_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_switch_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_todo_24dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/item_flow_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nav_item_color_state.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_back_arrow_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_common.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_rank.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_share.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/container.xml: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/flow_layout_tv.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_collect.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_empty_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_project.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 24 | 25 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_qr_code.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 19 | 20 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_refresh_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 19 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_score.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_search_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_setting.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_square.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_system.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_todo.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_wechat.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 24 | 25 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_home_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_icon_listpreference.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_icon_listpreference_preview.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_icon_preference_preview.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_navigation_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_socre_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 26 | 27 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_sticky_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_todo_popup_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_empty_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_error_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_loading_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_network_tip.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_network_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_popup_todo.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/search_empty_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toast_custom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_navigation_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 16 | 22 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_navigation_todo.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 18 | 19 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_score.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_share.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_share_article.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_square.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_todo.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_type_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_default_avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-hdpi/ic_default_avatar.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_action_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/ic_action_clear.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/ic_empty.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/ic_error.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_upgrade_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/ic_upgrade_top.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxhdpi/qr_code.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #35464e 4 | #212a2f 5 | @color/Cyan 6 | #616161 7 | @color/Grey800 8 | @color/Grey900 9 | @color/Grey700 10 | @color/Grey600 11 | #111111 12 | 13 | @color/Grey300 14 | @color/Grey300 15 | @color/Grey500 16 | @color/Grey500 17 | @color/Grey500 18 | @color/Grey500 19 | @color/Grey500 20 | @color/Grey500 21 | @color/Grey800 22 | @color/Grey600 23 | @color/Grey700 24 | @color/Grey400 25 | #515151 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/values-v19/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 原形 6 | 矩形 7 | 方形 8 | 9 | 10 | 11 | 0 12 | 1 13 | 2 14 | 15 | 16 | 17 | ic_launcher 18 | ic_launcher_round 19 | ic_launcher_round 20 | 21 | 22 | 23 | 24 | 25 | 26 | 禁用 27 | 边缘触发 28 | 全屏触发 29 | 30 | 31 | 32 | 0 33 | 1 34 | 2 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/notranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 网站内容 5 |

\t\t本网站每天新增20~30篇优质文章,并加入到现有分类中,力求整理出一份优质而又详尽的知识体系,闲暇时间不妨上来学习下知识;除此以外,并为大家提供平时开发过程中常用的工具以及常用的网址导航。

6 |

\t\t当然这只是我们目前的功能,未来我们将提供更多更加便捷的功能…

7 |

\t\t如果您有任何好的建议:

8 |
\t\t\t\t关于网站排版 9 |
\t\t\t\t关于新增常用网址以及工具 10 |
\t\t\t\t未来你希望增加的功能等 11 |

\t\t可以在 https://github.com/hongyangAndroid/xueandroid 项目中以issue的形式提出,我将及时跟进。

12 |

\t\t如果您希望长期关注本站,可以加入我们的QQ群:591683946

13 |

源码位置

14 |

\t\t本软件开源,如果你发现任何错误,不要犹豫,马上点击GitHub,在上面发起issue或者提交pull request

15 | ]]>
16 | 17 | 18 | 本APP所使用的所有API均由 玩Android 网站提供,仅供学习交流,不可用于任何商业用途。 19 | 20 | ---- 21 | -- 22 | 23 | 1. 只要是任何好文都可以分享哈,并不一定要是原创!投递的文章会进入广场 tab; 24 | \n2. CSDN,掘金,简书等官方博客站点会直接通过,不需要审核; 25 | \n3. 其他个人站点会进入审核阶段,不要投递任何无效链接,测试的请尽快删除,否则可能会对你的账号产生一定影响; 26 | \n4. 目前处于测试阶段,如果你发现500等错误,可以向我提交日志,让我们一起使网站变得更好。 27 | \n5. 由于本站只有我一个人开发与维护,会尽力保证24小时内审核,当然有可能哪天太累,会延期,请保持佛系... 28 | 29 |
-------------------------------------------------------------------------------- /app/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | 23 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/xml/pref_autonight.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 14 | 15 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/test/java/com/cxz/wanandroid/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.cxz.wanandroid 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /art/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/01.png -------------------------------------------------------------------------------- /art/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/02.png -------------------------------------------------------------------------------- /art/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/03.png -------------------------------------------------------------------------------- /art/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/04.png -------------------------------------------------------------------------------- /art/05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/05.jpg -------------------------------------------------------------------------------- /art/06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/06.jpg -------------------------------------------------------------------------------- /art/07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/07.jpg -------------------------------------------------------------------------------- /art/08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/08.jpg -------------------------------------------------------------------------------- /art/09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/09.jpg -------------------------------------------------------------------------------- /art/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/10.jpg -------------------------------------------------------------------------------- /art/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/11.jpg -------------------------------------------------------------------------------- /art/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/12.jpg -------------------------------------------------------------------------------- /art/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/13.jpg -------------------------------------------------------------------------------- /art/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/14.jpg -------------------------------------------------------------------------------- /art/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/15.jpg -------------------------------------------------------------------------------- /art/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/16.jpg -------------------------------------------------------------------------------- /art/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/17.jpg -------------------------------------------------------------------------------- /art/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/18.jpg -------------------------------------------------------------------------------- /art/19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/19.jpg -------------------------------------------------------------------------------- /art/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/20.jpg -------------------------------------------------------------------------------- /art/qr-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/art/qr-code.png -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | apply from: "config.gradle" 3 | 4 | buildscript { 5 | ext.kotlin_version = '1.4.10' 6 | repositories { 7 | // maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} 8 | google() 9 | jcenter() 10 | mavenCentral() 11 | } 12 | dependencies { 13 | classpath 'com.android.tools.build:gradle:3.5.2' 14 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 15 | 16 | // tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4 17 | classpath "com.tencent.bugly:tinker-support:1.2.0" 18 | 19 | // NOTE: Do not place your application dependencies here; they belong 20 | // in the individual module build.gradle files 21 | } 22 | } 23 | 24 | allprojects { 25 | repositories { 26 | // maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} 27 | google() 28 | jcenter() 29 | mavenCentral() 30 | maven { url "https://jitpack.io" } 31 | } 32 | } 33 | 34 | task clean(type: Delete) { 35 | delete rootProject.buildDir 36 | } 37 | -------------------------------------------------------------------------------- /cxz.jks.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/cxz.jks.enc -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # Kotlin code style for this project: "official" or "obsolete": 15 | kotlin.code.style=official 16 | 17 | # Disables R8 for Android Library modules only. 18 | android.enableR8.libraries = true 19 | # Disables R8 for all modules. 20 | android.enableR8 = true 21 | android.useAndroidX=true 22 | android.enableJetifier=true 23 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iceCola7/WanAndroid/6e787718078fb1813893bebf852fc697aac566eb/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Oct 18 21:18:42 CST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip 7 | -------------------------------------------------------------------------------- /lib_multiple_view/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /lib_multiple_view/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'kotlin-android' 4 | } 5 | 6 | android { 7 | compileSdkVersion rootProject.ext.android.compileSdkVersion 8 | buildToolsVersion rootProject.ext.android.buildToolsVersion 9 | 10 | defaultConfig { 11 | minSdkVersion rootProject.ext.android.minSdkVersion 12 | targetSdkVersion rootProject.ext.android.targetSdkVersion 13 | versionCode rootProject.ext.android.versionCode 14 | versionName rootProject.ext.android.versionName 15 | } 16 | 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | compileOptions { 24 | sourceCompatibility JavaVersion.VERSION_1_8 25 | targetCompatibility JavaVersion.VERSION_1_8 26 | } 27 | kotlinOptions { 28 | jvmTarget = '1.8' 29 | } 30 | } 31 | 32 | dependencies { 33 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 34 | } -------------------------------------------------------------------------------- /lib_multiple_view/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /lib_multiple_view/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/layout/empty_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/layout/error_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/layout/loading_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/layout/no_network_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | lib_multiple_view 3 | 4 | 暂无数据 5 | 加载失败 6 | 网络异常 7 | -------------------------------------------------------------------------------- /lib_multiple_view/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':lib_multiple_view' 2 | --------------------------------------------------------------------------------