├── .gitignore ├── README.md ├── app ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── libs │ └── tbs_sdk_thirdapp_v3.2.0.1104_43200_sharewithdownload_withfilereader_withoutGame_obfs_20170609_115346.jar ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── Roboto-Regular.ttf │ │ ├── html │ │ │ ├── css │ │ │ │ ├── markdown.css │ │ │ │ └── monokai.css │ │ │ └── js │ │ │ │ └── highlight.pack.js │ │ ├── markdown.html │ │ └── marked.min.js │ ├── cpp │ │ ├── native-security.cpp │ │ └── native-security.h │ ├── java │ │ └── com │ │ │ └── sneider │ │ │ └── diycode │ │ │ ├── app │ │ │ ├── ARouterPaths.java │ │ │ ├── BaseActivity.java │ │ │ └── GlobalConfiguration.java │ │ │ ├── di │ │ │ ├── component │ │ │ │ ├── AddNewsComponent.java │ │ │ │ ├── AddReplyComponent.java │ │ │ │ ├── AddTopicComponent.java │ │ │ │ ├── LoginComponent.java │ │ │ │ ├── MainComponent.java │ │ │ │ ├── NewsDetailComponent.java │ │ │ │ ├── NewsFragmentComponent.java │ │ │ │ ├── NewsListComponent.java │ │ │ │ ├── NotificationListComponent.java │ │ │ │ ├── ProjectDetailComponent.java │ │ │ │ ├── ProjectFragmentComponent.java │ │ │ │ ├── ReplyListComponent.java │ │ │ │ ├── SettingComponent.java │ │ │ │ ├── SitesComponent.java │ │ │ │ ├── TopicDetailComponent.java │ │ │ │ ├── TopicFragmentComponent.java │ │ │ │ ├── TopicListComponent.java │ │ │ │ ├── TopicReplyComponent.java │ │ │ │ ├── UserDetailComponent.java │ │ │ │ └── UserListComponent.java │ │ │ └── module │ │ │ │ ├── AddNewsModule.java │ │ │ │ ├── AddReplyModule.java │ │ │ │ ├── AddTopicModule.java │ │ │ │ ├── LoginModule.java │ │ │ │ ├── MainModule.java │ │ │ │ ├── NewsDetailModule.java │ │ │ │ ├── NewsFragmentModule.java │ │ │ │ ├── NewsListModule.java │ │ │ │ ├── NotificationListModule.java │ │ │ │ ├── ProjectDetailModule.java │ │ │ │ ├── ProjectFragmentModule.java │ │ │ │ ├── ReplyListModule.java │ │ │ │ ├── SettingModule.java │ │ │ │ ├── SitesModule.java │ │ │ │ ├── TopicDetailModule.java │ │ │ │ ├── TopicFragmentModule.java │ │ │ │ ├── TopicListModule.java │ │ │ │ ├── TopicReplyModule.java │ │ │ │ ├── UserDetailModule.java │ │ │ │ └── UserListModule.java │ │ │ ├── event │ │ │ ├── GetUnreadCountEvent.java │ │ │ ├── LoginEvent.java │ │ │ ├── LogoutEvent.java │ │ │ ├── ReplyEvent.java │ │ │ └── UpdateTopicEvent.java │ │ │ ├── mvp │ │ │ ├── contract │ │ │ │ ├── AddNewsContract.java │ │ │ │ ├── AddReplyContract.java │ │ │ │ ├── AddTopicContract.java │ │ │ │ ├── LoginContract.java │ │ │ │ ├── MainContract.java │ │ │ │ ├── NewsDetailContract.java │ │ │ │ ├── NewsFragmentContract.java │ │ │ │ ├── NewsListContract.java │ │ │ │ ├── NotificationListContract.java │ │ │ │ ├── ProjectDetailContract.java │ │ │ │ ├── ProjectFragmentContract.java │ │ │ │ ├── ReplyListContract.java │ │ │ │ ├── SettingContract.java │ │ │ │ ├── SitesContract.java │ │ │ │ ├── TopicDetailContract.java │ │ │ │ ├── TopicFragmentContract.java │ │ │ │ ├── TopicListContract.java │ │ │ │ ├── TopicReplyContract.java │ │ │ │ ├── UserDetailContract.java │ │ │ │ └── UserListContract.java │ │ │ ├── model │ │ │ │ ├── AddNewsModel.java │ │ │ │ ├── AddReplyModel.java │ │ │ │ ├── AddTopicModel.java │ │ │ │ ├── LoginModel.java │ │ │ │ ├── MainModel.java │ │ │ │ ├── NewsDetailModel.java │ │ │ │ ├── NewsFragmentModel.java │ │ │ │ ├── NewsListModel.java │ │ │ │ ├── NotificationListModel.java │ │ │ │ ├── ProjectDetailModel.java │ │ │ │ ├── ProjectFragmentModel.java │ │ │ │ ├── ReplyListModel.java │ │ │ │ ├── SettingModel.java │ │ │ │ ├── SitesModel.java │ │ │ │ ├── TopicDetailModel.java │ │ │ │ ├── TopicFragmentModel.java │ │ │ │ ├── TopicListModel.java │ │ │ │ ├── TopicReplyModel.java │ │ │ │ ├── UserDetailModel.java │ │ │ │ ├── UserListModel.java │ │ │ │ ├── api │ │ │ │ │ ├── cache │ │ │ │ │ │ └── CommonCache.java │ │ │ │ │ └── service │ │ │ │ │ │ ├── CommonService.java │ │ │ │ │ │ ├── NewsService.java │ │ │ │ │ │ ├── NotificationService.java │ │ │ │ │ │ ├── ProjectService.java │ │ │ │ │ │ ├── TopicService.java │ │ │ │ │ │ └── UserService.java │ │ │ │ └── bean │ │ │ │ │ ├── Abilities.java │ │ │ │ │ ├── Count.java │ │ │ │ │ ├── ImageResult.java │ │ │ │ │ ├── Like.java │ │ │ │ │ ├── Mention.java │ │ │ │ │ ├── News.java │ │ │ │ │ ├── NewsNode.java │ │ │ │ │ ├── Node.java │ │ │ │ │ ├── Notification.java │ │ │ │ │ ├── Ok.java │ │ │ │ │ ├── Project.java │ │ │ │ │ ├── Reply.java │ │ │ │ │ ├── Section.java │ │ │ │ │ ├── Sites.java │ │ │ │ │ ├── Token.java │ │ │ │ │ ├── Topic.java │ │ │ │ │ ├── User.java │ │ │ │ │ └── UserBean.java │ │ │ ├── presenter │ │ │ │ ├── AddNewsPresenter.java │ │ │ │ ├── AddReplyPresenter.java │ │ │ │ ├── AddTopicPresenter.java │ │ │ │ ├── LoginPresenter.java │ │ │ │ ├── MainPresenter.java │ │ │ │ ├── NewsDetailPresenter.java │ │ │ │ ├── NewsFragmentPresenter.java │ │ │ │ ├── NewsListPresenter.java │ │ │ │ ├── NotificationListPresenter.java │ │ │ │ ├── ProjectDetailPresenter.java │ │ │ │ ├── ProjectFragmentPresenter.java │ │ │ │ ├── ReplyListPresenter.java │ │ │ │ ├── SettingPresenter.java │ │ │ │ ├── SitesPresenter.java │ │ │ │ ├── TopicDetailPresenter.java │ │ │ │ ├── TopicFragmentPresenter.java │ │ │ │ ├── TopicListPresenter.java │ │ │ │ ├── TopicReplyPresenter.java │ │ │ │ ├── UserDetailPresenter.java │ │ │ │ └── UserListPresenter.java │ │ │ └── ui │ │ │ │ ├── activity │ │ │ │ ├── AddNewsActivity.java │ │ │ │ ├── AddReplyActivity.java │ │ │ │ ├── AddTopicActivity.java │ │ │ │ ├── ImageActivity.java │ │ │ │ ├── LoginActivity.java │ │ │ │ ├── MainActivity.java │ │ │ │ ├── MarkdownActivity.java │ │ │ │ ├── NewsDetailActivity.java │ │ │ │ ├── NewsListActivity.java │ │ │ │ ├── NotificationListActivity.java │ │ │ │ ├── PhotoActivity.java │ │ │ │ ├── ProjectDetailActivity.java │ │ │ │ ├── ReplyListActivity.java │ │ │ │ ├── SettingActivity.java │ │ │ │ ├── SitesActivity.java │ │ │ │ ├── TopicDetailActivity.java │ │ │ │ ├── TopicListActivity.java │ │ │ │ ├── TopicReplyActivity.java │ │ │ │ ├── UserDetailActivity.java │ │ │ │ ├── UserListActivity.java │ │ │ │ └── WebActivity.java │ │ │ │ ├── adapter │ │ │ │ ├── NewsDetailAdapter.java │ │ │ │ ├── NewsListAdapter.java │ │ │ │ ├── NodeListAdapter.java │ │ │ │ ├── NotificationListAdapter.java │ │ │ │ ├── ProjectDetailAdapter.java │ │ │ │ ├── ProjectListAdapter.java │ │ │ │ ├── ReplyListAdapter.java │ │ │ │ ├── SectionListAdapter.java │ │ │ │ ├── SitesAdapter.java │ │ │ │ ├── SitesBeanAdapter.java │ │ │ │ ├── TopicListAdapter.java │ │ │ │ ├── TopicReplyAdapter.java │ │ │ │ └── UserListAdapter.java │ │ │ │ └── fragment │ │ │ │ ├── NewsFragment.java │ │ │ │ ├── ProjectFragment.java │ │ │ │ └── TopicFragment.java │ │ │ ├── utils │ │ │ ├── CacheDataUtils.java │ │ │ ├── Constant.java │ │ │ ├── DateUtils.java │ │ │ ├── DiycodeUtils.java │ │ │ ├── GlideCircleTransform.java │ │ │ ├── KeyStoreHelper.java │ │ │ ├── KeyStoreHelper1.java │ │ │ ├── KeyStoreHelper2.java │ │ │ ├── MarkdownUtils.java │ │ │ ├── PrefUtils.java │ │ │ ├── RxUtils.java │ │ │ ├── ScrollAwareFABBehavior.java │ │ │ ├── SecurityConstants.java │ │ │ ├── UrlUtil.java │ │ │ ├── WebImageListener.java │ │ │ ├── WebViewUtils.java │ │ │ └── html │ │ │ │ ├── CodeTagHandler.java │ │ │ │ ├── GlideImageGetter.java │ │ │ │ ├── GlideImageGetter1.java │ │ │ │ ├── HtmlUtils.java │ │ │ │ ├── UrlDrawable.java │ │ │ │ └── UrlDrawable1.java │ │ │ └── widget │ │ │ ├── FlowLayout.java │ │ │ ├── ScrollChildSwipeRefreshLayout.java │ │ │ ├── SettingRowView.java │ │ │ ├── WebViewProgressBar.java │ │ │ ├── loadmore │ │ │ ├── LoadMoreFooter.java │ │ │ ├── LoadMoreFooterAdapter.java │ │ │ ├── LoadMoreListener.java │ │ │ └── LoadMoreRecyclerView.java │ │ │ └── tag │ │ │ ├── TagAdapter.java │ │ │ ├── TagFlowLayout.java │ │ │ └── TagView.java │ ├── jniLibs │ │ └── armeabi │ │ │ └── liblbs.so │ └── res │ │ ├── color │ │ └── diycode_bottom_toolbar_apply.xml │ │ ├── drawable-v21 │ │ ├── bg_recycler.xml │ │ └── recycler_rectangle.xml │ │ ├── drawable-xhdpi │ │ ├── logo_big.png │ │ ├── logo_small.png │ │ └── placeholder.png │ │ ├── drawable │ │ ├── bg_follow.xml │ │ ├── bg_node.xml │ │ ├── bg_node_checked.xml │ │ ├── bg_node_normal.xml │ │ ├── bg_press.xml │ │ ├── bg_progress_circle.xml │ │ ├── bg_recycler.xml │ │ ├── bg_txt_node.xml │ │ ├── bg_txt_section.xml │ │ ├── divider.xml │ │ ├── ic_add.xml │ │ ├── ic_back.xml │ │ ├── ic_block.xml │ │ ├── ic_close.xml │ │ ├── ic_code.xml │ │ ├── ic_fab_reply.xml │ │ ├── ic_favorite.xml │ │ ├── ic_favorite_yes.xml │ │ ├── ic_filter.xml │ │ ├── ic_follower.xml │ │ ├── ic_following.xml │ │ ├── ic_github.xml │ │ ├── ic_help.xml │ │ ├── ic_image.xml │ │ ├── ic_like.xml │ │ ├── ic_like_yes.xml │ │ ├── ic_my_reply.xml │ │ ├── ic_notification.xml │ │ ├── ic_notification_red.xml │ │ ├── ic_pencil.xml │ │ ├── ic_reply.xml │ │ ├── ic_search.xml │ │ ├── ic_send.xml │ │ ├── ic_settings.xml │ │ ├── ic_share.xml │ │ ├── ic_sites.xml │ │ ├── ic_star.xml │ │ ├── ic_topic.xml │ │ ├── ic_wiki.xml │ │ └── progressbar.xml │ │ ├── layout │ │ ├── activity_add_news.xml │ │ ├── activity_add_reply.xml │ │ ├── activity_add_topic.xml │ │ ├── activity_detail.xml │ │ ├── activity_image.xml │ │ ├── activity_list.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_photo.xml │ │ ├── activity_setting.xml │ │ ├── activity_sites.xml │ │ ├── activity_topic_detail.xml │ │ ├── activity_user_detail.xml │ │ ├── activity_web.xml │ │ ├── fragment_list.xml │ │ ├── item_image.xml │ │ ├── item_news.xml │ │ ├── item_news_detail.xml │ │ ├── item_news_node.xml │ │ ├── item_node.xml │ │ ├── item_notification.xml │ │ ├── item_project.xml │ │ ├── item_project_detail.xml │ │ ├── item_reply.xml │ │ ├── item_reply_user.xml │ │ ├── item_section.xml │ │ ├── item_sites.xml │ │ ├── item_sitesbean.xml │ │ ├── item_topic.xml │ │ ├── item_user.xml │ │ ├── layout_basic_web.xml │ │ ├── layout_footer.xml │ │ ├── layout_nav_header.xml │ │ ├── popup_news_nodes.xml │ │ ├── popup_topic_nodes.xml │ │ └── view_setting_row.xml │ │ ├── menu │ │ ├── menu_drawer.xml │ │ ├── menu_popup_code_category.xml │ │ ├── menu_toolbar_add_activity.xml │ │ ├── menu_toolbar_detail_activity.xml │ │ ├── menu_toolbar_image_activity.xml │ │ ├── menu_toolbar_list_activity.xml │ │ ├── menu_toolbar_main_activity.xml │ │ ├── menu_toolbar_notification_activity.xml │ │ └── menu_toolbar_web_activity.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values │ │ ├── arrays.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── provider_paths.xml │ └── test │ └── java │ └── com │ └── sneider │ └── diycode │ └── ExampleUnitTest.java ├── build.gradle ├── config.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── screenshots ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg └── 5.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | .idea 11 | *.apk -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DiyCodeAndroid 2 | a Third-party Android App of [DiyCode Community](http://www.diycode.cc/) 3 | ## 应用截图 4 |

5 | 6 | 7 | 8 | 9 |

10 | 11 | ## 下载 12 | [点击下载](https://www.pgyer.com/DiyCodeAndroid) 13 | ## 感谢 14 | ### Api 15 | [DiyCode API 目录](https://www.diycode.cc/api) 16 | ### 框架 17 | [JessYanCoding/MVPArms](https://github.com/JessYanCoding/MVPArms) 18 | ### 代码参考 19 | [GcsSloop/diycode](https://github.com/GcsSloop/diycode) 20 | 21 | [plusend/DiyCode](https://github.com/plusend/DiyCode) 22 | 23 | [SamuelGjk/DiyCode](https://github.com/SamuelGjk/DiyCode) 24 | 25 | [xshengcn/DiyCode](https://github.com/xshengcn/DiyCode) 26 | ## 注意 27 | 代码中使用了签名验证,所以使用前请将 [`native-security.cpp`](https://github.com/linsneider/DiyCodeAndroid/blob/master/app/src/main/cpp/native-security.cpp) 里的`static const char *SIGN`改为自己打包用的签名,签名的获取代码如下: 28 | 29 | `PackageManager pm = getPackageManager();` 30 | 31 | `PackageInfo pi = pm.getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);` 32 | 33 | `Signature[] signatures = pi.signatures;` 34 | 35 | `Signature signature0 = signatures[0];` 36 | 37 | `return signature0.toCharsString();` 38 | 39 | 或是直接把 [`native-security.cpp`](https://github.com/linsneider/DiyCodeAndroid/blob/master/app/src/main/cpp/native-security.cpp) 里的`jint JNI_OnLoad(JavaVM *vm, void *reserved)`这个方法注释掉即可。 40 | ### 推荐阅读 41 | [Android 密钥保护和 C/S 网络传输安全理论指南](https://drakeet.me/android-security-guide/) 42 | 43 | [Android安全系列之:如何在native层保存关键信息](http://www.jianshu.com/p/2576d064baf1) 44 | ## 联系我 45 | linsneijder@gmail.com 46 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Sets the minimum version of CMake required to build your native library. 2 | # This ensures that a certain set of CMake features is available to 3 | # your build. 4 | 5 | cmake_minimum_required(VERSION 3.4.1) 6 | 7 | # Specifies a library name, specifies whether the library is STATIC or 8 | # SHARED, and provides relative paths to the source code. You can 9 | # define multiple libraries by adding multiple add.library() commands, 10 | # and CMake builds them for you. When you build your app, Gradle 11 | # automatically packages shared libraries with your APK. 12 | 13 | add_library( # Specifies the name of the library. 14 | security 15 | 16 | # Sets the library as a shared library. 17 | SHARED 18 | 19 | # Provides a relative path to your source file(s). 20 | src/main/cpp/native-security.cpp ) 21 | 22 | # Searches for a specified prebuilt library and stores the path as a 23 | # variable. Because CMake includes system libraries in the search path by 24 | # default, you only need to specify the name of the public NDK library 25 | # you want to add. CMake verifies that the library exists before 26 | # completing its build. 27 | 28 | find_library( # Sets the name of the path variable. 29 | log-lib 30 | 31 | # Specifies the name of the NDK library that 32 | # you want CMake to locate. 33 | log ) 34 | 35 | # Specifies libraries CMake should link to your target library. You 36 | # can link multiple libraries, such as libraries you define in this 37 | # build script, prebuilt third-party libraries, or system libraries. 38 | 39 | target_link_libraries( # Specifies the target library. 40 | security 41 | 42 | # Links the target library to the log library 43 | # included in the NDK. 44 | ${log-lib} ) -------------------------------------------------------------------------------- /app/libs/tbs_sdk_thirdapp_v3.2.0.1104_43200_sharewithdownload_withfilereader_withoutGame_obfs_20170609_115346.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/libs/tbs_sdk_thirdapp_v3.2.0.1104_43200_sharewithdownload_withfilereader_withoutGame_obfs_20170609_115346.jar -------------------------------------------------------------------------------- /app/src/main/assets/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/assets/Roboto-Regular.ttf -------------------------------------------------------------------------------- /app/src/main/assets/html/css/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; color: #ddd; 10 | } 11 | 12 | .hljs-tag, 13 | .hljs-keyword, 14 | .hljs-selector-tag, 15 | .hljs-literal, 16 | .hljs-strong, 17 | .hljs-name { 18 | color: #f92672; 19 | } 20 | 21 | .hljs-code { 22 | color: #66d9ef; 23 | } 24 | 25 | .hljs-class .hljs-title { 26 | color: white; 27 | } 28 | 29 | .hljs-attribute, 30 | .hljs-symbol, 31 | .hljs-regexp, 32 | .hljs-link { 33 | color: #bf79db; 34 | } 35 | 36 | .hljs-string, 37 | .hljs-bullet, 38 | .hljs-subst, 39 | .hljs-title, 40 | .hljs-section, 41 | .hljs-emphasis, 42 | .hljs-type, 43 | .hljs-built_in, 44 | .hljs-builtin-name, 45 | .hljs-selector-attr, 46 | .hljs-selector-pseudo, 47 | .hljs-addition, 48 | .hljs-variable, 49 | .hljs-template-tag, 50 | .hljs-template-variable { 51 | color: #a6e22e; 52 | } 53 | 54 | .hljs-comment, 55 | .hljs-quote, 56 | .hljs-deletion, 57 | .hljs-meta { 58 | color: #75715e; 59 | } 60 | 61 | .hljs-keyword, 62 | .hljs-selector-tag, 63 | .hljs-literal, 64 | .hljs-doctag, 65 | .hljs-title, 66 | .hljs-section, 67 | .hljs-type, 68 | .hljs-selector-id { 69 | font-weight: bold; 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/cpp/native-security.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #ifndef DIYCODEANDROID_NATIVE_SECURITY_H 4 | #define DIYCODEANDROID_NATIVE_SECURITY_H 5 | 6 | #ifdef __cplusplus 7 | extern "C" { 8 | #endif 9 | 10 | JNIEXPORT jstring JNICALL 11 | Java_com_sneider_diycode_utils_DiycodeUtils_getClientId(JNIEnv *env, jclass type); 12 | 13 | JNIEXPORT jstring JNICALL 14 | Java_com_sneider_diycode_utils_DiycodeUtils_getClientSecret(JNIEnv *env, jclass type); 15 | 16 | #ifdef __cplusplus 17 | } 18 | #endif 19 | 20 | #endif //DIYCODEANDROID_NATIVE_SECURITY_H 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/app/ARouterPaths.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.app; 2 | 3 | public interface ARouterPaths { 4 | 5 | String TOPIC_DETAIL = "/topic/detail"; 6 | 7 | String TOPIC_LIST = "/topic/list"; 8 | 9 | String TOPIC_REPLY = "/topic/reply"; 10 | 11 | String TOPIC_ADD = "/topic/add"; 12 | 13 | String PROJECT_DETAIL = "/project/detail"; 14 | 15 | String NEWS_DETAIL = "/news/detail"; 16 | 17 | String NEWS_LIST = "/news/list"; 18 | 19 | String NEWS_ADD = "/news/add"; 20 | 21 | String REPLY_LIST = "/reply/list"; 22 | 23 | String REPLY_ADD = "/reply/add"; 24 | 25 | String USER_LOGIN = "/user/login"; 26 | 27 | String USER_DETAIL = "/user/detail"; 28 | 29 | String USER_LIST = "/user/list"; 30 | 31 | String USER_NOTIFICATION = "/user/notification"; 32 | 33 | String PUBLIC_WEB = "/public/web"; 34 | 35 | String PUBLIC_MARKDOWN = "/public/markdown"; 36 | 37 | String PUBLIC_PHOTO = "/public/photo"; 38 | 39 | String PUBLIC_SITES = "/public/sites"; 40 | 41 | String PUBLIC_SETTING = "/public/setting"; 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/AddNewsComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.AddNewsModule; 6 | import com.sneider.diycode.mvp.ui.activity.AddNewsActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = AddNewsModule.class, dependencies = AppComponent.class) 12 | public interface AddNewsComponent { 13 | 14 | void inject(AddNewsActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/AddReplyComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.AddReplyModule; 6 | import com.sneider.diycode.mvp.ui.activity.AddReplyActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = AddReplyModule.class, dependencies = AppComponent.class) 12 | public interface AddReplyComponent { 13 | 14 | void inject(AddReplyActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/AddTopicComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.AddTopicModule; 6 | import com.sneider.diycode.mvp.ui.activity.AddTopicActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = AddTopicModule.class, dependencies = AppComponent.class) 12 | public interface AddTopicComponent { 13 | 14 | void inject(AddTopicActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/LoginComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.LoginModule; 6 | import com.sneider.diycode.mvp.ui.activity.LoginActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = LoginModule.class, dependencies = AppComponent.class) 12 | public interface LoginComponent { 13 | 14 | void inject(LoginActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/MainComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.MainModule; 6 | import com.sneider.diycode.mvp.ui.activity.MainActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = MainModule.class, dependencies = AppComponent.class) 12 | public interface MainComponent { 13 | 14 | void inject(MainActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/NewsDetailComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.NewsDetailModule; 6 | import com.sneider.diycode.mvp.ui.activity.NewsDetailActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = NewsDetailModule.class, dependencies = AppComponent.class) 12 | public interface NewsDetailComponent { 13 | 14 | void inject(NewsDetailActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/NewsFragmentComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.FragmentScope; 5 | import com.sneider.diycode.di.module.NewsFragmentModule; 6 | import com.sneider.diycode.mvp.ui.fragment.NewsFragment; 7 | 8 | import dagger.Component; 9 | 10 | @FragmentScope 11 | @Component(modules = NewsFragmentModule.class, dependencies = AppComponent.class) 12 | public interface NewsFragmentComponent { 13 | 14 | void inject(NewsFragment fragment); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/NewsListComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.NewsListModule; 6 | import com.sneider.diycode.mvp.ui.activity.NewsListActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = NewsListModule.class, dependencies = AppComponent.class) 12 | public interface NewsListComponent { 13 | 14 | void inject(NewsListActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/NotificationListComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.NotificationListModule; 6 | import com.sneider.diycode.mvp.ui.activity.NotificationListActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = NotificationListModule.class, dependencies = AppComponent.class) 12 | public interface NotificationListComponent { 13 | 14 | void inject(NotificationListActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/ProjectDetailComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.ProjectDetailModule; 6 | import com.sneider.diycode.mvp.ui.activity.ProjectDetailActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = ProjectDetailModule.class, dependencies = AppComponent.class) 12 | public interface ProjectDetailComponent { 13 | 14 | void inject(ProjectDetailActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/ProjectFragmentComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.FragmentScope; 5 | import com.sneider.diycode.di.module.ProjectFragmentModule; 6 | import com.sneider.diycode.mvp.ui.fragment.ProjectFragment; 7 | 8 | import dagger.Component; 9 | 10 | @FragmentScope 11 | @Component(modules = ProjectFragmentModule.class, dependencies = AppComponent.class) 12 | public interface ProjectFragmentComponent { 13 | 14 | void inject(ProjectFragment fragment); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/ReplyListComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.ReplyListModule; 6 | import com.sneider.diycode.mvp.ui.activity.ReplyListActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = ReplyListModule.class, dependencies = AppComponent.class) 12 | public interface ReplyListComponent { 13 | 14 | void inject(ReplyListActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/SettingComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.SettingModule; 6 | import com.sneider.diycode.mvp.ui.activity.SettingActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = SettingModule.class, dependencies = AppComponent.class) 12 | public interface SettingComponent { 13 | 14 | void inject(SettingActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/SitesComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.SitesModule; 6 | import com.sneider.diycode.mvp.ui.activity.SitesActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = SitesModule.class, dependencies = AppComponent.class) 12 | public interface SitesComponent { 13 | 14 | void inject(SitesActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/TopicDetailComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.TopicDetailModule; 6 | import com.sneider.diycode.mvp.ui.activity.TopicDetailActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = TopicDetailModule.class, dependencies = AppComponent.class) 12 | public interface TopicDetailComponent { 13 | 14 | void inject(TopicDetailActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/TopicFragmentComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.FragmentScope; 5 | import com.sneider.diycode.di.module.TopicFragmentModule; 6 | import com.sneider.diycode.mvp.ui.fragment.TopicFragment; 7 | 8 | import dagger.Component; 9 | 10 | @FragmentScope 11 | @Component(modules = TopicFragmentModule.class, dependencies = AppComponent.class) 12 | public interface TopicFragmentComponent { 13 | 14 | void inject(TopicFragment fragment); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/TopicListComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.TopicListModule; 6 | import com.sneider.diycode.mvp.ui.activity.TopicListActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = TopicListModule.class, dependencies = AppComponent.class) 12 | public interface TopicListComponent { 13 | 14 | void inject(TopicListActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/TopicReplyComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.TopicReplyModule; 6 | import com.sneider.diycode.mvp.ui.activity.TopicReplyActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = TopicReplyModule.class, dependencies = AppComponent.class) 12 | public interface TopicReplyComponent { 13 | 14 | void inject(TopicReplyActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/UserDetailComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.UserDetailModule; 6 | import com.sneider.diycode.mvp.ui.activity.UserDetailActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = UserDetailModule.class, dependencies = AppComponent.class) 12 | public interface UserDetailComponent { 13 | 14 | void inject(UserDetailActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/component/UserListComponent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.component; 2 | 3 | import com.jess.arms.di.component.AppComponent; 4 | import com.jess.arms.di.scope.ActivityScope; 5 | import com.sneider.diycode.di.module.UserListModule; 6 | import com.sneider.diycode.mvp.ui.activity.UserListActivity; 7 | 8 | import dagger.Component; 9 | 10 | @ActivityScope 11 | @Component(modules = UserListModule.class, dependencies = AppComponent.class) 12 | public interface UserListComponent { 13 | 14 | void inject(UserListActivity activity); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/AddNewsModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.AddNewsContract; 5 | import com.sneider.diycode.mvp.model.AddNewsModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class AddNewsModule { 12 | 13 | private AddNewsContract.View mView; 14 | 15 | public AddNewsModule(AddNewsContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | AddNewsContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | AddNewsContract.Model provideModel(AddNewsModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/AddReplyModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.AddReplyContract; 5 | import com.sneider.diycode.mvp.model.AddReplyModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class AddReplyModule { 12 | 13 | private AddReplyContract.View mView; 14 | 15 | public AddReplyModule(AddReplyContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | AddReplyContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | AddReplyContract.Model provideModel(AddReplyModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/AddTopicModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.AddTopicContract; 5 | import com.sneider.diycode.mvp.model.AddTopicModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class AddTopicModule { 12 | 13 | private AddTopicContract.View mView; 14 | 15 | public AddTopicModule(AddTopicContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | AddTopicContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | AddTopicContract.Model provideModel(AddTopicModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/LoginModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.LoginContract; 5 | import com.sneider.diycode.mvp.model.LoginModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class LoginModule { 12 | 13 | private LoginContract.View mView; 14 | 15 | public LoginModule(LoginContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | LoginContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | LoginContract.Model provideModel(LoginModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/MainModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.MainContract; 5 | import com.sneider.diycode.mvp.model.MainModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class MainModule { 12 | 13 | private MainContract.View mView; 14 | 15 | public MainModule(MainContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | MainContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | MainContract.Model provideModel(MainModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/NewsDetailModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.NewsDetailContract; 5 | import com.sneider.diycode.mvp.model.NewsDetailModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class NewsDetailModule { 12 | 13 | private NewsDetailContract.View mView; 14 | 15 | public NewsDetailModule(NewsDetailContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | NewsDetailContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | NewsDetailContract.Model provideModel(NewsDetailModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/NewsFragmentModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.FragmentScope; 4 | import com.sneider.diycode.mvp.contract.NewsFragmentContract; 5 | import com.sneider.diycode.mvp.model.NewsFragmentModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class NewsFragmentModule { 12 | 13 | private NewsFragmentContract.View mView; 14 | 15 | public NewsFragmentModule(NewsFragmentContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @FragmentScope 20 | @Provides 21 | NewsFragmentContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @FragmentScope 26 | @Provides 27 | NewsFragmentContract.Model provideModel(NewsFragmentModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/NewsListModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.NewsListContract; 5 | import com.sneider.diycode.mvp.model.NewsListModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class NewsListModule { 12 | 13 | private NewsListContract.View mView; 14 | 15 | public NewsListModule(NewsListContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | NewsListContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | NewsListContract.Model provideModel(NewsListModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/NotificationListModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.NotificationListContract; 5 | import com.sneider.diycode.mvp.model.NotificationListModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class NotificationListModule { 12 | 13 | private NotificationListContract.View mView; 14 | 15 | public NotificationListModule(NotificationListContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | NotificationListContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | NotificationListContract.Model provideModel(NotificationListModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/ProjectDetailModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.ProjectDetailContract; 5 | import com.sneider.diycode.mvp.model.ProjectDetailModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class ProjectDetailModule { 12 | 13 | private ProjectDetailContract.View mView; 14 | 15 | public ProjectDetailModule(ProjectDetailContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | ProjectDetailContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | ProjectDetailContract.Model provideModel(ProjectDetailModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/ProjectFragmentModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.FragmentScope; 4 | import com.sneider.diycode.mvp.contract.ProjectFragmentContract; 5 | import com.sneider.diycode.mvp.model.ProjectFragmentModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class ProjectFragmentModule { 12 | 13 | private ProjectFragmentContract.View mView; 14 | 15 | public ProjectFragmentModule(ProjectFragmentContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @FragmentScope 20 | @Provides 21 | ProjectFragmentContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @FragmentScope 26 | @Provides 27 | ProjectFragmentContract.Model provideModel(ProjectFragmentModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/ReplyListModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.ReplyListContract; 5 | import com.sneider.diycode.mvp.model.ReplyListModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class ReplyListModule { 12 | 13 | private ReplyListContract.View mView; 14 | 15 | public ReplyListModule(ReplyListContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | ReplyListContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | ReplyListContract.Model provideModel(ReplyListModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/SettingModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.SettingContract; 5 | import com.sneider.diycode.mvp.model.SettingModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class SettingModule { 12 | 13 | private SettingContract.View mView; 14 | 15 | public SettingModule(SettingContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | SettingContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | SettingContract.Model provideModel(SettingModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/SitesModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.SitesContract; 5 | import com.sneider.diycode.mvp.model.SitesModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class SitesModule { 12 | 13 | private SitesContract.View mView; 14 | 15 | public SitesModule(SitesContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | SitesContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | SitesContract.Model provideModel(SitesModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/TopicDetailModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.TopicDetailContract; 5 | import com.sneider.diycode.mvp.model.TopicDetailModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class TopicDetailModule { 12 | 13 | private TopicDetailContract.View mView; 14 | 15 | public TopicDetailModule(TopicDetailContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | TopicDetailContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | TopicDetailContract.Model provideModel(TopicDetailModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/TopicFragmentModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.FragmentScope; 4 | import com.sneider.diycode.mvp.contract.TopicFragmentContract; 5 | import com.sneider.diycode.mvp.model.TopicFragmentModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class TopicFragmentModule { 12 | 13 | private TopicFragmentContract.View mView; 14 | 15 | public TopicFragmentModule(TopicFragmentContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @FragmentScope 20 | @Provides 21 | TopicFragmentContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @FragmentScope 26 | @Provides 27 | TopicFragmentContract.Model provideModel(TopicFragmentModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/TopicListModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.TopicListContract; 5 | import com.sneider.diycode.mvp.model.TopicListModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class TopicListModule { 12 | 13 | private TopicListContract.View mView; 14 | 15 | public TopicListModule(TopicListContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | TopicListContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | TopicListContract.Model provideModel(TopicListModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/TopicReplyModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.TopicReplyContract; 5 | import com.sneider.diycode.mvp.model.TopicReplyModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class TopicReplyModule { 12 | 13 | private TopicReplyContract.View mView; 14 | 15 | public TopicReplyModule(TopicReplyContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | TopicReplyContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | TopicReplyContract.Model provideModel(TopicReplyModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/UserDetailModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.UserDetailContract; 5 | import com.sneider.diycode.mvp.model.UserDetailModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class UserDetailModule { 12 | 13 | private UserDetailContract.View mView; 14 | 15 | public UserDetailModule(UserDetailContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | UserDetailContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | UserDetailContract.Model provideModel(UserDetailModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/di/module/UserListModule.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.di.module; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.sneider.diycode.mvp.contract.UserListContract; 5 | import com.sneider.diycode.mvp.model.UserListModel; 6 | 7 | import dagger.Module; 8 | import dagger.Provides; 9 | 10 | @Module 11 | public class UserListModule { 12 | 13 | private UserListContract.View mView; 14 | 15 | public UserListModule(UserListContract.View view) { 16 | mView = view; 17 | } 18 | 19 | @ActivityScope 20 | @Provides 21 | UserListContract.View provideView() { 22 | return mView; 23 | } 24 | 25 | @ActivityScope 26 | @Provides 27 | UserListContract.Model provideModel(UserListModel model) { 28 | return model; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/event/GetUnreadCountEvent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.event; 2 | 3 | public class GetUnreadCountEvent { 4 | 5 | public boolean hasUnread; 6 | 7 | public GetUnreadCountEvent(boolean hasUnread) { 8 | this.hasUnread = hasUnread; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/event/LoginEvent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.event; 2 | 3 | public class LoginEvent { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/event/LogoutEvent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.event; 2 | 3 | public class LogoutEvent { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/event/ReplyEvent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.event; 2 | 3 | public class ReplyEvent { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/event/UpdateTopicEvent.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.event; 2 | 3 | public class UpdateTopicEvent { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/AddNewsContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.News; 6 | import com.sneider.diycode.mvp.model.bean.NewsNode; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface AddNewsContract { 14 | 15 | interface View extends IView { 16 | 17 | void onGetNodes(List nodes); 18 | 19 | RxPermissions getRxPermissions(); 20 | } 21 | 22 | interface Model extends IModel { 23 | 24 | Observable createNews(String title, String link, int nodeId); 25 | 26 | Observable> getNewsNodes(boolean update); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/AddReplyContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.ImageResult; 6 | import com.sneider.diycode.mvp.model.bean.Ok; 7 | import com.sneider.diycode.mvp.model.bean.Reply; 8 | 9 | import io.reactivex.Observable; 10 | import okhttp3.MultipartBody; 11 | 12 | public interface AddReplyContract { 13 | 14 | interface View extends IView { 15 | 16 | void onGetReply(String reply); 17 | 18 | void onUploadPhoto(String url); 19 | 20 | void showUploading(); 21 | 22 | void hideUploading(); 23 | } 24 | 25 | interface Model extends IModel { 26 | 27 | Observable createTopicReply(int topicId, String body); 28 | 29 | Observable updateTopicReply(int id, String body); 30 | 31 | Observable getTopicReply(int topicId); 32 | 33 | Observable deleteTopicReply(int id); 34 | 35 | Observable updateProjectReply(int id, String body); 36 | 37 | Observable getProjectReply(int projectId); 38 | 39 | Observable deleteProjectReply(int id); 40 | 41 | Observable uploadPhoto(MultipartBody.Part file); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/AddTopicContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.ImageResult; 6 | import com.sneider.diycode.mvp.model.bean.Node; 7 | import com.sneider.diycode.mvp.model.bean.Section; 8 | import com.sneider.diycode.mvp.model.bean.Topic; 9 | import com.tbruyelle.rxpermissions2.RxPermissions; 10 | 11 | import java.util.List; 12 | 13 | import io.reactivex.Observable; 14 | import okhttp3.MultipartBody; 15 | 16 | public interface AddTopicContract { 17 | 18 | interface View extends IView { 19 | 20 | void onGetNodes(List
sections); 21 | 22 | void onUploadPhoto(String url); 23 | 24 | void showUploading(); 25 | 26 | void hideUploading(); 27 | 28 | RxPermissions getRxPermissions(); 29 | } 30 | 31 | interface Model extends IModel { 32 | 33 | Observable createTopic(String title, String body, int nodeId); 34 | 35 | Observable updateTopic(int id, String title, String body, int nodeId); 36 | 37 | Observable uploadPhoto(MultipartBody.Part file); 38 | 39 | Observable> getNodes(boolean update); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/LoginContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.Token; 6 | import com.sneider.diycode.mvp.model.bean.User; 7 | 8 | import io.reactivex.Observable; 9 | 10 | public interface LoginContract { 11 | 12 | interface View extends IView { 13 | 14 | void setUsernameError(); 15 | 16 | void setPasswordError(); 17 | 18 | void resetError(); 19 | 20 | void loginSuccess(String username); 21 | 22 | void loginFailed(); 23 | } 24 | 25 | interface Model extends IModel { 26 | 27 | Observable login(String username, String password); 28 | 29 | Observable getUserInfo(String username); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/MainContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.Count; 6 | 7 | import io.reactivex.Observable; 8 | 9 | public interface MainContract { 10 | 11 | interface View extends IView { 12 | } 13 | 14 | interface Model extends IModel { 15 | 16 | Observable getUnreadCount(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/NewsDetailContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Reply; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface NewsDetailContract { 14 | 15 | interface View extends IView { 16 | 17 | void setAdapter(DefaultAdapter adapter); 18 | 19 | void onLoadMoreComplete(); 20 | 21 | void onLoadMoreError(); 22 | 23 | void onLoadMoreEnd(); 24 | 25 | void smoothToPosition(int position); 26 | 27 | RxPermissions getRxPermissions(); 28 | } 29 | 30 | interface Model extends IModel { 31 | 32 | Observable> getNewsReplies(int id, int offset, boolean update); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/NewsFragmentContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.News; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface NewsFragmentContract { 14 | 15 | interface View extends IView { 16 | 17 | void setAdapter(DefaultAdapter adapter); 18 | 19 | void onLoadMoreComplete(); 20 | 21 | void onLoadMoreError(); 22 | 23 | void onLoadMoreEnd(); 24 | 25 | RxPermissions getRxPermissions(); 26 | } 27 | 28 | interface Model extends IModel { 29 | 30 | Observable> getNews(int offset, boolean update); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/NewsListContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.News; 7 | import com.sneider.diycode.mvp.model.bean.NewsNode; 8 | import com.tbruyelle.rxpermissions2.RxPermissions; 9 | 10 | import java.util.List; 11 | 12 | import io.reactivex.Observable; 13 | 14 | public interface NewsListContract { 15 | 16 | interface View extends IView { 17 | 18 | void setAdapter(DefaultAdapter adapter); 19 | 20 | void setEmpty(boolean isEmpty); 21 | 22 | void onLoadMoreComplete(); 23 | 24 | void onLoadMoreError(); 25 | 26 | void onLoadMoreEnd(); 27 | 28 | void onGetNodes(List nodes); 29 | 30 | RxPermissions getRxPermissions(); 31 | } 32 | 33 | interface Model extends IModel { 34 | 35 | Observable> getNews(int nodeId, int offset, boolean update); 36 | 37 | Observable> getNewsNodes(boolean update); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/NotificationListContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Count; 7 | import com.sneider.diycode.mvp.model.bean.Notification; 8 | import com.sneider.diycode.mvp.model.bean.Ok; 9 | import com.tbruyelle.rxpermissions2.RxPermissions; 10 | 11 | import java.util.List; 12 | 13 | import io.reactivex.Observable; 14 | 15 | public interface NotificationListContract { 16 | 17 | interface View extends IView { 18 | 19 | void setAdapter(DefaultAdapter adapter); 20 | 21 | void setEmpty(boolean isEmpty); 22 | 23 | void onLoadMoreComplete(); 24 | 25 | void onLoadMoreError(); 26 | 27 | void onLoadMoreEnd(); 28 | 29 | void setSubtitle(String subtitle); 30 | 31 | RxPermissions getRxPermissions(); 32 | } 33 | 34 | interface Model extends IModel { 35 | 36 | Observable> getNotifications(int offset, boolean update); 37 | 38 | Observable deleteNotification(int id); 39 | 40 | Observable deleteAllNotifications(); 41 | 42 | Observable getUnreadCount(); 43 | 44 | Observable readNotification(int[] ids); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/ProjectDetailContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Reply; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface ProjectDetailContract { 14 | 15 | interface View extends IView { 16 | 17 | void setAdapter(DefaultAdapter adapter); 18 | 19 | void onLoadMoreComplete(); 20 | 21 | void onLoadMoreError(); 22 | 23 | void onLoadMoreEnd(); 24 | 25 | void smoothToPosition(int position); 26 | 27 | RxPermissions getRxPermissions(); 28 | } 29 | 30 | interface Model extends IModel { 31 | 32 | Observable> getProjectReplies(int id, int offset, boolean update); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/ProjectFragmentContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Project; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface ProjectFragmentContract { 14 | 15 | interface View extends IView { 16 | 17 | void setAdapter(DefaultAdapter adapter); 18 | 19 | void onLoadMoreComplete(); 20 | 21 | void onLoadMoreError(); 22 | 23 | void onLoadMoreEnd(); 24 | 25 | RxPermissions getRxPermissions(); 26 | } 27 | 28 | interface Model extends IModel { 29 | 30 | Observable> getProjects(int offset, boolean update); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/ReplyListContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Reply; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface ReplyListContract { 14 | 15 | interface View extends IView { 16 | 17 | void setAdapter(DefaultAdapter adapter); 18 | 19 | void setEmpty(boolean isEmpty); 20 | 21 | void onLoadMoreComplete(); 22 | 23 | void onLoadMoreError(); 24 | 25 | void onLoadMoreEnd(); 26 | 27 | RxPermissions getRxPermissions(); 28 | } 29 | 30 | interface Model extends IModel { 31 | 32 | Observable> getUserReplies(String username, int offset, boolean update); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/SettingContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.Ok; 6 | 7 | import io.reactivex.Observable; 8 | 9 | public interface SettingContract { 10 | 11 | interface View extends IView { 12 | } 13 | 14 | interface Model extends IModel { 15 | 16 | Observable logout(String platform, String token); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/SitesContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Sites; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface SitesContract { 14 | 15 | interface View extends IView { 16 | 17 | void setAdapter(DefaultAdapter adapter); 18 | 19 | void onLoadMoreComplete(); 20 | 21 | void onLoadMoreError(); 22 | 23 | void onLoadMoreEnd(); 24 | 25 | RxPermissions getRxPermissions(); 26 | } 27 | 28 | interface Model extends IModel { 29 | 30 | Observable> getSites(int offset, boolean update); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/TopicDetailContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.Like; 6 | import com.sneider.diycode.mvp.model.bean.Ok; 7 | import com.sneider.diycode.mvp.model.bean.Topic; 8 | 9 | import io.reactivex.Observable; 10 | 11 | public interface TopicDetailContract { 12 | 13 | interface View extends IView { 14 | 15 | void onGetTopicDetail(Topic topic); 16 | 17 | void onFavoriteTopic(); 18 | 19 | void onLikeTopic(Like like); 20 | 21 | void setLayout(boolean isNormal); 22 | } 23 | 24 | interface Model extends IModel { 25 | 26 | Observable getTopicDetail(int id, boolean update); 27 | 28 | Observable likeTopic(int id); 29 | 30 | Observable unlikeTopic(int id); 31 | 32 | Observable favoriteTopic(int id); 33 | 34 | Observable unfavoriteTopic(int id); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/TopicFragmentContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Ok; 7 | import com.sneider.diycode.mvp.model.bean.Topic; 8 | import com.tbruyelle.rxpermissions2.RxPermissions; 9 | 10 | import java.util.List; 11 | 12 | import io.reactivex.Observable; 13 | 14 | public interface TopicFragmentContract { 15 | 16 | interface View extends IView { 17 | 18 | void setAdapter(DefaultAdapter adapter); 19 | 20 | void onLoadMoreComplete(); 21 | 22 | void onLoadMoreError(); 23 | 24 | void onLoadMoreEnd(); 25 | 26 | void onFavoriteSuccess(); 27 | 28 | RxPermissions getRxPermissions(); 29 | } 30 | 31 | interface Model extends IModel { 32 | 33 | Observable> getTopics(int offset, boolean update); 34 | 35 | Observable favoriteTopic(int id); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/TopicListContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Node; 7 | import com.sneider.diycode.mvp.model.bean.Ok; 8 | import com.sneider.diycode.mvp.model.bean.Section; 9 | import com.sneider.diycode.mvp.model.bean.Topic; 10 | import com.tbruyelle.rxpermissions2.RxPermissions; 11 | 12 | import java.util.List; 13 | 14 | import io.reactivex.Observable; 15 | 16 | public interface TopicListContract { 17 | 18 | interface View extends IView { 19 | 20 | void setAdapter(DefaultAdapter adapter); 21 | 22 | void setEmpty(boolean isEmpty); 23 | 24 | void onLoadMoreComplete(); 25 | 26 | void onLoadMoreError(); 27 | 28 | void onLoadMoreEnd(); 29 | 30 | void onFavoriteSuccess(); 31 | 32 | void onGetNodes(List
sections); 33 | 34 | RxPermissions getRxPermissions(); 35 | } 36 | 37 | interface Model extends IModel { 38 | 39 | Observable> getTopics(int nodeId, int offset, boolean update); 40 | 41 | Observable> getUserTopics(String username, int offset, boolean update); 42 | 43 | Observable> getUserFavorites(String username, int offset, boolean update); 44 | 45 | Observable favoriteTopic(int id); 46 | 47 | Observable unfavoriteTopic(int id); 48 | 49 | Observable> getNodes(boolean update); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/TopicReplyContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Reply; 7 | import com.tbruyelle.rxpermissions2.RxPermissions; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | 13 | public interface TopicReplyContract { 14 | 15 | interface View extends IView { 16 | 17 | void setAdapter(DefaultAdapter adapter); 18 | 19 | void setEmpty(boolean isEmpty); 20 | 21 | void onLoadMoreComplete(); 22 | 23 | void onLoadMoreError(); 24 | 25 | void onLoadMoreEnd(); 26 | 27 | void smoothToPosition(int position); 28 | 29 | RxPermissions getRxPermissions(); 30 | } 31 | 32 | interface Model extends IModel { 33 | 34 | Observable> getTopicReplies(int id, int offset, boolean update); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/UserDetailContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.mvp.IModel; 4 | import com.jess.arms.mvp.IView; 5 | import com.sneider.diycode.mvp.model.bean.Ok; 6 | import com.sneider.diycode.mvp.model.bean.User; 7 | 8 | import io.reactivex.Observable; 9 | 10 | public interface UserDetailContract { 11 | 12 | interface View extends IView { 13 | 14 | void onGetUserInfo(User user); 15 | 16 | void onFollowUser(); 17 | 18 | void onBlockUser(); 19 | } 20 | 21 | interface Model extends IModel { 22 | 23 | Observable getUserInfo(String username, boolean update); 24 | 25 | Observable followUser(String username); 26 | 27 | Observable blockUser(String username); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/contract/UserListContract.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.contract; 2 | 3 | import com.jess.arms.base.DefaultAdapter; 4 | import com.jess.arms.mvp.IModel; 5 | import com.jess.arms.mvp.IView; 6 | import com.sneider.diycode.mvp.model.bean.Ok; 7 | import com.sneider.diycode.mvp.model.bean.User; 8 | import com.tbruyelle.rxpermissions2.RxPermissions; 9 | 10 | import java.util.List; 11 | 12 | import io.reactivex.Observable; 13 | 14 | public interface UserListContract { 15 | 16 | interface View extends IView { 17 | 18 | void setAdapter(DefaultAdapter adapter); 19 | 20 | void setEmpty(boolean isEmpty); 21 | 22 | void onLoadMoreComplete(); 23 | 24 | void onLoadMoreError(); 25 | 26 | void onLoadMoreEnd(); 27 | 28 | RxPermissions getRxPermissions(); 29 | } 30 | 31 | interface Model extends IModel { 32 | 33 | Observable> getFollowers(String username, int offset, boolean update); 34 | 35 | Observable> getFollowings(String username, int offset, boolean update); 36 | 37 | Observable> getBlockedUsers(String username, int offset, boolean update); 38 | 39 | Observable unfollowUser(String username); 40 | 41 | Observable unblockUser(String username); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/AddNewsModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.AddNewsContract; 7 | import com.sneider.diycode.mvp.model.api.service.NewsService; 8 | import com.sneider.diycode.mvp.model.bean.News; 9 | import com.sneider.diycode.mvp.model.bean.NewsNode; 10 | 11 | import java.util.List; 12 | 13 | import javax.inject.Inject; 14 | 15 | import io.reactivex.Observable; 16 | 17 | @ActivityScope 18 | public class AddNewsModel extends BaseModel implements AddNewsContract.Model { 19 | 20 | @Inject 21 | public AddNewsModel(IRepositoryManager repositoryManager) { 22 | super(repositoryManager); 23 | } 24 | 25 | @Override 26 | public Observable createNews(String title, String link, int nodeId) { 27 | Observable news = mRepositoryManager.obtainRetrofitService(NewsService.class) 28 | .createNews(title, link, nodeId); 29 | return news; 30 | } 31 | 32 | @Override 33 | public Observable> getNewsNodes(boolean update) { 34 | Observable> nodes = mRepositoryManager.obtainRetrofitService(NewsService.class) 35 | .getNewsNodes(); 36 | return nodes; 37 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 38 | // .getNewsNodes(nodes, new EvictDynamicKey(update)) 39 | // .flatMap(new Function>, ObservableSource>>() { 40 | // @Override 41 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 42 | // return Observable.just(reply.getData()); 43 | // } 44 | // }); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/LoginModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.LoginContract; 7 | import com.sneider.diycode.mvp.model.api.service.CommonService; 8 | import com.sneider.diycode.mvp.model.api.service.UserService; 9 | import com.sneider.diycode.mvp.model.bean.Token; 10 | import com.sneider.diycode.mvp.model.bean.User; 11 | import com.sneider.diycode.utils.Constant; 12 | import com.sneider.diycode.utils.DiycodeUtils; 13 | 14 | import javax.inject.Inject; 15 | 16 | import io.reactivex.Observable; 17 | 18 | @ActivityScope 19 | public class LoginModel extends BaseModel implements LoginContract.Model { 20 | 21 | @Inject 22 | public LoginModel(IRepositoryManager repositoryManager) { 23 | super(repositoryManager); 24 | } 25 | 26 | @Override 27 | public Observable login(String username, String password) { 28 | Observable token = mRepositoryManager.obtainRetrofitService(CommonService.class) 29 | .getToken(DiycodeUtils.getClientId(), DiycodeUtils.getClientSecret(), 30 | Constant.GRANT_TYPE_PASSWORD, username, password); 31 | return token; 32 | } 33 | 34 | @Override 35 | public Observable getUserInfo(String username) { 36 | Observable user = mRepositoryManager.obtainRetrofitService(UserService.class) 37 | .getUserInfo(username); 38 | return user; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/MainModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.MainContract; 7 | import com.sneider.diycode.mvp.model.api.service.NotificationService; 8 | import com.sneider.diycode.mvp.model.bean.Count; 9 | 10 | import javax.inject.Inject; 11 | 12 | import io.reactivex.Observable; 13 | 14 | @ActivityScope 15 | public class MainModel extends BaseModel implements MainContract.Model { 16 | 17 | @Inject 18 | public MainModel(IRepositoryManager repositoryManager) { 19 | super(repositoryManager); 20 | } 21 | 22 | @Override 23 | public Observable getUnreadCount() { 24 | Observable count = mRepositoryManager.obtainRetrofitService(NotificationService.class) 25 | .getUnreadCount(); 26 | return count; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/NewsDetailModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.NewsDetailContract; 7 | import com.sneider.diycode.mvp.model.api.service.NewsService; 8 | import com.sneider.diycode.utils.Constant; 9 | 10 | import java.util.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | import io.reactivex.Observable; 15 | 16 | @ActivityScope 17 | public class NewsDetailModel extends BaseModel implements NewsDetailContract.Model { 18 | 19 | @Inject 20 | public NewsDetailModel(IRepositoryManager repositoryManager) { 21 | super(repositoryManager); 22 | } 23 | 24 | @Override 25 | public Observable> getNewsReplies(int id, int offset, boolean update) { 26 | Observable> replies = mRepositoryManager.obtainRetrofitService(NewsService.class) 27 | .getNewsReplies(id, offset, Constant.PAGE_SIZE); 28 | return replies; 29 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 30 | // .getNewsReplies(replies, new DynamicKeyGroup(id, offset), new EvictDynamicKey(update)) 31 | // .flatMap(new Function>, ObservableSource>>() { 32 | // @Override 33 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 34 | // return Observable.just(reply.getData()); 35 | // } 36 | // }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/NewsFragmentModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.FragmentScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.NewsFragmentContract; 7 | import com.sneider.diycode.mvp.model.api.service.NewsService; 8 | import com.sneider.diycode.mvp.model.bean.News; 9 | import com.sneider.diycode.utils.Constant; 10 | 11 | import java.util.List; 12 | 13 | import javax.inject.Inject; 14 | 15 | import io.reactivex.Observable; 16 | 17 | @FragmentScope 18 | public class NewsFragmentModel extends BaseModel implements NewsFragmentContract.Model { 19 | 20 | @Inject 21 | public NewsFragmentModel(IRepositoryManager repositoryManager) { 22 | super(repositoryManager); 23 | } 24 | 25 | @Override 26 | public Observable> getNews(int offset, boolean update) { 27 | Observable> news = mRepositoryManager.obtainRetrofitService(NewsService.class) 28 | .getNews(null, offset, Constant.PAGE_SIZE); 29 | return news; 30 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 31 | // .getNews(news, new DynamicKeyGroup(0, offset), new EvictDynamicKey(update)) 32 | // .flatMap(new Function>, ObservableSource>>() { 33 | // @Override 34 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 35 | // return Observable.just(reply.getData()); 36 | // } 37 | // }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/NewsListModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.NewsListContract; 7 | import com.sneider.diycode.mvp.model.api.service.NewsService; 8 | import com.sneider.diycode.mvp.model.bean.News; 9 | import com.sneider.diycode.mvp.model.bean.NewsNode; 10 | import com.sneider.diycode.utils.Constant; 11 | 12 | import java.util.List; 13 | 14 | import javax.inject.Inject; 15 | 16 | import io.reactivex.Observable; 17 | 18 | @ActivityScope 19 | public class NewsListModel extends BaseModel implements NewsListContract.Model { 20 | 21 | @Inject 22 | public NewsListModel(IRepositoryManager repositoryManager) { 23 | super(repositoryManager); 24 | } 25 | 26 | @Override 27 | public Observable> getNews(int nodeId, int offset, boolean update) { 28 | Observable> news = mRepositoryManager.obtainRetrofitService(NewsService.class) 29 | .getNews(nodeId, offset, Constant.PAGE_SIZE); 30 | return news; 31 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 32 | // .getNews(news, new DynamicKeyGroup(nodeId, offset), new EvictDynamicKey(update)) 33 | // .flatMap(new Function>, ObservableSource>>() { 34 | // @Override 35 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 36 | // return Observable.just(reply.getData()); 37 | // } 38 | // }); 39 | } 40 | 41 | @Override 42 | public Observable> getNewsNodes(boolean update) { 43 | Observable> nodes = mRepositoryManager.obtainRetrofitService(NewsService.class) 44 | .getNewsNodes(); 45 | return nodes; 46 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 47 | // .getNewsNodes(nodes, new EvictDynamicKey(update)) 48 | // .flatMap(new Function>, ObservableSource>>() { 49 | // @Override 50 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 51 | // return Observable.just(reply.getData()); 52 | // } 53 | // }); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/ProjectDetailModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.ProjectDetailContract; 7 | import com.sneider.diycode.mvp.model.api.service.ProjectService; 8 | import com.sneider.diycode.utils.Constant; 9 | 10 | import java.util.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | import io.reactivex.Observable; 15 | 16 | @ActivityScope 17 | public class ProjectDetailModel extends BaseModel implements ProjectDetailContract.Model { 18 | 19 | @Inject 20 | public ProjectDetailModel(IRepositoryManager repositoryManager) { 21 | super(repositoryManager); 22 | } 23 | 24 | @Override 25 | public Observable> getProjectReplies(int id, int offset, boolean update) { 26 | Observable> replies = mRepositoryManager.obtainRetrofitService(ProjectService.class) 27 | .getProjectReplies(id, offset, Constant.PAGE_SIZE); 28 | return replies; 29 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 30 | // .getProjectReplies(replies, new DynamicKeyGroup(id, offset), new EvictDynamicKey(update)) 31 | // .flatMap(new Function>, ObservableSource>>() { 32 | // @Override 33 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 34 | // return Observable.just(reply.getData()); 35 | // } 36 | // }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/ProjectFragmentModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.FragmentScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.ProjectFragmentContract; 7 | import com.sneider.diycode.mvp.model.api.service.ProjectService; 8 | import com.sneider.diycode.mvp.model.bean.Project; 9 | import com.sneider.diycode.utils.Constant; 10 | 11 | import java.util.List; 12 | 13 | import javax.inject.Inject; 14 | 15 | import io.reactivex.Observable; 16 | 17 | @FragmentScope 18 | public class ProjectFragmentModel extends BaseModel implements ProjectFragmentContract.Model { 19 | 20 | @Inject 21 | public ProjectFragmentModel(IRepositoryManager repositoryManager) { 22 | super(repositoryManager); 23 | } 24 | 25 | @Override 26 | public Observable> getProjects(int offset, boolean update) { 27 | Observable> projects = mRepositoryManager.obtainRetrofitService(ProjectService.class) 28 | .getProjects(null, offset, Constant.PAGE_SIZE); 29 | return projects; 30 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 31 | // .getProjects(projects, new DynamicKey(offset), new EvictDynamicKey(update)) 32 | // .flatMap(new Function>, ObservableSource>>() { 33 | // @Override 34 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 35 | // return Observable.just(reply.getData()); 36 | // } 37 | // }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/ReplyListModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.ReplyListContract; 7 | import com.sneider.diycode.mvp.model.api.service.UserService; 8 | import com.sneider.diycode.utils.Constant; 9 | 10 | import java.util.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | import io.reactivex.Observable; 15 | 16 | @ActivityScope 17 | public class ReplyListModel extends BaseModel implements ReplyListContract.Model { 18 | 19 | @Inject 20 | public ReplyListModel(IRepositoryManager repositoryManager) { 21 | super(repositoryManager); 22 | } 23 | 24 | @Override 25 | public Observable> getUserReplies(String username, int offset, boolean update) { 26 | Observable> replies = mRepositoryManager.obtainRetrofitService(UserService.class) 27 | .getUserReplies(username, Constant.ORDER, offset, Constant.PAGE_SIZE); 28 | return replies; 29 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 30 | // .getUserReplies(replies, new DynamicKeyGroup(username, offset), new EvictDynamicKey(update)) 31 | // .flatMap(new Function>, ObservableSource>>() { 32 | // @Override 33 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 34 | // return Observable.just(reply.getData()); 35 | // } 36 | // }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/SettingModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.SettingContract; 7 | import com.sneider.diycode.mvp.model.api.service.CommonService; 8 | import com.sneider.diycode.mvp.model.bean.Ok; 9 | 10 | import javax.inject.Inject; 11 | 12 | import io.reactivex.Observable; 13 | 14 | @ActivityScope 15 | public class SettingModel extends BaseModel implements SettingContract.Model { 16 | 17 | @Inject 18 | public SettingModel(IRepositoryManager repositoryManager) { 19 | super(repositoryManager); 20 | } 21 | 22 | @Override 23 | public Observable logout(String platform, String token) { 24 | Observable ok = mRepositoryManager.obtainRetrofitService(CommonService.class) 25 | .deletedevice(platform, token); 26 | return ok; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/SitesModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.SitesContract; 7 | import com.sneider.diycode.mvp.model.api.service.CommonService; 8 | import com.sneider.diycode.mvp.model.bean.Sites; 9 | 10 | import java.util.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | import io.reactivex.Observable; 15 | 16 | @ActivityScope 17 | public class SitesModel extends BaseModel implements SitesContract.Model { 18 | 19 | @Inject 20 | public SitesModel(IRepositoryManager repositoryManager) { 21 | super(repositoryManager); 22 | } 23 | 24 | @Override 25 | public Observable> getSites(int offset, boolean update) { 26 | Observable> sites = mRepositoryManager.obtainRetrofitService(CommonService.class) 27 | .getSites(); 28 | return sites; 29 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 30 | // .getSites(sites, new DynamicKey(offset), new EvictDynamicKey(update)) 31 | // .flatMap(new Function>, ObservableSource>>() { 32 | // @Override 33 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 34 | // return Observable.just(reply.getData()); 35 | // } 36 | // }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/TopicFragmentModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.FragmentScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.TopicFragmentContract; 7 | import com.sneider.diycode.mvp.model.api.service.TopicService; 8 | import com.sneider.diycode.mvp.model.bean.Ok; 9 | import com.sneider.diycode.mvp.model.bean.Topic; 10 | import com.sneider.diycode.utils.Constant; 11 | 12 | import java.util.List; 13 | 14 | import javax.inject.Inject; 15 | 16 | import io.reactivex.Observable; 17 | 18 | @FragmentScope 19 | public class TopicFragmentModel extends BaseModel implements TopicFragmentContract.Model { 20 | 21 | @Inject 22 | public TopicFragmentModel(IRepositoryManager repositoryManager) { 23 | super(repositoryManager); 24 | } 25 | 26 | @Override 27 | public Observable> getTopics(int offset, boolean update) { 28 | Observable> topics = mRepositoryManager.obtainRetrofitService(TopicService.class) 29 | .getTopics(null, null, offset, Constant.PAGE_SIZE); 30 | return topics; 31 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 32 | // .getTopics(topics, new DynamicKeyGroup(0, offset), new EvictDynamicKey(update)) 33 | // .flatMap(new Function>, ObservableSource>>() { 34 | // @Override 35 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 36 | // return Observable.just(reply.getData()); 37 | // } 38 | // }); 39 | } 40 | 41 | @Override 42 | public Observable favoriteTopic(int id) { 43 | return mRepositoryManager.obtainRetrofitService(TopicService.class) 44 | .favoriteTopic(id); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/TopicReplyModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.TopicReplyContract; 7 | import com.sneider.diycode.mvp.model.api.service.TopicService; 8 | import com.sneider.diycode.utils.Constant; 9 | 10 | import java.util.List; 11 | 12 | import javax.inject.Inject; 13 | 14 | import io.reactivex.Observable; 15 | 16 | @ActivityScope 17 | public class TopicReplyModel extends BaseModel implements TopicReplyContract.Model { 18 | 19 | @Inject 20 | public TopicReplyModel(IRepositoryManager repositoryManager) { 21 | super(repositoryManager); 22 | } 23 | 24 | @Override 25 | public Observable> getTopicReplies(int id, int offset, boolean update) { 26 | Observable> replies = mRepositoryManager.obtainRetrofitService(TopicService.class) 27 | .getTopicReplies(id, offset, Constant.PAGE_SIZE); 28 | return replies; 29 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 30 | // .getTopicReplies(replies, new DynamicKeyGroup(id, offset), new EvictDynamicKey(update)) 31 | // .flatMap(new Function>, ObservableSource>>() { 32 | // @Override 33 | // public ObservableSource> apply(@NonNull Reply> reply) throws Exception { 34 | // return Observable.just(reply.getData()); 35 | // } 36 | // }); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/UserDetailModel.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model; 2 | 3 | import com.jess.arms.di.scope.ActivityScope; 4 | import com.jess.arms.integration.IRepositoryManager; 5 | import com.jess.arms.mvp.BaseModel; 6 | import com.sneider.diycode.mvp.contract.UserDetailContract; 7 | import com.sneider.diycode.mvp.model.api.service.UserService; 8 | import com.sneider.diycode.mvp.model.bean.Ok; 9 | import com.sneider.diycode.mvp.model.bean.User; 10 | 11 | import javax.inject.Inject; 12 | 13 | import io.reactivex.Observable; 14 | 15 | @ActivityScope 16 | public class UserDetailModel extends BaseModel implements UserDetailContract.Model { 17 | 18 | @Inject 19 | public UserDetailModel(IRepositoryManager repositoryManager) { 20 | super(repositoryManager); 21 | } 22 | 23 | @Override 24 | public Observable getUserInfo(String username, boolean update) { 25 | Observable user = mRepositoryManager.obtainRetrofitService(UserService.class) 26 | .getUserInfo(username); 27 | return user; 28 | // return mRepositoryManager.obtainCacheService(CommonCache.class) 29 | // .getUserInfo(user, new DynamicKey(username), new EvictDynamicKey(update)) 30 | // .flatMap(new Function, ObservableSource>() { 31 | // @Override 32 | // public ObservableSource apply(@NonNull Reply reply) throws Exception { 33 | // return Observable.just(reply.getData()); 34 | // } 35 | // }); 36 | } 37 | 38 | @Override 39 | public Observable followUser(String username) { 40 | Observable ok = mRepositoryManager.obtainRetrofitService(UserService.class) 41 | .followUser(username); 42 | return ok; 43 | } 44 | 45 | @Override 46 | public Observable blockUser(String username) { 47 | Observable ok = mRepositoryManager.obtainRetrofitService(UserService.class) 48 | .blockUser(username); 49 | return ok; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/api/service/CommonService.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.api.service; 2 | 3 | import com.sneider.diycode.mvp.model.bean.ImageResult; 4 | import com.sneider.diycode.mvp.model.bean.Like; 5 | import com.sneider.diycode.mvp.model.bean.Ok; 6 | import com.sneider.diycode.mvp.model.bean.Sites; 7 | import com.sneider.diycode.mvp.model.bean.Token; 8 | import com.sneider.diycode.utils.Constant; 9 | 10 | import java.util.List; 11 | 12 | import io.reactivex.Observable; 13 | import okhttp3.MultipartBody; 14 | import retrofit2.http.DELETE; 15 | import retrofit2.http.Field; 16 | import retrofit2.http.FormUrlEncoded; 17 | import retrofit2.http.GET; 18 | import retrofit2.http.Multipart; 19 | import retrofit2.http.POST; 20 | import retrofit2.http.Part; 21 | import retrofit2.http.Query; 22 | 23 | public interface CommonService { 24 | 25 | /** 26 | * 获取token 27 | */ 28 | @FormUrlEncoded 29 | @POST(Constant.OAUTH_URL) 30 | Observable getToken(@Field("client_id") String client_id, 31 | @Field("client_secret") String client_secret, 32 | @Field("grant_type") String grant_type, 33 | @Field("username") String username, 34 | @Field("password") String password); 35 | 36 | /** 37 | * 更新设备 38 | */ 39 | @FormUrlEncoded 40 | @POST("devices.json") 41 | Observable updatedevice(@Field("platform") String platform, 42 | @Field("token") String token); 43 | 44 | /** 45 | * 删除设备 46 | */ 47 | @DELETE("devices.json") 48 | Observable deletedevice(@Query("platform") String platform, 49 | @Query("token") String token); 50 | 51 | /** 52 | * 点赞 53 | */ 54 | @FormUrlEncoded 55 | @POST("likes.json") 56 | Observable like(@Field("obj_type") String obj_type, 57 | @Field("obj_id") Integer obj_id); 58 | 59 | /** 60 | * 取消点赞 61 | */ 62 | @DELETE("likes.json") 63 | Observable unlike(@Query("obj_type") String obj_type, 64 | @Query("obj_id") Integer obj_id); 65 | 66 | /** 67 | * 获取Site列表 68 | */ 69 | @GET("sites.json") 70 | Observable> getSites(); 71 | 72 | /** 73 | * 上传图片 74 | */ 75 | @Multipart 76 | @POST("photos.json") 77 | Observable uploadPhoto(@Part MultipartBody.Part file); 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/api/service/NewsService.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.api.service; 2 | 3 | import com.sneider.diycode.mvp.model.bean.News; 4 | import com.sneider.diycode.mvp.model.bean.NewsNode; 5 | import com.sneider.diycode.mvp.model.bean.Reply; 6 | 7 | import java.util.List; 8 | 9 | import io.reactivex.Observable; 10 | import retrofit2.http.Field; 11 | import retrofit2.http.FormUrlEncoded; 12 | import retrofit2.http.GET; 13 | import retrofit2.http.POST; 14 | import retrofit2.http.Path; 15 | import retrofit2.http.Query; 16 | 17 | public interface NewsService { 18 | 19 | /** 20 | * 获取News列表 21 | */ 22 | @GET("news.json") 23 | Observable> getNews(@Query("node_id") Integer node_id, 24 | @Query("offset") Integer offset, 25 | @Query("limit") Integer limit); 26 | 27 | /** 28 | * 获取News的回复列表 29 | */ 30 | @GET("news/{id}/replies.json") 31 | Observable> getNewsReplies(@Path("id") Integer id, 32 | @Query("offset") Integer offset, 33 | @Query("limit") Integer limit); 34 | 35 | /** 36 | * 获取News的节点列表 37 | */ 38 | @GET("news/nodes.json") 39 | Observable> getNewsNodes(); 40 | 41 | /** 42 | * 创建News 43 | */ 44 | @FormUrlEncoded 45 | @POST("/news.json") 46 | Observable createNews(@Field("title") String title, 47 | @Field("address") String address, 48 | @Field("node_id") Integer node_id); 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/api/service/NotificationService.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.api.service; 2 | 3 | import com.sneider.diycode.mvp.model.bean.Count; 4 | import com.sneider.diycode.mvp.model.bean.Notification; 5 | import com.sneider.diycode.mvp.model.bean.Ok; 6 | 7 | import java.util.List; 8 | 9 | import io.reactivex.Observable; 10 | import retrofit2.http.DELETE; 11 | import retrofit2.http.Field; 12 | import retrofit2.http.FormUrlEncoded; 13 | import retrofit2.http.GET; 14 | import retrofit2.http.POST; 15 | import retrofit2.http.Path; 16 | import retrofit2.http.Query; 17 | 18 | public interface NotificationService { 19 | 20 | /** 21 | * 获取通知列表 22 | */ 23 | @GET("notifications.json") 24 | Observable> getNotifications(@Query("offset") Integer offset, 25 | @Query("limit") Integer limit); 26 | 27 | /** 28 | * 获取未读通知数量 29 | */ 30 | @GET("notifications/unread_count.json") 31 | Observable getUnreadCount(); 32 | 33 | /** 34 | * 标记通知已读 35 | */ 36 | @FormUrlEncoded 37 | @POST("notifications/read.json") 38 | Observable readNotification(@Field("ids") int[] ids); 39 | 40 | /** 41 | * 删除通知 42 | */ 43 | @DELETE("notifications/{id}.json") 44 | Observable deleteNotification(@Path("id") Integer id); 45 | 46 | /** 47 | * 删除全部通知 48 | */ 49 | @DELETE("notifications/all.json") 50 | Observable deleteAllNotifications(); 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/api/service/ProjectService.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.api.service; 2 | 3 | import com.sneider.diycode.mvp.model.bean.Ok; 4 | import com.sneider.diycode.mvp.model.bean.Project; 5 | import com.sneider.diycode.mvp.model.bean.Reply; 6 | 7 | import java.util.List; 8 | 9 | import io.reactivex.Observable; 10 | import retrofit2.http.DELETE; 11 | import retrofit2.http.Field; 12 | import retrofit2.http.FormUrlEncoded; 13 | import retrofit2.http.GET; 14 | import retrofit2.http.POST; 15 | import retrofit2.http.Path; 16 | import retrofit2.http.Query; 17 | 18 | public interface ProjectService { 19 | 20 | /** 21 | * 获取Project列表 22 | */ 23 | @GET("projects.json") 24 | Observable> getProjects(@Query("node_id") Integer node_id, 25 | @Query("offset") Integer offset, 26 | @Query("limit") Integer limit); 27 | 28 | /** 29 | * 获取Project的回复列表 30 | */ 31 | @GET("projects/{id}/replies.json") 32 | Observable> getProjectReplies(@Path("id") Integer id, 33 | @Query("offset") Integer offset, 34 | @Query("limit") Integer limit); 35 | 36 | /** 37 | * 获取Project的回复详情 38 | */ 39 | @GET("project_replies/{id}.json") 40 | Observable getProjectReply(@Path("id") Integer id); 41 | 42 | /** 43 | * 更新Project的回复 44 | */ 45 | @FormUrlEncoded 46 | @POST("project_replies/{id}.json") 47 | Observable updateProjectReply(@Path("id") Integer id, 48 | @Field("body") String body); 49 | 50 | /** 51 | * 删除Project的回复 52 | */ 53 | @DELETE("project_replies/{id}.json") 54 | Observable deleteProjectReply(@Path("id") Integer id); 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Abilities.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Abilities implements Serializable { 6 | 7 | /** 8 | * update : false 9 | * destroy : false 10 | */ 11 | 12 | private boolean update; 13 | private boolean destroy; 14 | 15 | public boolean isUpdate() { 16 | return update; 17 | } 18 | 19 | public void setUpdate(boolean update) { 20 | this.update = update; 21 | } 22 | 23 | public boolean isDestroy() { 24 | return destroy; 25 | } 26 | 27 | public void setDestroy(boolean destroy) { 28 | this.destroy = destroy; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Count.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Count implements Serializable { 6 | 7 | /** 8 | * count : 0 9 | */ 10 | 11 | private int count; 12 | 13 | public int getCount() { 14 | return count; 15 | } 16 | 17 | public void setCount(int count) { 18 | this.count = count; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/ImageResult.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class ImageResult implements Serializable { 6 | 7 | /** 8 | * image_url : 9 | */ 10 | 11 | private String image_url; 12 | 13 | public String getImage_url() { 14 | return image_url; 15 | } 16 | 17 | public void setImage_url(String image_url) { 18 | this.image_url = image_url; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Like.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Like implements Serializable { 6 | 7 | /** 8 | * obj_type : topic 9 | * obj_id : 648 10 | * count : 2 11 | */ 12 | 13 | private String obj_type; 14 | private int obj_id; 15 | private int count; 16 | 17 | public String getObj_type() { 18 | return obj_type; 19 | } 20 | 21 | public void setObj_type(String obj_type) { 22 | this.obj_type = obj_type; 23 | } 24 | 25 | public int getObj_id() { 26 | return obj_id; 27 | } 28 | 29 | public void setObj_id(int obj_id) { 30 | this.obj_id = obj_id; 31 | } 32 | 33 | public int getCount() { 34 | return count; 35 | } 36 | 37 | public void setCount(int count) { 38 | this.count = count; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/NewsNode.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class NewsNode implements Serializable { 6 | 7 | /** 8 | * id : 1 9 | * name : Android 10 | */ 11 | 12 | private int id; 13 | private String name; 14 | 15 | public int getId() { 16 | return id; 17 | } 18 | 19 | public void setId(int id) { 20 | this.id = id; 21 | } 22 | 23 | public String getName() { 24 | return name; 25 | } 26 | 27 | public void setName(String name) { 28 | this.name = name; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Node.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Node implements Serializable { 6 | 7 | /** 8 | * id : 1 9 | * name : Android 10 | * topics_count : 299 11 | * summary : Android是一个以Linux为基础的半开源操作系统,主要用于移动设备,由Google和开放手持设备联盟开发与领导。 Android 系统最初由安迪·鲁宾(Andy Rubin)制作,最初主要支持手机。2005年8月17日被Google收购。2007年11月5日,Google与84家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟(Open Handset Alliance)来共同研发改良Android系统并生产搭载Android的智慧型手机,并逐渐拓展到平板电脑及其他领域上。随后,Google以Apache免费开源许可证的授权方式,发布了Android的源代码。 12 | * section_id : 1 13 | * sort : 0 14 | * section_name : Mobile Dev 15 | * updated_at : 2016-03-29T12:42:55.971+08:00 16 | */ 17 | 18 | private int id; 19 | private String name; 20 | private int topics_count; 21 | private String summary; 22 | private int section_id; 23 | private int sort; 24 | private String section_name; 25 | private String updated_at; 26 | 27 | public int getId() { 28 | return id; 29 | } 30 | 31 | public void setId(int id) { 32 | this.id = id; 33 | } 34 | 35 | public String getName() { 36 | return name; 37 | } 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | 43 | public int getTopics_count() { 44 | return topics_count; 45 | } 46 | 47 | public void setTopics_count(int topics_count) { 48 | this.topics_count = topics_count; 49 | } 50 | 51 | public String getSummary() { 52 | return summary; 53 | } 54 | 55 | public void setSummary(String summary) { 56 | this.summary = summary; 57 | } 58 | 59 | public int getSection_id() { 60 | return section_id; 61 | } 62 | 63 | public void setSection_id(int section_id) { 64 | this.section_id = section_id; 65 | } 66 | 67 | public int getSort() { 68 | return sort; 69 | } 70 | 71 | public void setSort(int sort) { 72 | this.sort = sort; 73 | } 74 | 75 | public String getSection_name() { 76 | return section_name; 77 | } 78 | 79 | public void setSection_name(String section_name) { 80 | this.section_name = section_name; 81 | } 82 | 83 | public String getUpdated_at() { 84 | return updated_at; 85 | } 86 | 87 | public void setUpdated_at(String updated_at) { 88 | this.updated_at = updated_at; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Ok.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Ok implements Serializable { 6 | 7 | /** 8 | * ok : 1 9 | */ 10 | 11 | private int ok; 12 | 13 | public int getOk() { 14 | return ok; 15 | } 16 | 17 | public void setOk(int ok) { 18 | this.ok = ok; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Section.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | public class Section implements Serializable { 8 | 9 | private int id; 10 | private String name; 11 | private List nodes = new ArrayList(); 12 | private boolean selected; 13 | 14 | public Section(int id, String name) { 15 | this.id = id; 16 | this.name = name; 17 | } 18 | 19 | public int getId() { 20 | return id; 21 | } 22 | 23 | public void setId(int id) { 24 | this.id = id; 25 | } 26 | 27 | public String getName() { 28 | return name; 29 | } 30 | 31 | public void setName(String name) { 32 | this.name = name; 33 | } 34 | 35 | public List getNodes() { 36 | return nodes; 37 | } 38 | 39 | public void setNodes(List nodes) { 40 | this.nodes = nodes; 41 | } 42 | 43 | public boolean isSelected() { 44 | return selected; 45 | } 46 | 47 | public void setSelected(boolean selected) { 48 | this.selected = selected; 49 | } 50 | 51 | @Override 52 | public boolean equals(Object obj) { 53 | if (obj instanceof Section) { 54 | Section section = (Section) obj; 55 | return section.getId() == this.getId(); 56 | } else { 57 | return false; 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Sites.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | public class Sites implements Serializable { 7 | 8 | /** 9 | * sites : [] 10 | * name : FUN & COOL 11 | * id : 18 12 | */ 13 | 14 | private String name; 15 | private int id; 16 | private List sites; 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | public void setName(String name) { 23 | this.name = name; 24 | } 25 | 26 | public int getId() { 27 | return id; 28 | } 29 | 30 | public void setId(int id) { 31 | this.id = id; 32 | } 33 | 34 | public List getSites() { 35 | return sites; 36 | } 37 | 38 | public void setSites(List sites) { 39 | this.sites = sites; 40 | } 41 | 42 | public static class SitesBean implements Serializable { 43 | 44 | /** 45 | * name : botlist 46 | * url : http://botlist.co 47 | * avatar_url : https://favicon.b0.upaiyun.com/ip2/botlist.co.ico 48 | */ 49 | 50 | private String name; 51 | private String url; 52 | private String avatar_url; 53 | 54 | public String getName() { 55 | return name; 56 | } 57 | 58 | public void setName(String name) { 59 | this.name = name; 60 | } 61 | 62 | public String getUrl() { 63 | return url; 64 | } 65 | 66 | public void setUrl(String url) { 67 | this.url = url; 68 | } 69 | 70 | public String getAvatar_url() { 71 | return avatar_url; 72 | } 73 | 74 | public void setAvatar_url(String avatar_url) { 75 | this.avatar_url = avatar_url; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/Token.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import com.google.gson.Gson; 4 | 5 | import java.io.Serializable; 6 | 7 | public class Token implements Serializable { 8 | 9 | /** 10 | * access_token : e38f290f8b97d36f44dd0121ee481621775eb4c8b3ca850cefb81063f5d6db27 11 | * token_type : bearer 12 | * expires_in : 5184000 13 | * refresh_token : c66f37132fa127732ec66bd34076290a5d96fa6533f933f6622dc33ea4605764 14 | * created_at : 1489999125 15 | */ 16 | 17 | private String access_token; 18 | private String token_type; 19 | private int expires_in; 20 | private String refresh_token; 21 | private int created_at; 22 | 23 | public String getAccess_token() { 24 | return access_token; 25 | } 26 | 27 | public void setAccess_token(String access_token) { 28 | this.access_token = access_token; 29 | } 30 | 31 | public String getToken_type() { 32 | return token_type; 33 | } 34 | 35 | public void setToken_type(String token_type) { 36 | this.token_type = token_type; 37 | } 38 | 39 | public int getExpires_in() { 40 | return expires_in; 41 | } 42 | 43 | public void setExpires_in(int expires_in) { 44 | this.expires_in = expires_in; 45 | } 46 | 47 | public String getRefresh_token() { 48 | return refresh_token; 49 | } 50 | 51 | public void setRefresh_token(String refresh_token) { 52 | this.refresh_token = refresh_token; 53 | } 54 | 55 | public int getCreated_at() { 56 | return created_at; 57 | } 58 | 59 | public void setCreated_at(int created_at) { 60 | this.created_at = created_at; 61 | } 62 | 63 | @Override 64 | public String toString() { 65 | return new Gson().toJson(this); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/model/bean/UserBean.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.model.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | public class UserBean implements Serializable { 6 | 7 | /** 8 | * id : 2735 9 | * login : sword 10 | * name : ice_Anson 11 | * avatar_url : https://diycode.cc/system/letter_avatars/2/S/162_136_126/240.png 12 | */ 13 | 14 | private int id; 15 | private String login; 16 | private String name; 17 | private String avatar_url; 18 | 19 | public int getId() { 20 | return id; 21 | } 22 | 23 | public void setId(int id) { 24 | this.id = id; 25 | } 26 | 27 | public String getLogin() { 28 | return login; 29 | } 30 | 31 | public void setLogin(String login) { 32 | this.login = login; 33 | } 34 | 35 | public String getName() { 36 | return name; 37 | } 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | 43 | public String getAvatar_url() { 44 | return avatar_url; 45 | } 46 | 47 | public void setAvatar_url(String avatar_url) { 48 | this.avatar_url = avatar_url; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/presenter/MainPresenter.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.presenter; 2 | 3 | import android.app.Application; 4 | 5 | import com.jess.arms.di.scope.ActivityScope; 6 | import com.jess.arms.integration.AppManager; 7 | import com.jess.arms.mvp.BasePresenter; 8 | import com.sneider.diycode.event.GetUnreadCountEvent; 9 | import com.sneider.diycode.mvp.contract.MainContract; 10 | import com.sneider.diycode.mvp.model.bean.Count; 11 | 12 | import org.simple.eventbus.EventBus; 13 | 14 | import javax.inject.Inject; 15 | 16 | import io.reactivex.android.schedulers.AndroidSchedulers; 17 | import io.reactivex.annotations.NonNull; 18 | import io.reactivex.schedulers.Schedulers; 19 | import me.jessyan.rxerrorhandler.core.RxErrorHandler; 20 | import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber; 21 | import me.jessyan.rxerrorhandler.handler.RetryWithDelay; 22 | 23 | @ActivityScope 24 | public class MainPresenter extends BasePresenter { 25 | 26 | private Application mApplication; 27 | private AppManager mAppManager; 28 | private RxErrorHandler mErrorHandler; 29 | 30 | @Inject 31 | public MainPresenter(MainContract.Model model, MainContract.View rootView, RxErrorHandler handler, AppManager appManager, Application application) { 32 | super(model, rootView); 33 | this.mApplication = application; 34 | this.mAppManager = appManager; 35 | this.mErrorHandler = handler; 36 | } 37 | 38 | public void getUnreadCount() { 39 | mModel.getUnreadCount() 40 | .subscribeOn(Schedulers.io()) 41 | .retryWhen(new RetryWithDelay(3, 2)) 42 | .observeOn(AndroidSchedulers.mainThread()) 43 | .subscribe(new ErrorHandleSubscriber(mErrorHandler) { 44 | @Override 45 | public void onNext(@NonNull Count data) { 46 | EventBus.getDefault().post(new GetUnreadCountEvent(data.getCount() > 0 ? true : false)); 47 | } 48 | }); 49 | } 50 | 51 | @Override 52 | public void onDestroy() { 53 | super.onDestroy(); 54 | mErrorHandler = null; 55 | mAppManager = null; 56 | mApplication = null; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/presenter/SettingPresenter.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.presenter; 2 | 3 | import android.app.Application; 4 | 5 | import com.jess.arms.di.scope.ActivityScope; 6 | import com.jess.arms.integration.AppManager; 7 | import com.jess.arms.mvp.BasePresenter; 8 | import com.sneider.diycode.mvp.contract.SettingContract; 9 | 10 | import javax.inject.Inject; 11 | 12 | import me.jessyan.rxerrorhandler.core.RxErrorHandler; 13 | 14 | @ActivityScope 15 | public class SettingPresenter extends BasePresenter { 16 | 17 | private Application mApplication; 18 | private AppManager mAppManager; 19 | private RxErrorHandler mErrorHandler; 20 | 21 | @Inject 22 | public SettingPresenter(SettingContract.Model model, SettingContract.View rootView, RxErrorHandler handler, AppManager appManager, Application application) { 23 | super(model, rootView); 24 | mApplication = application; 25 | mAppManager = appManager; 26 | mErrorHandler = handler; 27 | } 28 | 29 | @Override 30 | public void onDestroy() { 31 | super.onDestroy(); 32 | mErrorHandler = null; 33 | mAppManager = null; 34 | mApplication = null; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/ui/adapter/NodeListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.ui.adapter; 2 | 3 | import android.view.View; 4 | import android.widget.TextView; 5 | 6 | import com.jess.arms.base.BaseHolder; 7 | import com.jess.arms.base.DefaultAdapter; 8 | import com.sneider.diycode.R; 9 | import com.sneider.diycode.mvp.model.bean.Node; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | import butterknife.BindView; 15 | 16 | public class NodeListAdapter extends DefaultAdapter { 17 | 18 | public NodeListAdapter(List infos) { 19 | super(infos); 20 | } 21 | 22 | public void addData(List data) { 23 | if (mInfos == null) mInfos = new ArrayList<>(); 24 | mInfos.addAll(data); 25 | notifyDataSetChanged(); 26 | } 27 | 28 | public void clearData() { 29 | if (mInfos != null) mInfos.clear(); 30 | if (mLastView != null) mLastView.setSelected(false); 31 | notifyDataSetChanged(); 32 | } 33 | 34 | private OnItemClickListener mOnItemClickListener; 35 | private View mLastView; 36 | 37 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 38 | mOnItemClickListener = onItemClickListener; 39 | } 40 | 41 | @Override 42 | public BaseHolder getHolder(View v, int viewType) { 43 | return new NodeItemHolder(v); 44 | } 45 | 46 | @Override 47 | public int getLayoutId(int viewType) { 48 | return R.layout.item_node; 49 | } 50 | 51 | class NodeItemHolder extends BaseHolder { 52 | 53 | @BindView(R.id.tv_name) TextView mTvName; 54 | 55 | NodeItemHolder(View itemView) { 56 | super(itemView); 57 | } 58 | 59 | @Override 60 | public void setData(Node data, int position) { 61 | mTvName.setText(data.getName()); 62 | itemView.setTag(data); 63 | itemView.setOnClickListener(this); 64 | } 65 | 66 | @Override 67 | public void onClick(View v) { 68 | if (mOnItemClickListener != null) { 69 | if (mLastView != null) mLastView.setSelected(false); 70 | v.setSelected(true); 71 | mLastView = v; 72 | mOnItemClickListener.onItemClick(v, (Node) v.getTag()); 73 | } 74 | } 75 | } 76 | 77 | public interface OnItemClickListener { 78 | 79 | void onItemClick(View view, Node data); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/ui/adapter/ReplyListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.ui.adapter; 2 | 3 | import android.view.View; 4 | import android.widget.TextView; 5 | 6 | import com.jess.arms.base.BaseHolder; 7 | import com.jess.arms.base.DefaultAdapter; 8 | import com.sneider.diycode.R; 9 | import com.sneider.diycode.mvp.model.bean.Reply; 10 | import com.sneider.diycode.utils.DateUtils; 11 | import com.sneider.diycode.utils.html.HtmlUtils; 12 | 13 | import java.util.List; 14 | 15 | import butterknife.BindView; 16 | 17 | public class ReplyListAdapter extends DefaultAdapter { 18 | 19 | public ReplyListAdapter(List infos) { 20 | super(infos); 21 | } 22 | 23 | @Override 24 | public BaseHolder getHolder(View v, int viewType) { 25 | return new ReplyItemHolder(v); 26 | } 27 | 28 | @Override 29 | public int getLayoutId(int viewType) { 30 | return R.layout.item_reply_user; 31 | } 32 | 33 | private OnItemClickListener mOnItemClickListener; 34 | private HtmlUtils.Callback mCallback; 35 | 36 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 37 | mOnItemClickListener = onItemClickListener; 38 | } 39 | 40 | public void setCallback(HtmlUtils.Callback callBack) { 41 | mCallback = callBack; 42 | } 43 | 44 | class ReplyItemHolder extends BaseHolder { 45 | 46 | @BindView(R.id.tv_title) TextView mTvTitle; 47 | @BindView(R.id.tv_time) TextView mTvTime; 48 | @BindView(R.id.tv_content) TextView mTvContent; 49 | 50 | ReplyItemHolder(View itemView) { 51 | super(itemView); 52 | } 53 | 54 | @Override 55 | public void setData(Reply data, int position) { 56 | mTvTitle.setText(data.getTopic_title()); 57 | String intervalTime = DateUtils.getIntervalTime(data.getCreated_at()); 58 | mTvTime.setText(intervalTime); 59 | HtmlUtils.parseHtmlAndSetText(itemView.getContext(), data.getBody_html(), mTvContent, mCallback); 60 | itemView.setTag(data); 61 | itemView.setOnClickListener(this); 62 | } 63 | 64 | @Override 65 | public void onClick(View v) { 66 | if (mOnItemClickListener != null) { 67 | mOnItemClickListener.onItemClick(v, (Reply) v.getTag()); 68 | } 69 | } 70 | } 71 | 72 | public interface OnItemClickListener { 73 | 74 | void onItemClick(View view, Reply data); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/ui/adapter/SectionListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.ui.adapter; 2 | 3 | import android.view.View; 4 | import android.widget.TextView; 5 | 6 | import com.jess.arms.base.BaseHolder; 7 | import com.jess.arms.base.DefaultAdapter; 8 | import com.sneider.diycode.R; 9 | import com.sneider.diycode.mvp.model.bean.Section; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | import butterknife.BindView; 15 | 16 | public class SectionListAdapter extends DefaultAdapter
{ 17 | 18 | public SectionListAdapter(List
infos) { 19 | super(infos); 20 | } 21 | 22 | public void addData(List
data) { 23 | if (mInfos == null) mInfos = new ArrayList<>(); 24 | mInfos.addAll(data); 25 | notifyDataSetChanged(); 26 | } 27 | 28 | private OnItemClickListener mOnItemClickListener; 29 | private View mLastView; 30 | private boolean isInit = true; 31 | 32 | public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 33 | mOnItemClickListener = onItemClickListener; 34 | } 35 | 36 | @Override 37 | public BaseHolder
getHolder(View v, int viewType) { 38 | return new SectionItemHolder(v); 39 | } 40 | 41 | @Override 42 | public int getLayoutId(int viewType) { 43 | return R.layout.item_section; 44 | } 45 | 46 | class SectionItemHolder extends BaseHolder
{ 47 | 48 | @BindView(R.id.tv_name) TextView mTvName; 49 | 50 | SectionItemHolder(View itemView) { 51 | super(itemView); 52 | } 53 | 54 | @Override 55 | public void setData(Section data, int position) { 56 | mTvName.setText(data.getName()); 57 | itemView.setTag(data); 58 | itemView.setOnClickListener(this); 59 | if (isInit && position == 0) { 60 | itemView.performClick(); 61 | isInit = false; 62 | } 63 | } 64 | 65 | @Override 66 | public void onClick(View v) { 67 | if (mOnItemClickListener != null) { 68 | if (mLastView != null) mLastView.setSelected(false); 69 | v.setSelected(true); 70 | mLastView = v; 71 | mOnItemClickListener.onItemClick(v, (Section) v.getTag()); 72 | } 73 | } 74 | } 75 | 76 | public interface OnItemClickListener { 77 | 78 | void onItemClick(View view, Section data); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/mvp/ui/adapter/SitesAdapter.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.mvp.ui.adapter; 2 | 3 | import android.support.v7.widget.GridLayoutManager; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.jess.arms.base.App; 9 | import com.jess.arms.base.BaseHolder; 10 | import com.jess.arms.base.DefaultAdapter; 11 | import com.jess.arms.di.component.AppComponent; 12 | import com.sneider.diycode.R; 13 | import com.sneider.diycode.mvp.model.bean.Sites; 14 | import com.sneider.diycode.utils.DiycodeUtils; 15 | 16 | import java.util.List; 17 | 18 | import butterknife.BindView; 19 | 20 | public class SitesAdapter extends DefaultAdapter { 21 | 22 | public SitesAdapter(List infos) { 23 | super(infos); 24 | } 25 | 26 | @Override 27 | public BaseHolder getHolder(View v, int viewType) { 28 | return new SitesItemHolder(v); 29 | } 30 | 31 | @Override 32 | public int getLayoutId(int viewType) { 33 | return R.layout.item_sites; 34 | } 35 | 36 | class SitesItemHolder extends BaseHolder { 37 | 38 | @BindView(R.id.tv_name) TextView mTvName; 39 | @BindView(R.id.list) RecyclerView mList; 40 | 41 | private AppComponent mAppComponent; 42 | 43 | SitesItemHolder(View itemView) { 44 | super(itemView); 45 | mAppComponent = ((App) itemView.getContext().getApplicationContext()).getAppComponent(); 46 | } 47 | 48 | @Override 49 | public void setData(Sites data, int position) { 50 | mTvName.setText(data.getName()); 51 | GridLayoutManager manager = new GridLayoutManager(mAppComponent.application(), 2); 52 | mList.setLayoutManager(manager); 53 | SitesBeanAdapter adapter = new SitesBeanAdapter(data.getSites()); 54 | adapter.setOnItemClickListener((view, sitesBean) -> DiycodeUtils.openWebActivity(sitesBean.getUrl())); 55 | mList.setAdapter(adapter); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/CacheDataUtils.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils; 2 | 3 | 4 | import android.content.Context; 5 | import android.text.format.Formatter; 6 | 7 | import java.io.File; 8 | 9 | public class CacheDataUtils { 10 | 11 | public static String getTotalCacheSize(Context context) { 12 | long cacheSize = getFolderSize(context.getCacheDir()) + getFolderSize(context.getExternalCacheDir()); 13 | return Formatter.formatFileSize(context, cacheSize); 14 | } 15 | 16 | public static long getFolderSize(File file) { 17 | long size = 0; 18 | File[] fileList = file.listFiles(); 19 | for (File aFileList : fileList) { 20 | // 如果下面还有文件 21 | if (aFileList.isDirectory()) { 22 | size = size + getFolderSize(aFileList); 23 | } else { 24 | size = size + aFileList.length(); 25 | } 26 | } 27 | return size; 28 | } 29 | 30 | public static boolean clearAllCache(Context context) { 31 | return deleteDir(context.getCacheDir()) & deleteDir(context.getExternalCacheDir()); 32 | } 33 | 34 | private static boolean deleteDir(File dir) { 35 | if (dir != null && dir.isDirectory()) { 36 | String[] children = dir.list(); 37 | for (String aChildren : children) { 38 | boolean success = deleteDir(new File(dir, aChildren)); 39 | if (!success) { 40 | return false; 41 | } 42 | } 43 | } 44 | return dir.delete(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/Constant.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils; 2 | 3 | public class Constant { 4 | 5 | public static final String KEYSTORE_KEY_ALIAS = "DiyCode"; 6 | 7 | public static final String OAUTH_URL = "https://www.diycode.cc/oauth/token"; 8 | 9 | public static final String BASE_URL = "https://www.diycode.cc/api/v3/"; 10 | 11 | public static final String UPLOAD_URL = BASE_URL + "photos.json"; 12 | 13 | public static final String GRANT_TYPE_PASSWORD = "password"; 14 | 15 | public static final int PAGE_SIZE = 20; 16 | 17 | public static final String ORDER = "recent"; // "recent", ("likes", "replies") 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/DateUtils.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Date; 6 | import java.util.Locale; 7 | 8 | public class DateUtils { 9 | 10 | public static long stringToLong(String timeString) throws ParseException { 11 | SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.CHINA); 12 | Date date = formatter.parse(timeString); 13 | return date.getTime(); 14 | } 15 | 16 | public static String getIntervalTime(String timeString) { 17 | String result = ""; 18 | try { 19 | long time = stringToLong(timeString); 20 | long currentTime = System.currentTimeMillis(); 21 | long interval = (currentTime - time) / 1000; 22 | if (interval < 60) { 23 | result = "刚刚"; 24 | } else if ((interval /= 60) < 60) { 25 | result = interval + "分钟前"; 26 | } else if ((interval /= 60) < 24) { 27 | result = interval + "小时前"; 28 | } else if ((interval /= 24) < 30) { 29 | result = interval + "天前"; 30 | } else if ((interval /= 30) < 12) { 31 | result = interval + "月前"; 32 | } else { 33 | interval /= 12; 34 | result = interval + "年前"; 35 | } 36 | } catch (ParseException e) { 37 | e.printStackTrace(); 38 | } 39 | return result; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/GlideCircleTransform.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | import android.graphics.BitmapShader; 6 | import android.graphics.Canvas; 7 | import android.graphics.Paint; 8 | 9 | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 10 | import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; 11 | 12 | public class GlideCircleTransform extends BitmapTransformation { 13 | 14 | public GlideCircleTransform(Context context) { 15 | super(context); 16 | } 17 | 18 | @Override 19 | protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { 20 | return circleCrop(pool, toTransform); 21 | } 22 | 23 | private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { 24 | if (source == null) return null; 25 | 26 | int size = Math.min(source.getWidth(), source.getHeight()); 27 | int x = (source.getWidth() - size) / 2; 28 | int y = (source.getHeight() - size) / 2; 29 | 30 | // TODO this could be acquired from the pool too 31 | Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); 32 | 33 | Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); 34 | if (result == null) { 35 | result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); 36 | } 37 | 38 | Canvas canvas = new Canvas(result); 39 | Paint paint = new Paint(); 40 | paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); 41 | paint.setAntiAlias(true); 42 | float r = size / 2f; 43 | canvas.drawCircle(r, r, r, paint); 44 | return result; 45 | } 46 | 47 | @Override 48 | public String getId() { 49 | return getClass().getName(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/RxUtils.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils; 2 | 3 | import com.jess.arms.mvp.IView; 4 | import com.trello.rxlifecycle2.LifecycleProvider; 5 | import com.trello.rxlifecycle2.LifecycleTransformer; 6 | 7 | import io.reactivex.Observable; 8 | import io.reactivex.ObservableTransformer; 9 | import io.reactivex.android.schedulers.AndroidSchedulers; 10 | import io.reactivex.annotations.NonNull; 11 | import io.reactivex.disposables.Disposable; 12 | import io.reactivex.functions.Action; 13 | import io.reactivex.functions.Consumer; 14 | import io.reactivex.schedulers.Schedulers; 15 | 16 | /** 17 | * Created by jess on 11/10/2016 16:39 18 | * Contact with jess.yan.effort@gmail.com 19 | */ 20 | 21 | public class RxUtils { 22 | 23 | private RxUtils() { 24 | 25 | } 26 | 27 | public static ObservableTransformer applySchedulers(final IView view) { 28 | return new ObservableTransformer() { 29 | @Override 30 | public Observable apply(Observable observable) { 31 | return observable.subscribeOn(Schedulers.io()) 32 | .doOnSubscribe(new Consumer() { 33 | @Override 34 | public void accept(@NonNull Disposable disposable) throws Exception { 35 | view.showLoading();//显示进度条 36 | } 37 | }) 38 | .subscribeOn(AndroidSchedulers.mainThread()) 39 | .observeOn(AndroidSchedulers.mainThread()) 40 | .doAfterTerminate(new Action() { 41 | @Override 42 | public void run() { 43 | view.hideLoading();//隐藏进度条 44 | } 45 | }).compose(RxUtils.bindToLifecycle(view)); 46 | } 47 | }; 48 | } 49 | 50 | 51 | public static LifecycleTransformer bindToLifecycle(IView view) { 52 | if (view instanceof LifecycleProvider){ 53 | return ((LifecycleProvider)view).bindToLifecycle(); 54 | }else { 55 | throw new IllegalArgumentException("view isn't activity or fragment"); 56 | } 57 | 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/SecurityConstants.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils; 2 | 3 | /* 4 | * Copyright 2013 The Android Open Source Project 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | */ 18 | 19 | /** 20 | * Helper class, contains several constants used when encrypting/decrypting data 21 | * on Android. This class should not be considered a complete list of the 22 | * algorithms, keystore types, or signature types within the Android Platform, 23 | * only the more common ones. 24 | */ 25 | public class SecurityConstants { 26 | public static final String KEYSTORE_PROVIDER_ANDROID_KEYSTORE = "AndroidKeyStore"; 27 | 28 | public static final String TYPE_RSA = "RSA"; 29 | public static final String TYPE_DSA = "DSA"; 30 | public static final String TYPE_BKS = "BKS"; 31 | 32 | public static final String SIGNATURE_SHA256withRSA = "SHA256withRSA"; 33 | public static final String SIGNATURE_SHA512withRSA = "SHA512withRSA"; 34 | 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/WebImageListener.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils; 2 | 3 | import android.content.Context; 4 | import android.webkit.JavascriptInterface; 5 | 6 | import com.alibaba.android.arouter.launcher.ARouter; 7 | 8 | import java.util.ArrayList; 9 | 10 | import static com.sneider.diycode.app.ARouterPaths.PUBLIC_PHOTO; 11 | import static com.sneider.diycode.mvp.ui.activity.PhotoActivity.EXTRA_PHOTO_URL; 12 | 13 | public class WebImageListener { 14 | 15 | private Context mContext; 16 | private Class mImageActivity; 17 | private ArrayList mImages = new ArrayList<>(); 18 | 19 | public WebImageListener(Context context, Class imageActivity) { 20 | mContext = context; 21 | mImageActivity = imageActivity; 22 | } 23 | 24 | @JavascriptInterface 25 | public void collectImage(String url) { 26 | if (!url.startsWith("http") 27 | || url.startsWith("https://mp.weixin.qq.com/") 28 | || url.startsWith("https://res.wx.qq.com/") 29 | ) { 30 | return; 31 | } 32 | if (!mImages.contains(url)) 33 | mImages.add(url); 34 | } 35 | 36 | @JavascriptInterface 37 | public void onImageClicked(String url) { 38 | // Logger.e("clicked:" + url); 39 | // if (mImageActivity != null) { 40 | // Intent intent = new Intent(mContext, mImageActivity); 41 | // intent.putExtra(ImageActivity.CURRENT_IMAGE_URL, url); 42 | // intent.putExtra(ImageActivity.ALL_IMAGE_URLS, mImages); 43 | // mContext.startActivity(intent); 44 | // } 45 | ARouter.getInstance().build(PUBLIC_PHOTO) 46 | .withString(EXTRA_PHOTO_URL, url) 47 | .navigation(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/html/CodeTagHandler.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils.html; 2 | 3 | import android.graphics.Color; 4 | import android.graphics.Typeface; 5 | import android.text.Editable; 6 | import android.text.Html; 7 | import android.text.Spannable; 8 | import android.text.TextPaint; 9 | import android.text.style.StyleSpan; 10 | import android.text.style.TypefaceSpan; 11 | 12 | import org.xml.sax.XMLReader; 13 | 14 | public class CodeTagHandler implements Html.TagHandler { 15 | 16 | @Override 17 | public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { 18 | if (tag.equalsIgnoreCase("code")) { 19 | if (opening) { 20 | output.setSpan(new CodeTypefaceSpan(), output.length(), output.length(), Spannable.SPAN_MARK_MARK); 21 | } else { 22 | CodeTypefaceSpan obj = getLast(output, CodeTypefaceSpan.class); 23 | int where = output.getSpanStart(obj); 24 | output.setSpan(new CodeTypefaceSpan(), where, output.length(), 25 | Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 26 | output.setSpan(new StyleSpan(Typeface.NORMAL), where, output.length(), 27 | Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 28 | } 29 | } 30 | } 31 | 32 | private T getLast(Editable text, Class kind) { 33 | T[] objs = text.getSpans(0, text.length(), kind); 34 | if (objs.length == 0) { 35 | return null; 36 | } else { 37 | for (int i = objs.length; i > 0; i--) { 38 | if (text.getSpanFlags(objs[i - 1]) == Spannable.SPAN_MARK_MARK) { 39 | return objs[i - 1]; 40 | } 41 | } 42 | return null; 43 | } 44 | } 45 | 46 | class CodeTypefaceSpan extends TypefaceSpan { 47 | 48 | public CodeTypefaceSpan() { 49 | super("monospace"); 50 | } 51 | 52 | @Override 53 | public void updateDrawState(TextPaint ds) { 54 | super.updateDrawState(ds); 55 | ds.setColor(Color.parseColor("#999999")); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/html/UrlDrawable.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils.html; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.ColorFilter; 5 | import android.graphics.PixelFormat; 6 | import android.graphics.drawable.BitmapDrawable; 7 | import android.graphics.drawable.Drawable; 8 | 9 | public class UrlDrawable extends BitmapDrawable implements Drawable.Callback { 10 | 11 | private Drawable mDrawable; 12 | private final String mSource; 13 | 14 | public UrlDrawable(String source) { 15 | mSource = source; 16 | } 17 | 18 | public String getSource() { 19 | return mSource; 20 | } 21 | 22 | @Override 23 | public void draw(Canvas canvas) { 24 | if (mDrawable != null) { 25 | mDrawable.draw(canvas); 26 | } 27 | } 28 | 29 | @Override 30 | public void setAlpha(int alpha) { 31 | if (mDrawable != null) { 32 | mDrawable.setAlpha(alpha); 33 | } 34 | } 35 | 36 | @Override 37 | public void setColorFilter(ColorFilter cf) { 38 | if (mDrawable != null) { 39 | mDrawable.setColorFilter(cf); 40 | } 41 | } 42 | 43 | @Override 44 | public int getOpacity() { 45 | if (mDrawable != null) { 46 | return mDrawable.getOpacity(); 47 | } 48 | return PixelFormat.UNKNOWN; 49 | } 50 | 51 | public void setDrawable(Drawable drawable) { 52 | if (this.mDrawable != null) { 53 | this.mDrawable.setCallback(null); 54 | } 55 | drawable.setCallback(this); 56 | this.mDrawable = drawable; 57 | } 58 | 59 | @Override 60 | public void invalidateDrawable(Drawable who) { 61 | if (getCallback() != null) { 62 | getCallback().invalidateDrawable(who); 63 | } 64 | } 65 | 66 | @Override 67 | public void scheduleDrawable(Drawable who, Runnable what, long when) { 68 | if (getCallback() != null) { 69 | getCallback().scheduleDrawable(who, what, when); 70 | } 71 | } 72 | 73 | @Override 74 | public void unscheduleDrawable(Drawable who, Runnable what) { 75 | if (getCallback() != null) { 76 | getCallback().unscheduleDrawable(who, what); 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/utils/html/UrlDrawable1.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.utils.html; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.ColorFilter; 5 | import android.graphics.PixelFormat; 6 | import android.graphics.drawable.Drawable; 7 | 8 | import com.bumptech.glide.load.resource.drawable.GlideDrawable; 9 | 10 | public class UrlDrawable1 extends Drawable implements Drawable.Callback { 11 | 12 | private GlideDrawable mDrawable; 13 | 14 | @Override public void draw(Canvas canvas) { 15 | if (mDrawable != null) { 16 | mDrawable.draw(canvas); 17 | } 18 | } 19 | 20 | @Override public void setAlpha(int alpha) { 21 | if (mDrawable != null) { 22 | mDrawable.setAlpha(alpha); 23 | } 24 | } 25 | 26 | @Override public void setColorFilter(ColorFilter cf) { 27 | if (mDrawable != null) { 28 | mDrawable.setColorFilter(cf); 29 | } 30 | } 31 | 32 | @Override public int getOpacity() { 33 | if (mDrawable != null) { 34 | return mDrawable.getOpacity(); 35 | } 36 | return PixelFormat.UNKNOWN; 37 | } 38 | 39 | public void setDrawable(GlideDrawable drawable) { 40 | if (this.mDrawable != null) { 41 | this.mDrawable.setCallback(null); 42 | } 43 | drawable.setCallback(this); 44 | this.mDrawable = drawable; 45 | } 46 | 47 | @Override public void invalidateDrawable(Drawable who) { 48 | if (getCallback() != null) { 49 | getCallback().invalidateDrawable(who); 50 | } 51 | } 52 | 53 | @Override public void scheduleDrawable(Drawable who, Runnable what, long when) { 54 | if (getCallback() != null) { 55 | getCallback().scheduleDrawable(who, what, when); 56 | } 57 | } 58 | 59 | @Override public void unscheduleDrawable(Drawable who, Runnable what) { 60 | if (getCallback() != null) { 61 | getCallback().unscheduleDrawable(who, what); 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/widget/ScrollChildSwipeRefreshLayout.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016, The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.sneider.diycode.widget; 18 | 19 | import android.content.Context; 20 | import android.support.v4.view.ViewCompat; 21 | import android.support.v4.widget.SwipeRefreshLayout; 22 | import android.util.AttributeSet; 23 | import android.view.View; 24 | 25 | /** 26 | * Extends {@link SwipeRefreshLayout} to support non-direct descendant scrolling views. 27 | *

28 | * {@link SwipeRefreshLayout} works as expected when a scroll view is a direct child: it triggers 29 | * the refresh only when the view is on top. This class adds a way (@link #setScrollUpChild} to 30 | * define which view controls this behavior. 31 | */ 32 | public class ScrollChildSwipeRefreshLayout extends SwipeRefreshLayout { 33 | 34 | private View mScrollUpChild; 35 | 36 | public ScrollChildSwipeRefreshLayout(Context context) { 37 | super(context); 38 | } 39 | 40 | public ScrollChildSwipeRefreshLayout(Context context, AttributeSet attrs) { 41 | super(context, attrs); 42 | } 43 | 44 | @Override 45 | public boolean canChildScrollUp() { 46 | if (mScrollUpChild != null) { 47 | return ViewCompat.canScrollVertically(mScrollUpChild, -1); 48 | } 49 | return super.canChildScrollUp(); 50 | } 51 | 52 | public void setScrollUpChild(View view) { 53 | mScrollUpChild = view; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/widget/SettingRowView.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.widget; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.support.annotation.Nullable; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | import android.widget.LinearLayout; 9 | import android.widget.TextView; 10 | 11 | import com.sneider.diycode.R; 12 | 13 | public class SettingRowView extends LinearLayout { 14 | 15 | private View mRootView; 16 | private TextView mSettingTitle; 17 | private TextView mSettingDescription; 18 | 19 | public SettingRowView(Context context) { 20 | this(context, null); 21 | } 22 | 23 | public SettingRowView(Context context, @Nullable AttributeSet attrs) { 24 | this(context, attrs, 0); 25 | } 26 | 27 | public SettingRowView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 28 | super(context, attrs, defStyleAttr); 29 | mRootView = inflate(context, R.layout.view_setting_row, this); 30 | mSettingTitle = (TextView) findViewById(R.id.setting_title); 31 | mSettingDescription = (TextView) findViewById(R.id.setting_description); 32 | if (!isInEditMode()) { 33 | TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RowView); 34 | String title = a.getString(R.styleable.RowView_rowTitle); 35 | String description = a.getString(R.styleable.RowView_rowDescription); 36 | mSettingTitle.setText(title); 37 | mSettingDescription.setText(description); 38 | a.recycle(); 39 | } 40 | } 41 | 42 | public void setSettingTitle(String title) { 43 | mSettingTitle.setText(title); 44 | } 45 | 46 | public void setSettingDescription(String description) { 47 | mSettingDescription.setText(description); 48 | } 49 | 50 | @Override 51 | public void setEnabled(boolean enabled) { 52 | super.setEnabled(enabled); 53 | mRootView.setEnabled(enabled); 54 | if (enabled) { 55 | mSettingTitle.setTextColor(getResources().getColor(R.color.color_4d4d4d)); 56 | mSettingDescription.setTextColor(getResources().getColor(R.color.color_999999)); 57 | } else { 58 | int disabledTextColor = getResources().getColor(R.color.color_999999); 59 | mSettingTitle.setTextColor(disabledTextColor); 60 | mSettingDescription.setTextColor(disabledTextColor); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/widget/loadmore/LoadMoreListener.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.widget.loadmore; 2 | 3 | public interface LoadMoreListener { 4 | 5 | void onLoadMore(); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/widget/tag/TagAdapter.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.widget.tag; 2 | 3 | import android.view.View; 4 | 5 | import com.sneider.diycode.widget.FlowLayout; 6 | 7 | import java.util.ArrayList; 8 | import java.util.Arrays; 9 | import java.util.HashSet; 10 | import java.util.List; 11 | import java.util.Set; 12 | 13 | public abstract class TagAdapter { 14 | 15 | private List mTagDatas; 16 | private OnDataChangedListener mOnDataChangedListener; 17 | private HashSet mCheckedPosList = new HashSet(); 18 | 19 | public TagAdapter(List datas) { 20 | mTagDatas = datas; 21 | } 22 | 23 | public TagAdapter(T[] datas) { 24 | mTagDatas = new ArrayList(Arrays.asList(datas)); 25 | } 26 | 27 | static interface OnDataChangedListener { 28 | void onChanged(); 29 | } 30 | 31 | void setOnDataChangedListener(OnDataChangedListener listener) { 32 | mOnDataChangedListener = listener; 33 | } 34 | 35 | public void setSelectedList(int... pos) { 36 | for (int i = 0; i < pos.length; i++) 37 | mCheckedPosList.add(pos[i]); 38 | notifyDataChanged(); 39 | } 40 | 41 | public void setSelectedList(Set set) { 42 | mCheckedPosList.clear(); 43 | if (set != null) 44 | mCheckedPosList.addAll(set); 45 | notifyDataChanged(); 46 | } 47 | 48 | HashSet getPreCheckedList() { 49 | return mCheckedPosList; 50 | } 51 | 52 | public int getCount() { 53 | return mTagDatas == null ? 0 : mTagDatas.size(); 54 | } 55 | 56 | public void notifyDataChanged() { 57 | mOnDataChangedListener.onChanged(); 58 | } 59 | 60 | public T getItem(int position) { 61 | return mTagDatas.get(position); 62 | } 63 | 64 | public abstract View getView(FlowLayout parent, int position, T t); 65 | 66 | public boolean setSelected(int position, T t) { 67 | return false; 68 | } 69 | } -------------------------------------------------------------------------------- /app/src/main/java/com/sneider/diycode/widget/tag/TagView.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode.widget.tag; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.widget.Checkable; 6 | import android.widget.FrameLayout; 7 | 8 | /** 9 | * Created by zhy on 15/9/10. 10 | */ 11 | public class TagView extends FrameLayout implements Checkable { 12 | 13 | private boolean isChecked; 14 | private static final int[] CHECK_STATE = new int[]{android.R.attr.state_checked}; 15 | 16 | public TagView(Context context) { 17 | super(context); 18 | } 19 | 20 | public View getTagView() { 21 | return getChildAt(0); 22 | } 23 | 24 | @Override 25 | public int[] onCreateDrawableState(int extraSpace) { 26 | int[] states = super.onCreateDrawableState(extraSpace + 1); 27 | if (isChecked()) { 28 | mergeDrawableStates(states, CHECK_STATE); 29 | } 30 | return states; 31 | } 32 | 33 | /** 34 | * Change the checked state of the view 35 | * 36 | * @param checked The new checked state 37 | */ 38 | @Override 39 | public void setChecked(boolean checked) { 40 | if (this.isChecked != checked) { 41 | this.isChecked = checked; 42 | refreshDrawableState(); 43 | } 44 | } 45 | 46 | /** 47 | * @return The current checked state of the view 48 | */ 49 | @Override 50 | public boolean isChecked() { 51 | return isChecked; 52 | } 53 | 54 | /** 55 | * Change the checked state of the view to the inverse of its current state 56 | */ 57 | @Override 58 | public void toggle() { 59 | setChecked(!isChecked); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi/liblbs.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/jniLibs/armeabi/liblbs.so -------------------------------------------------------------------------------- /app/src/main/res/color/diycode_bottom_toolbar_apply.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/bg_recycler.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/recycler_rectangle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/logo_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/drawable-xhdpi/logo_big.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/drawable-xhdpi/logo_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/drawable-xhdpi/placeholder.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_follow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_node.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_node_checked.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_node_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_press.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_progress_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_recycler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_txt_node.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_txt_section.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_back.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_block.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_code.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_fab_reply.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favorite.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favorite_yes.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_follower.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_following.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_github.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_help.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_image.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_like.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_like_yes.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_my_reply.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notification.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notification_red.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pencil.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reply.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sites.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_topic.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wiki.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progressbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 13 | 14 | 20 | 21 | 22 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_photo.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 20 | 21 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_sites.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 19 | 20 | 21 | 26 | 27 | 33 | 34 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_web.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_image.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_news_node.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_node.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_reply_user.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 27 | 28 | 35 | 36 | 37 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_section.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_sites.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 20 | 21 | 22 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_sitesbean.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_user.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 24 | 25 | 31 | 32 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_basic_web.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 19 | 20 | 26 | 27 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_footer.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 21 | 22 | 23 | 30 | 31 | 35 | 36 | 37 | 44 | 45 | 49 | 50 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_nav_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_news_nodes.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_topic_nodes.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_setting_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_drawer.xml: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | 5 | 6 | 10 | 11 | 15 | 16 | 20 | 21 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | 38 | 39 | 43 | 44 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_popup_code_category.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | 23 | 24 | 27 | 28 | 31 | 32 | 35 | 36 | 39 | 40 | 43 | 44 | 47 | 48 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_toolbar_add_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_toolbar_detail_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_toolbar_image_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_toolbar_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_toolbar_main_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_toolbar_notification_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_toolbar_web_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 15 | 16 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 删除 6 | 7 | 8 | 9 | 收藏 10 | 11 | 12 | 13 | 取消关注 14 | 15 | 16 | 17 | 取消屏蔽 18 | 19 | 20 | 21 | 取消收藏 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @color/color_ffffff 4 | @color/color_ffffff 5 | @color/color_db3937 6 | #FFFFFF 7 | #000000 8 | #DB3937 9 | #E67473 10 | 11 | #F0F0F0 12 | #C8C8CE 13 | #999999 14 | #62646C 15 | #4D4D4D 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16dp 5 | 6 | 7 | 2dp 8 | 4dp 9 | 8dp 10 | 12dp 11 | 16dp 12 | 24dp 13 | 14 | 56dp 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/test/java/com/sneider/diycode/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.sneider.diycode; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | apply from: "config.gradle"// 这里表示引用config.gradle文件 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.3.3' 9 | // lambda 10 | classpath 'me.tatarka:gradle-retrolambda:3.6.1' 11 | // NOTE: Do not place your application dependencies here; they belong 12 | // in the individual module build.gradle files 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | jcenter() 19 | maven { url "https://jitpack.io" } 20 | maven { url "https://raw.githubusercontent.com/Pgyer/mvn_repo_pgyer/master" } 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } 27 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Mar 07 21:24:52 GMT+08:00 2017 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-3.3-all.zip 7 | -------------------------------------------------------------------------------- /screenshots/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/screenshots/1.jpg -------------------------------------------------------------------------------- /screenshots/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/screenshots/2.jpg -------------------------------------------------------------------------------- /screenshots/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/screenshots/3.jpg -------------------------------------------------------------------------------- /screenshots/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/screenshots/4.jpg -------------------------------------------------------------------------------- /screenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linsneider/DiyCodeAndroid/840e97c5d7bc1c48e1fe1bef0ebacc83467745a7/screenshots/5.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------