├── app ├── .gitignore └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── leon │ │ │ └── androidplus │ │ │ ├── event │ │ │ ├── LogoutEvent.java │ │ │ └── ScrollEvent.java │ │ │ ├── contract │ │ │ ├── BaseView.java │ │ │ ├── BasePresenter.java │ │ │ ├── AddQuestionContract.java │ │ │ ├── RegisterContract.java │ │ │ ├── AddAnswerContract.java │ │ │ ├── LoginContract.java │ │ │ ├── HotQuestionContract.java │ │ │ ├── ArticleCategoryContract.java │ │ │ ├── RecentQuestionContract.java │ │ │ ├── DynamicContract.java │ │ │ ├── HotAnswerContract.java │ │ │ ├── RecentAnswerContract.java │ │ │ └── CommentContract.java │ │ │ ├── data │ │ │ ├── SaveCallback.java │ │ │ ├── LoadCallback.java │ │ │ ├── CommentDataSource.java │ │ │ ├── ArticleDataSource.java │ │ │ ├── QuestionDataSource.java │ │ │ ├── model │ │ │ │ ├── Comment.java │ │ │ │ ├── Question.java │ │ │ │ ├── Answer.java │ │ │ │ ├── UserArticleFavourMap.java │ │ │ │ ├── Article.java │ │ │ │ ├── UserQuestionFavourMap.java │ │ │ │ └── UserAnswerFavourMap.java │ │ │ └── AnswerDataSource.java │ │ │ ├── provider │ │ │ ├── BuglyProvider.java │ │ │ └── FeedbackProvider.java │ │ │ ├── app │ │ │ ├── MyAppGlideModule.java │ │ │ ├── Constant.java │ │ │ └── AndroidPlusApp.java │ │ │ ├── di │ │ │ ├── ChildFragmentScope.java │ │ │ ├── FragmentType.java │ │ │ ├── ArticleModule.java │ │ │ ├── FragmentScoped.java │ │ │ ├── QuestionDetailModule.java │ │ │ ├── AppComponent.java │ │ │ ├── ActivityScoped.java │ │ │ ├── HomeModule.java │ │ │ ├── MainModule.java │ │ │ └── DataRepositoryModule.java │ │ │ ├── ui │ │ │ ├── fragment │ │ │ │ ├── BaseAnswerFragment.java │ │ │ │ ├── ArticleFragment.java │ │ │ │ ├── BaseMainFragment.java │ │ │ │ ├── BaseFragment.java │ │ │ │ ├── HomeFragment.java │ │ │ │ ├── DynamicFragment.java │ │ │ │ ├── HotQuestionFragment.java │ │ │ │ ├── HotAnswerFragment.java │ │ │ │ ├── QuestionFragment.java │ │ │ │ ├── RecentAnswerFragment.java │ │ │ │ └── ArticleCategoryFragment.java │ │ │ └── activity │ │ │ │ ├── SplashActivity.java │ │ │ │ ├── SettingsActivity.java │ │ │ │ ├── AboutActivity.java │ │ │ │ └── ArticleDetailActivity.java │ │ │ ├── utils │ │ │ ├── ImageQueryHandler.java │ │ │ ├── RegexUtils.java │ │ │ ├── PermissionUtils.java │ │ │ ├── TransitionUtils.java │ │ │ ├── ImageUtils.java │ │ │ └── DateUtils.java │ │ │ ├── adapter │ │ │ ├── UserAnswerAdapter.java │ │ │ ├── UserQuestionListAdapter.java │ │ │ ├── UserArticleListAdapter.java │ │ │ ├── DynamicListAdapter.java │ │ │ ├── AnswerListAdapter.java │ │ │ ├── ArticleListAdapter.java │ │ │ ├── QuestionListAdapter.java │ │ │ ├── QuestionDetailPagerAdapter.java │ │ │ ├── HomePagerAdapter.java │ │ │ ├── CommentListAdapter.java │ │ │ ├── ArticlePagerAdapter.java │ │ │ └── BaseListAdapter.java │ │ │ ├── widget │ │ │ ├── LoadingView.java │ │ │ ├── CardLoadingView.java │ │ │ ├── UserAnswerItemView.java │ │ │ ├── UserShareArticleItemView.java │ │ │ ├── UserQuestionItemView.java │ │ │ ├── CommentItemView.java │ │ │ ├── TagLayout.java │ │ │ └── DynamicItemView.java │ │ │ ├── presenter │ │ │ ├── AddQuestionPresenter.java │ │ │ ├── AddAnswerPresenter.java │ │ │ ├── RegisterPresenter.java │ │ │ ├── LoginPresenter.java │ │ │ ├── DynamicPresenter.java │ │ │ ├── ArticleCategoryPresenter.java │ │ │ ├── HotQuestionPresenter.java │ │ │ ├── RecentQuestionPresenter.java │ │ │ ├── HotAnswerPresenter.java │ │ │ ├── RecentAnswerPresenter.java │ │ │ └── CommentPresenter.java │ │ │ └── behavior │ │ │ ├── FloatingActionButtonBehavior.java │ │ │ └── MoveUpBehavior.java │ └── res │ │ ├── drawable-xxhdpi │ │ ├── ic_send.png │ │ ├── ic_comment.png │ │ ├── login_bg.png │ │ ├── ic_add_white.png │ │ ├── ic_favorite.png │ │ ├── ic_thumb_up.png │ │ ├── ic_home_black.png │ │ ├── ic_android_black.png │ │ ├── ic_favorite_solid.png │ │ ├── ic_subject_black.png │ │ ├── ic_favorite_border.png │ │ ├── profile_background.png │ │ └── ic_network_check_green.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── values │ │ ├── dimens.xml │ │ ├── colors.xml │ │ ├── arrays.xml │ │ └── styles.xml │ │ ├── xml │ │ ├── camera_provider_path.xml │ │ ├── lc_file_provider_path.xml │ │ └── bugly_provider_path.xml │ │ ├── values-v19 │ │ └── styles.xml │ │ ├── anim │ │ ├── activity_exit.xml │ │ └── activity_enter.xml │ │ ├── drawable │ │ ├── cursor_drawable.xml │ │ ├── category_item_selected.xml │ │ ├── category_item_normal.xml │ │ ├── favorite_selector.xml │ │ └── category_item_selector.xml │ │ ├── color │ │ ├── bottom_menu_selector.xml │ │ ├── button_selector.xml │ │ ├── category_item_color.xml │ │ ├── favorite_color_selector.xml │ │ └── send_button_selector.xml │ │ ├── layout │ │ ├── activity_gallery.xml │ │ ├── fragment_base_answer.xml │ │ ├── view_loading.xml │ │ ├── toolbar.xml │ │ ├── card_view_loading.xml │ │ ├── activity_about.xml │ │ ├── activity_base_list_view.xml │ │ ├── dialog_edit.xml │ │ ├── activity_add_answer.xml │ │ ├── dialog_bottom_sheet.xml │ │ ├── view_me_settings.xml │ │ ├── fragment_article.xml │ │ ├── activity_main.xml │ │ ├── view_me_own.xml │ │ ├── view_me_favour.xml │ │ ├── activity_article_detail.xml │ │ ├── fragment_base_refreshable_list.xml │ │ ├── fragment_me.xml │ │ ├── view_comment_item.xml │ │ ├── fragment_base_main.xml │ │ ├── activity_add_question.xml │ │ ├── activity_splash.xml │ │ ├── activity_settings.xml │ │ ├── view_me_header.xml │ │ ├── view_user_share_item.xml │ │ ├── activity_share_article.xml │ │ ├── view_user_answer_item.xml │ │ ├── view_user_question_item.xml │ │ ├── activity_comment.xml │ │ └── view_dynamic_item.xml │ │ ├── menu │ │ ├── publish.xml │ │ ├── home_menu.xml │ │ └── main_menu.xml │ │ ├── values-v21 │ │ └── styles.xml │ │ └── values-zh-rCN │ │ └── arrays.xml │ ├── test │ └── java │ │ └── com │ │ └── leon │ │ └── androidplus │ │ └── ExampleUnitTest.java │ └── androidTest │ └── java │ └── com │ └── leon │ └── androidplus │ └── ExampleInstrumentedTest.java ├── settings.gradle ├── img ├── book.jpg ├── demo.gif ├── main.jpg ├── me.jpg ├── group.png ├── login.jpg ├── share1.jpg ├── share2.jpg ├── article.jpg ├── comment.jpg ├── dynamic.jpg ├── feedback.jpg ├── functions.png ├── my_share.jpg ├── profile.jpg ├── register.jpg ├── structure.png ├── add_answer.jpg ├── my_favorite.jpg ├── add_question.jpg ├── answer_detail.jpg ├── hot_fragment.jpg ├── question_item.jpg └── question_detail.jpg ├── AndroidPlus.apk ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties └── gradlew.bat /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /img/book.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/book.jpg -------------------------------------------------------------------------------- /img/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/demo.gif -------------------------------------------------------------------------------- /img/main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/main.jpg -------------------------------------------------------------------------------- /img/me.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/me.jpg -------------------------------------------------------------------------------- /img/group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/group.png -------------------------------------------------------------------------------- /img/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/login.jpg -------------------------------------------------------------------------------- /img/share1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/share1.jpg -------------------------------------------------------------------------------- /img/share2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/share2.jpg -------------------------------------------------------------------------------- /AndroidPlus.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/AndroidPlus.apk -------------------------------------------------------------------------------- /img/article.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/article.jpg -------------------------------------------------------------------------------- /img/comment.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/comment.jpg -------------------------------------------------------------------------------- /img/dynamic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/dynamic.jpg -------------------------------------------------------------------------------- /img/feedback.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/feedback.jpg -------------------------------------------------------------------------------- /img/functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/functions.png -------------------------------------------------------------------------------- /img/my_share.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/my_share.jpg -------------------------------------------------------------------------------- /img/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/profile.jpg -------------------------------------------------------------------------------- /img/register.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/register.jpg -------------------------------------------------------------------------------- /img/structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/structure.png -------------------------------------------------------------------------------- /img/add_answer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/add_answer.jpg -------------------------------------------------------------------------------- /img/my_favorite.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/my_favorite.jpg -------------------------------------------------------------------------------- /img/add_question.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/add_question.jpg -------------------------------------------------------------------------------- /img/answer_detail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/answer_detail.jpg -------------------------------------------------------------------------------- /img/hot_fragment.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/hot_fragment.jpg -------------------------------------------------------------------------------- /img/question_item.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/question_item.jpg -------------------------------------------------------------------------------- /img/question_detail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/img/question_detail.jpg -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/event/LogoutEvent.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.event; 2 | 3 | public class LogoutEvent { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_send.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_comment.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/login_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/login_bg.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_add_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_add_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_favorite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_favorite.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_thumb_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_thumb_up.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_home_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_home_black.png -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/BaseView.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | public interface BaseView { 4 | //可定义View层公共的接口 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_android_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_android_black.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_favorite_solid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_favorite_solid.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_subject_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_subject_black.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_favorite_border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_favorite_border.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/profile_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/profile_background.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_network_check_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uncleleonfan/AndroidPlusJava/HEAD/app/src/main/res/drawable-xxhdpi/ic_network_check_green.png -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | public interface BasePresenter { 4 | void takeView(T view); 5 | void dropView(); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/data/SaveCallback.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.data; 2 | 3 | public interface SaveCallback { 4 | void onSaveSuccess(); 5 | void onSaveFailed(String errorMsg); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/provider/BuglyProvider.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.provider; 2 | 3 | import android.support.v4.content.FileProvider; 4 | 5 | public class BuglyProvider extends FileProvider { 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/provider/FeedbackProvider.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.provider; 2 | 3 | import android.support.v4.content.FileProvider; 4 | 5 | public class FeedbackProvider extends FileProvider { 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/data/LoadCallback.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.data; 2 | 3 | import java.util.List; 4 | 5 | public interface LoadCallback { 6 | void onLoadSuccess(List list); 7 | void onLoadFailed(String errorMsg); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8dp 5 | 8dp 6 | 7 | 35dp 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/xml/camera_provider_path.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-v19/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/activity_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Oct 02 21:46:27 CST 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-4.1-all.zip 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/app/MyAppGlideModule.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.app; 2 | 3 | import com.bumptech.glide.annotation.GlideModule; 4 | import com.bumptech.glide.module.AppGlideModule; 5 | 6 | @GlideModule 7 | public class MyAppGlideModule extends AppGlideModule { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cursor_drawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/color/bottom_menu_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/button_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/category_item_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/favorite_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/send_button_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_gallery.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/category_item_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/category_item_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/favorite_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/category_item_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/ChildFragmentScope.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | 6 | import javax.inject.Scope; 7 | 8 | @Scope 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface ChildFragmentScope { 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_base_answer.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/menu/publish.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/xml/lc_file_provider_path.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/menu/home_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/FragmentType.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import javax.inject.Qualifier; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RetentionPolicy.RUNTIME) 12 | public @interface FragmentType { 13 | String value() default ""; 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/event/ScrollEvent.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.event; 2 | 3 | public class ScrollEvent { 4 | 5 | private Direction mDirection; 6 | 7 | public ScrollEvent(Direction d) { 8 | mDirection = d; 9 | } 10 | 11 | public Direction getDirection() { 12 | return mDirection; 13 | } 14 | 15 | public enum Direction { 16 | UP, DOWN 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/AddQuestionContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | public interface AddQuestionContract { 4 | 5 | 6 | interface View extends BaseView { 7 | void onPublishSuccess(); 8 | void onPublishFailed(); 9 | } 10 | 11 | interface Presenter extends BasePresenter { 12 | void publishQuestion(String title, String des); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/ArticleModule.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import com.leon.androidplus.ui.fragment.ArticleCategoryFragment; 4 | 5 | import dagger.Module; 6 | import dagger.android.ContributesAndroidInjector; 7 | 8 | @Module 9 | abstract class ArticleModule { 10 | 11 | @ChildFragmentScope 12 | @ContributesAndroidInjector 13 | abstract ArticleCategoryFragment articleFragment(); 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/RegisterContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | public interface RegisterContract { 4 | 5 | interface View extends BaseView { 6 | void onRegisterSuccess(); 7 | void onRegisterFailed(); 8 | void onUserNameTaken(); 9 | } 10 | 11 | interface Presenter extends BasePresenter { 12 | void register(String email, String password); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/FragmentScoped.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | import javax.inject.Scope; 9 | 10 | @Scope 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target({ElementType.TYPE, ElementType.METHOD}) 13 | public @interface FragmentScoped {} 14 | -------------------------------------------------------------------------------- /app/src/main/res/xml/bugly_provider_path.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/AddAnswerContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Question; 4 | 5 | public interface AddAnswerContract { 6 | 7 | interface View extends BaseView { 8 | void onPublishAnswerSuccess(); 9 | void onPublishAnswerFailed(); 10 | } 11 | 12 | interface Presenter extends BasePresenter { 13 | void publishAnswer(String answer, Question question); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/test/java/com/leon/androidplus/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus; 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 | } -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/LoginContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | public interface LoginContract { 4 | 5 | interface View extends BaseView { 6 | void onLoginSuccess();//登陆成功 7 | void onLoginFailed();//登陆失败 8 | void onUserNamePasswordMismatch();//用户名和密码不匹配 9 | void onUserNameDoesNotExist();//用户名不存在 10 | } 11 | 12 | interface Presenter extends BasePresenter { 13 | void login(String email, String password);//登陆 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/data/CommentDataSource.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.data; 2 | 3 | import com.leon.androidplus.data.model.Answer; 4 | import com.leon.androidplus.data.model.Comment; 5 | 6 | public interface CommentDataSource { 7 | 8 | void sendComment(Answer answer, String replayTo, String comment, SaveCallback callback); 9 | 10 | void loadComments(String commentId, LoadCallback callback); 11 | 12 | void loadMoreComments(String commentId, LoadCallback loadCallback); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/card_view_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/main_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 12 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #4CAF50 4 | #388E3C 5 | #448AFF 6 | #5099cc00 7 | #50ffffff 8 | 9 | #C8E6C9 10 | #8BC34A 11 | #BDBDBD 12 | #50BDBDBD 13 | #BDBDBD 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/QuestionDetailModule.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import com.leon.androidplus.ui.fragment.HotAnswerFragment; 4 | import com.leon.androidplus.ui.fragment.RecentAnswerFragment; 5 | 6 | import dagger.Module; 7 | import dagger.android.ContributesAndroidInjector; 8 | 9 | @Module 10 | abstract class QuestionDetailModule { 11 | 12 | @FragmentScoped 13 | @ContributesAndroidInjector 14 | public abstract RecentAnswerFragment recentAnswerFragment(); 15 | 16 | @FragmentScoped 17 | @ContributesAndroidInjector 18 | public abstract HotAnswerFragment hotAnswerFragment(); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_base_list_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/AppComponent.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import javax.inject.Singleton; 4 | 5 | import dagger.Component; 6 | import dagger.android.AndroidInjector; 7 | import dagger.android.DaggerApplication; 8 | import dagger.android.support.AndroidSupportInjectionModule; 9 | 10 | @Singleton 11 | @Component(modules = { 12 | ActivityBindingModule.class, 13 | AndroidSupportInjectionModule.class, 14 | DataRepositoryModule.class}) 15 | public interface AppComponent extends AndroidInjector { 16 | 17 | @Override 18 | void inject(DaggerApplication instance); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/ui/fragment/BaseAnswerFragment.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.ui.fragment; 2 | 3 | import com.leon.androidplus.adapter.AnswerListAdapter; 4 | import com.leon.androidplus.adapter.BaseLoadingListAdapter; 5 | import com.leon.androidplus.data.model.Answer; 6 | 7 | public abstract class BaseAnswerFragment extends BaseRefreshableListFragment { 8 | 9 | @Override 10 | protected BaseLoadingListAdapter onCreateAdapter() { 11 | return new AnswerListAdapter(getContext()); 12 | } 13 | 14 | @Override 15 | public boolean isEnableScrollEvent() { 16 | return false; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/HotQuestionContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Question; 4 | 5 | import java.util.List; 6 | 7 | public interface HotQuestionContract { 8 | 9 | interface View extends BaseView { 10 | void onLoadHotQuestionSuccess(List list); 11 | void onLoadHotQuestionFailed(); 12 | 13 | void onLoadMoreHotQuestionSuccess(); 14 | void onLoadMoreHotQuestionFailed(); 15 | } 16 | 17 | interface Presenter extends BasePresenter { 18 | void loadHotQuestions(); 19 | void loadMoreHotQuestions(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/ArticleCategoryContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Article; 4 | 5 | import java.util.List; 6 | 7 | public interface ArticleCategoryContract { 8 | 9 | interface View extends BaseView { 10 | void onLoadArticleSuccess(List
articleList); 11 | void onLoadArticleFailed(); 12 | void onLoadMoreArticleSuccess(); 13 | void onLoadMoreArticleFailed(); 14 | } 15 | 16 | interface Presenter extends BasePresenter { 17 | void loadArticleByTag(int tag); 18 | void loadMoreArticleByTag(int tag); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/RecentQuestionContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Question; 4 | 5 | import java.util.List; 6 | 7 | public interface RecentQuestionContract { 8 | 9 | interface View extends BaseView { 10 | void onLoadRecentQuestionSuccess(List list); 11 | void onLoadRecentQuestionFailed(); 12 | 13 | void onLoadMoreRecentQuestionSuccess(); 14 | void onLoadMoreRecentQuestionFailed(); 15 | } 16 | 17 | interface Presenter extends BasePresenter { 18 | void loadRecentQuestions(); 19 | void loadMoreRecentQuestions(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/DynamicContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Answer; 4 | 5 | import java.util.List; 6 | 7 | public interface DynamicContract { 8 | 9 | interface View extends BaseView { 10 | 11 | void onLoadRecentAnswerSuccess(List list); 12 | 13 | void onLoadRecentAnswerFailed(); 14 | 15 | void onLoadMoreRecentAnswerSuccess(List list); 16 | 17 | void onLoadMoreRecentAnswerFailed(); 18 | } 19 | 20 | interface Presenter extends BasePresenter { 21 | void loadRecentAnswer(); 22 | 23 | void loadMoreRecentAnswer(); 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/ActivityScoped.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import javax.inject.Scope; 8 | 9 | /** 10 | * In Dagger, an unscoped component cannot depend on a scoped component. As 11 | * {@link AppComponent} is a scoped component ({@code @Singleton}, we create a custom 12 | * scope to be used by all fragment components. Additionally, a component with a specific scope 13 | * cannot have a sub component with the same scope. 14 | */ 15 | @Documented 16 | @Scope 17 | @Retention(RetentionPolicy.RUNTIME) 18 | public @interface ActivityScoped { 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/HotAnswerContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Answer; 4 | 5 | import java.util.List; 6 | 7 | public interface HotAnswerContract { 8 | 9 | interface View extends BaseView { 10 | 11 | void onLoadHotAnswerSuccess(List list); 12 | 13 | void onLoadHotAnswerFailed(); 14 | 15 | void onLoadMoreHotAnswerSuccess(List list); 16 | 17 | void onLoadMoreHotAnswerFailed(); 18 | } 19 | 20 | interface Presenter extends BasePresenter { 21 | void loadHotAnswerByQuestion(String questionId); 22 | 23 | void loadMoreHotAnswerByQuestion(String questionId); 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/RecentAnswerContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Answer; 4 | 5 | import java.util.List; 6 | 7 | public interface RecentAnswerContract{ 8 | 9 | interface View extends BaseView { 10 | 11 | void onLoadRecentAnswerSuccess(List list); 12 | 13 | void onLoadRecentAnswerFailed(); 14 | 15 | void onLoadMoreRecentAnswerSuccess(List list); 16 | 17 | void onLoadMoreRecentAnswerFailed(); 18 | } 19 | 20 | interface Presenter extends BasePresenter { 21 | void loadRecentAnswerByQuestion(String questionId); 22 | 23 | void loadMoreRecentAnswerByQuestion(String questionId); 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/HomeModule.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import com.leon.androidplus.ui.fragment.DynamicFragment; 4 | import com.leon.androidplus.ui.fragment.HotQuestionFragment; 5 | import com.leon.androidplus.ui.fragment.QuestionFragment; 6 | 7 | import dagger.Module; 8 | import dagger.android.ContributesAndroidInjector; 9 | 10 | @Module 11 | abstract class HomeModule { 12 | 13 | @ChildFragmentScope 14 | @ContributesAndroidInjector 15 | abstract QuestionFragment questionFragment(); 16 | 17 | @ChildFragmentScope 18 | @ContributesAndroidInjector 19 | abstract DynamicFragment dynamicFragment(); 20 | 21 | @ChildFragmentScope 22 | @ContributesAndroidInjector 23 | abstract HotQuestionFragment hotFragment(); 24 | } 25 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/di/MainModule.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.di; 2 | 3 | import com.leon.androidplus.ui.fragment.ArticleFragment; 4 | import com.leon.androidplus.ui.fragment.HomeFragment; 5 | import com.leon.androidplus.ui.fragment.MeFragment; 6 | 7 | import dagger.Module; 8 | import dagger.android.ContributesAndroidInjector; 9 | 10 | @Module 11 | public abstract class MainModule { 12 | 13 | @FragmentScoped 14 | @ContributesAndroidInjector(modules = HomeModule.class) 15 | abstract HomeFragment homeFragment(); 16 | 17 | @FragmentScoped 18 | @ContributesAndroidInjector(modules = ArticleModule.class) 19 | abstract ArticleFragment articleFragment(); 20 | 21 | @FragmentScoped 22 | @ContributesAndroidInjector 23 | abstract MeFragment meFragment(); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/utils/ImageQueryHandler.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.utils; 2 | 3 | import android.content.AsyncQueryHandler; 4 | import android.content.ContentResolver; 5 | import android.database.Cursor; 6 | import android.provider.MediaStore; 7 | 8 | public class ImageQueryHandler extends AsyncQueryHandler{ 9 | private static final String TAG = "ImageQueryHandler"; 10 | 11 | public ImageQueryHandler(ContentResolver cr) { 12 | super(cr); 13 | } 14 | 15 | @Override 16 | protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 17 | cursor.moveToFirst(); 18 | String path = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA)); 19 | ImageUtils.saveAvatar(path); 20 | cursor.close(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/app/Constant.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.app; 2 | 3 | public class Constant { 4 | 5 | public static final int REQUEST_CODE = 0; 6 | public static final int RESULT_CODE = 0; 7 | 8 | public static final String EXTRA_USER_NAME = "extra_user_name"; 9 | public static final String EXTRA_PASSWORD = "extra_password"; 10 | 11 | public static final String EXTRA_QUESTION= "extra_question"; 12 | public static final String EXTRA_QUESTION_ID= "extra_question_id"; 13 | public static final String EXTRA_ANSWER = "extra_answer"; 14 | public static final String EXTRA_USER_ID = "extra_user_id"; 15 | public static final String EXTRA_ARTICLE = "extra_article"; 16 | 17 | public static final int DEFAULT_PAGE_SIZE = 10; 18 | 19 | 20 | public static final String ARGUMENT_TYPE = "argument_type"; 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_add_answer.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/ui/fragment/ArticleFragment.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.ui.fragment; 2 | 3 | import android.support.design.widget.TabLayout; 4 | import android.support.v4.view.PagerAdapter; 5 | 6 | import com.leon.androidplus.R; 7 | import com.leon.androidplus.adapter.ArticlePagerAdapter; 8 | import com.leon.androidplus.di.ActivityScoped; 9 | 10 | import javax.inject.Inject; 11 | 12 | @ActivityScoped 13 | public class ArticleFragment extends BaseMainFragment { 14 | 15 | @Inject 16 | public ArticleFragment() {} 17 | 18 | @Override 19 | public int getTabScrollMode() { 20 | return TabLayout.MODE_SCROLLABLE; 21 | } 22 | 23 | @Override 24 | PagerAdapter getPagerAdapter() { 25 | return new ArticlePagerAdapter(getChildFragmentManager(), 26 | getResources().getStringArray(R.array.article_category)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/leon/androidplus/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.leon.androidplus", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/leon/androidplus/contract/CommentContract.java: -------------------------------------------------------------------------------- 1 | package com.leon.androidplus.contract; 2 | 3 | import com.leon.androidplus.data.model.Answer; 4 | import com.leon.androidplus.data.model.Comment; 5 | 6 | import java.util.List; 7 | 8 | public interface CommentContract { 9 | 10 | interface View extends BaseView{ 11 | 12 | void onSendCommentSuccess(); 13 | void onSendCommentFailed(); 14 | 15 | void onLoadCommentsSuccess(List comments); 16 | void onLoadCommentFailed(); 17 | 18 | void onLoadMoreCommentsSuccess(); 19 | void onLoadMoreCommentFailed(); 20 | 21 | } 22 | 23 | interface Presenter extends BasePresenter{ 24 | 25 | void loadComments(String answerId); 26 | 27 | void loadMoreComments(String answerId); 28 | 29 | void sendComment(Answer answer, String replayTo, String comment); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_bottom_sheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |