├── .gitignore
├── README.md
├── agiledevelop
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── simon
│ │ └── agiledevelop
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── simon
│ │ │ └── agiledevelop
│ │ │ ├── HttpInterceptor.java
│ │ │ ├── ResultSubscriber.java
│ │ │ ├── ServiceHelper.java
│ │ │ ├── glide
│ │ │ ├── BlurTransformation.java
│ │ │ ├── CircleTransform.java
│ │ │ ├── GlideConfiguration.java
│ │ │ └── RoundTransformation.java
│ │ │ ├── log
│ │ │ ├── FastPrintWriter.java
│ │ │ ├── FormatException.java
│ │ │ ├── LLog.java
│ │ │ ├── LogFormat.java
│ │ │ ├── Logger.java
│ │ │ └── StackTraceUtil.java
│ │ │ ├── mvpframe
│ │ │ ├── BaseActivity.java
│ │ │ ├── BaseFragment.java
│ │ │ ├── BasePresenter.java
│ │ │ ├── CoreActivity.java
│ │ │ ├── MvpModel.java
│ │ │ ├── MvpView.java
│ │ │ ├── Presenter.java
│ │ │ ├── RxBus.java
│ │ │ ├── RxManager.java
│ │ │ └── RxPresenter.java
│ │ │ ├── progress
│ │ │ ├── ProgressListener.java
│ │ │ └── ProgressResponseBody.java
│ │ │ ├── recycler
│ │ │ ├── RecycledViewHolder.java
│ │ │ ├── adapter
│ │ │ │ ├── RecycledAdapter.java
│ │ │ │ ├── RecycledMultiItemAdapter.java
│ │ │ │ └── RecycledSectionAdapter.java
│ │ │ ├── animation
│ │ │ │ ├── AlphaInAnimation.java
│ │ │ │ ├── BaseAnimation.java
│ │ │ │ ├── ScaleInAnimation.java
│ │ │ │ ├── SlideInBottomAnimation.java
│ │ │ │ ├── SlideInLeftAnimation.java
│ │ │ │ └── SlideInRightAnimation.java
│ │ │ ├── divider
│ │ │ │ ├── Divider.java
│ │ │ │ ├── HorizontalDivider.java
│ │ │ │ └── VerticalDivider.java
│ │ │ ├── entity
│ │ │ │ ├── AbstractExpandableItem.java
│ │ │ │ ├── IExpandable.java
│ │ │ │ ├── MultiItemEntity.java
│ │ │ │ └── SectionEntity.java
│ │ │ └── listeners
│ │ │ │ ├── OnItemClickListener.java
│ │ │ │ └── SimpleClickListener.java
│ │ │ ├── state
│ │ │ ├── StateView.java
│ │ │ ├── loading
│ │ │ │ ├── Animatable.java
│ │ │ │ ├── Loading.java
│ │ │ │ ├── LoadingCircleDrawable.java
│ │ │ │ └── LoadingDrawable.java
│ │ │ └── network
│ │ │ │ ├── NetChangeObserver.java
│ │ │ │ ├── NetStateReceiver.java
│ │ │ │ └── NetWorkListener.java
│ │ │ ├── utils
│ │ │ ├── App.java
│ │ │ ├── AppManager.java
│ │ │ ├── CloseHelper.java
│ │ │ ├── DeviceHelper.java
│ │ │ ├── ImgLoadHelper.java
│ │ │ ├── KeyboardHelper.java
│ │ │ ├── NetHelper.java
│ │ │ ├── PhoneHelper.java
│ │ │ ├── PreferencesHelper.java
│ │ │ ├── ResHelper.java
│ │ │ ├── SDCardHelper.java
│ │ │ ├── ScreenHelper.java
│ │ │ ├── ToastHelper.java
│ │ │ └── schedulers
│ │ │ │ ├── AndroidSchedulerTransformer.java
│ │ │ │ ├── BaseSchedulerProvider.java
│ │ │ │ ├── ImmediateSchedulerProvider.java
│ │ │ │ └── SchedulerProvider.java
│ │ │ └── widget
│ │ │ ├── AvatarImageView.java
│ │ │ ├── AvatarLayout.java
│ │ │ ├── CircleImageView.java
│ │ │ ├── SelectorButton.java
│ │ │ └── behavior
│ │ │ ├── AnimateHelper.java
│ │ │ ├── BottomBehavior.java
│ │ │ └── TitleBehavior.java
│ └── res
│ │ ├── drawable-xhdpi
│ │ ├── head_portrait_def.png
│ │ ├── placeholder.png
│ │ ├── rotate_arrow.png
│ │ ├── sample_footer_loading.png
│ │ ├── state_empty.png
│ │ ├── state_error.png
│ │ ├── state_net_error.png
│ │ └── state_nonet.png
│ │ ├── drawable
│ │ └── sample_footer_loading_progress.xml
│ │ ├── layout
│ │ ├── banner_layout.xml
│ │ ├── banner_view.xml
│ │ ├── cube_ptr_classic_default_header.xml
│ │ ├── cube_ptr_simple_loading.xml
│ │ ├── def_loading.xml
│ │ ├── view_empty.xml
│ │ ├── view_error.xml
│ │ └── view_progress.xml
│ │ └── values
│ │ ├── attrs_avatar.xml
│ │ ├── attrs_badge.xml
│ │ ├── attrs_banner.xml
│ │ ├── attrs_circleimv.xml
│ │ ├── attrs_cube_ptr.xml
│ │ ├── attrs_selector_button.xml
│ │ ├── attrs_stateview.xml
│ │ ├── colors.xml
│ │ ├── dimen.xml
│ │ ├── load_attrs.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── simon
│ └── agiledevelop
│ └── ExampleUnitTest.java
├── app
├── .gitignore
├── build.gradle
├── drib.jks
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── simon
│ │ └── dribbble
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ ├── editor.html
│ │ ├── fonts
│ │ │ ├── Pacifico.ttf
│ │ │ └── agency.ttf
│ │ ├── normalize.css
│ │ ├── rich_editor.js
│ │ └── style.css
│ ├── java
│ │ └── com
│ │ │ └── simon
│ │ │ ├── crop
│ │ │ ├── Crop.java
│ │ │ ├── CropImageActivity.java
│ │ │ ├── CropImageView.java
│ │ │ ├── CropUtil.java
│ │ │ ├── HighlightView.java
│ │ │ ├── ImageViewTouchBase.java
│ │ │ ├── Log.java
│ │ │ ├── MonitoredActivity.java
│ │ │ └── RotateBitmap.java
│ │ │ ├── dribbble
│ │ │ ├── DribbbleApp.java
│ │ │ ├── GlobalConstant.java
│ │ │ ├── UncaughtException.java
│ │ │ ├── data
│ │ │ │ ├── Api.java
│ │ │ │ ├── DribbbleDataManger.java
│ │ │ │ ├── GsonResponseBodyConverter.java
│ │ │ │ ├── SearchConverter.java
│ │ │ │ ├── model
│ │ │ │ │ ├── AttachmentEntity.java
│ │ │ │ │ ├── BucketEntity.java
│ │ │ │ │ ├── CommentEntity.java
│ │ │ │ │ ├── CommonEntity.java
│ │ │ │ │ ├── FollowersEntity.java
│ │ │ │ │ ├── ImagesEntity.java
│ │ │ │ │ ├── LikeEntity.java
│ │ │ │ │ ├── LinksEntity.java
│ │ │ │ │ ├── ProjectEntity.java
│ │ │ │ │ ├── ShotEntity.java
│ │ │ │ │ ├── TeamEntity.java
│ │ │ │ │ ├── TokenEntity.java
│ │ │ │ │ ├── User.java
│ │ │ │ │ └── UserLikeEntity.java
│ │ │ │ └── remote
│ │ │ │ │ └── DribbbleService.java
│ │ │ ├── listener
│ │ │ │ ├── ItemDiffCallBack.java
│ │ │ │ └── TextWatcherImpl.java
│ │ │ ├── ui
│ │ │ │ ├── AboutActivity.java
│ │ │ │ ├── CommListContract.java
│ │ │ │ ├── CommListFragment.java
│ │ │ │ ├── CommListPresenter.java
│ │ │ │ ├── baselist
│ │ │ │ │ ├── BaseListContract.java
│ │ │ │ │ └── ListActivity.java
│ │ │ │ ├── buckets
│ │ │ │ │ ├── BucketPresenter.java
│ │ │ │ │ ├── UserBucketsAdapter.java
│ │ │ │ │ └── UserBucketsFragment.java
│ │ │ │ ├── main
│ │ │ │ │ ├── AvatarActivity.java
│ │ │ │ │ ├── HomeActivity.java
│ │ │ │ │ ├── HomeFmAdapter.java
│ │ │ │ │ └── SplashActivity.java
│ │ │ │ ├── projects
│ │ │ │ │ ├── ProjectAdapter.java
│ │ │ │ │ ├── ProjectPresenter.java
│ │ │ │ │ └── ProjectsFragment.java
│ │ │ │ ├── shots
│ │ │ │ │ ├── AttachAdapter.java
│ │ │ │ │ ├── AttachPresenter.java
│ │ │ │ │ ├── AttachmentFragment.java
│ │ │ │ │ ├── BucketsFragment.java
│ │ │ │ │ ├── BucketsPresenter.java
│ │ │ │ │ ├── CommentActivity.java
│ │ │ │ │ ├── CommentAdapter.java
│ │ │ │ │ ├── CommentContract.java
│ │ │ │ │ ├── CommentPresenter.java
│ │ │ │ │ ├── CreateContract.java
│ │ │ │ │ ├── CreatePresenter.java
│ │ │ │ │ ├── CreateShotActivity.java
│ │ │ │ │ ├── DetailBigPicActivity.java
│ │ │ │ │ ├── LikesAdapter.java
│ │ │ │ │ ├── LikesFragment.java
│ │ │ │ │ ├── LikesPresenter.java
│ │ │ │ │ ├── RichEditorActivity.java
│ │ │ │ │ ├── SearchActivity.java
│ │ │ │ │ ├── SearchContract.java
│ │ │ │ │ ├── SearchPresenter.java
│ │ │ │ │ ├── SheetActivity.java
│ │ │ │ │ ├── ShotDetailActivity.java
│ │ │ │ │ ├── ShotDetailContract.java
│ │ │ │ │ ├── ShotDetailPresenter.java
│ │ │ │ │ ├── ShotsAdapter.java
│ │ │ │ │ ├── ShotsContract.java
│ │ │ │ │ ├── ShotsFragment.java
│ │ │ │ │ └── ShotsPresenter.java
│ │ │ │ ├── team
│ │ │ │ │ ├── TeamAdapter.java
│ │ │ │ │ ├── TeamFragment.java
│ │ │ │ │ └── TeamPresenter.java
│ │ │ │ └── user
│ │ │ │ │ ├── FollowersAdapter.java
│ │ │ │ │ ├── FollowersFragment.java
│ │ │ │ │ ├── FollowersPresenter.java
│ │ │ │ │ ├── LikeShotsPresenter.java
│ │ │ │ │ ├── SettingsActivity.java
│ │ │ │ │ ├── SignInActivity.java
│ │ │ │ │ ├── SignInContract.java
│ │ │ │ │ ├── SignPresenter.java
│ │ │ │ │ ├── UserInfoActivity.java
│ │ │ │ │ ├── UserInfoContract.java
│ │ │ │ │ ├── UserInfoPresenter.java
│ │ │ │ │ ├── UserLikesFragment.java
│ │ │ │ │ ├── UserShotsContract.java
│ │ │ │ │ ├── UserShotsFragment.java
│ │ │ │ │ └── UserShotsPresenter.java
│ │ │ ├── util
│ │ │ │ ├── ColorPhrase.java
│ │ │ │ ├── DateTimeUtil.java
│ │ │ │ ├── DialogHelp.java
│ │ │ │ ├── DribbblePrefs.java
│ │ │ │ ├── ParcelUtils.java
│ │ │ │ ├── RegexHelper.java
│ │ │ │ ├── StringUtil.java
│ │ │ │ ├── TimeZoneUtil.java
│ │ │ │ └── UIUtils.java
│ │ │ └── widget
│ │ │ │ ├── BottomSheet.java
│ │ │ │ ├── CircleTransform.java
│ │ │ │ ├── ProgressLayout.java
│ │ │ │ ├── ProgressWheel.java
│ │ │ │ ├── PullBackLayout.java
│ │ │ │ ├── RatioImageView.java
│ │ │ │ ├── RoundTransform.java
│ │ │ │ ├── SmileyLoadingView.java
│ │ │ │ ├── TagGroup.java
│ │ │ │ ├── loadingdia
│ │ │ │ ├── AnimatedView.java
│ │ │ │ ├── AnimatorPlayer.java
│ │ │ │ ├── HesitateInterpolator.java
│ │ │ │ ├── ProgressLayout.java
│ │ │ │ └── SpotsDialog.java
│ │ │ │ ├── navigationbar
│ │ │ │ ├── NavigationTabBar.java
│ │ │ │ └── behavior
│ │ │ │ │ ├── BehaviorBottomBar.java
│ │ │ │ │ ├── BehaviorFab.java
│ │ │ │ │ ├── BehaviorScrollZoomFab.java
│ │ │ │ │ ├── NavigationTabBarBehavior.java
│ │ │ │ │ └── VerticalScrollingBehavior.java
│ │ │ │ ├── richeditor
│ │ │ │ ├── RichEditor.java
│ │ │ │ └── Utils.java
│ │ │ │ └── statelayout
│ │ │ │ ├── FadeScaleViewAnimProvider.java
│ │ │ │ ├── FadeViewAnimProvider.java
│ │ │ │ └── ViewAnimProvider.java
│ │ │ └── listeners
│ │ │ └── EndlessScrollListener.java
│ └── res
│ │ ├── anim
│ │ ├── anim_bottom_in.xml
│ │ ├── anim_bottom_out.xml
│ │ └── fade.xml
│ │ ├── drawable-hdpi
│ │ ├── abc_spinner.9.png
│ │ ├── ic_action_create.png
│ │ ├── ic_center_normal.png
│ │ ├── ic_center_selected.png
│ │ ├── ic_comment.png
│ │ ├── ic_drawer_about_normal.png
│ │ ├── ic_drawer_about_selected.png
│ │ ├── ic_drawer_buckets_normal.png
│ │ ├── ic_drawer_buckets_selected.png
│ │ ├── ic_drawer_dl_normal.png
│ │ ├── ic_drawer_dl_selected.png
│ │ ├── ic_drawer_dribbble_normal.png
│ │ ├── ic_drawer_dribbble_selected.png
│ │ ├── ic_drawer_favorite_normal.png
│ │ ├── ic_drawer_favorite_selected.png
│ │ ├── ic_drawer_following_normal.png
│ │ ├── ic_drawer_following_selected.png
│ │ ├── ic_drawer_projects_normal.png
│ │ ├── ic_drawer_projects_selected.png
│ │ ├── ic_drawer_settings_normal.png
│ │ ├── ic_drawer_settings_selected.png
│ │ ├── ic_drawer_shots__normal.png
│ │ ├── ic_drawer_shots_selected.png
│ │ ├── ic_drawer_team_normal.png
│ │ ├── ic_drawer_team_selected.png
│ │ ├── ic_home_normal.png
│ │ ├── ic_home_selected.png
│ │ ├── ic_overflow.png
│ │ ├── ic_search.png
│ │ ├── ic_shot_buckets.png
│ │ ├── ic_shot_likes_12dp.png
│ │ ├── ic_shot_project.png
│ │ ├── ic_shot_views.png
│ │ ├── ic_thank.png
│ │ ├── iconfont_downgrey.png
│ │ ├── location.png
│ │ ├── twitter.png
│ │ └── web.png
│ │ ├── drawable-nodpi
│ │ └── def_nav_drawer.jpg
│ │ ├── drawable-v21
│ │ ├── ic_menu_camera.xml
│ │ ├── ic_menu_gallery.xml
│ │ ├── ic_menu_manage.xml
│ │ ├── ic_menu_send.xml
│ │ ├── ic_menu_share.xml
│ │ └── ic_menu_slideshow.xml
│ │ ├── drawable-xhdpi
│ │ ├── dribbble_about.png
│ │ ├── dribbble_p.png
│ │ ├── dribbble_place.png
│ │ ├── person_image_empty.png
│ │ └── placeholder_drib.png
│ │ ├── drawable-xxhdpi
│ │ ├── bg.png
│ │ ├── bg_color.png
│ │ ├── blockquote.png
│ │ ├── bold.png
│ │ ├── bullets.png
│ │ ├── h1.png
│ │ ├── h2.png
│ │ ├── h3.png
│ │ ├── h4.png
│ │ ├── h5.png
│ │ ├── h6.png
│ │ ├── html_edit.png
│ │ ├── indent.png
│ │ ├── insert_image.png
│ │ ├── insert_link.png
│ │ ├── italic.png
│ │ ├── justify_center.png
│ │ ├── justify_left.png
│ │ ├── justify_right.png
│ │ ├── numbers.png
│ │ ├── outdent.png
│ │ ├── redo.png
│ │ ├── strikethrough.png
│ │ ├── subscript.png
│ │ ├── superscript.png
│ │ ├── txt_color.png
│ │ ├── underline.png
│ │ └── undo.png
│ │ ├── drawable
│ │ ├── ic_add_white_24dp.xml
│ │ ├── ic_attachment_gray_24dp.xml
│ │ ├── ic_close_white_24dp.xml
│ │ ├── ic_comment_gray_24dp.xml
│ │ ├── ic_done_white_24dp.xml
│ │ ├── ic_favorite_border_gray_24dp.xml
│ │ ├── ic_favorite_border_white_24dp.xml
│ │ ├── ic_favorite_gray_24dp.xml
│ │ ├── ic_file_download_gray_24dp.xml
│ │ ├── ic_filter_list.xml
│ │ ├── ic_gif_white_24dp.xml
│ │ ├── ic_redo_gray_24dp.xml
│ │ ├── ic_save_white_24dp.xml
│ │ ├── ic_send_blue_24dp.xml
│ │ ├── ic_send_gray_24dp.xml
│ │ ├── ic_send_white_24dp.xml
│ │ ├── ic_share_white_24dp.xml
│ │ ├── ic_sort_white_24dp.xml
│ │ ├── ic_visibility_gray_24dp.xml
│ │ ├── selector_blue_corners_button.xml
│ │ ├── send_comment.xml
│ │ ├── shape_border.xml
│ │ ├── shape_download_bg.xml
│ │ ├── shape_gray_line_b.xml
│ │ ├── shape_gray_line_r.xml
│ │ ├── shape_toast.xml
│ │ ├── shape_type_bg.xml
│ │ ├── side_nav_bar.xml
│ │ └── spot.xml
│ │ ├── layout
│ │ ├── activity_about.xml
│ │ ├── activity_avatar.xml
│ │ ├── activity_comments.xml
│ │ ├── activity_create_shot.xml
│ │ ├── activity_detai_bigpic.xml
│ │ ├── activity_home.xml
│ │ ├── activity_list_comm.xml
│ │ ├── activity_richeditor.xml
│ │ ├── activity_search.xml
│ │ ├── activity_settings.xml
│ │ ├── activity_sheet.xml
│ │ ├── activity_shot_detail.xml
│ │ ├── activity_sign_dribbble.xml
│ │ ├── activity_splash.xml
│ │ ├── activity_userinfo.xml
│ │ ├── app_bar_home.xml
│ │ ├── app_bar_main.xml
│ │ ├── content_main.xml
│ │ ├── crop_activity_crop.xml
│ │ ├── custom_toast.xml
│ │ ├── dialog.xml
│ │ ├── fragment_list.xml
│ │ ├── fragment_shots.xml
│ │ ├── item_attach.xml
│ │ ├── item_comment.xml
│ │ ├── item_cook.xml
│ │ ├── item_home_list.xml
│ │ ├── item_project.xml
│ │ ├── item_rich_option.xml
│ │ ├── item_shot.xml
│ │ ├── item_team.xml
│ │ ├── item_user.xml
│ │ ├── item_user_buckets.xml
│ │ ├── layout_error_view.xml
│ │ ├── layout_loading_view.xml
│ │ ├── layout_no_data_view.xml
│ │ ├── nav_header_main.xml
│ │ └── view_unauth.xml
│ │ ├── menu
│ │ ├── activity_home_drawer.xml
│ │ ├── comment_sort.xml
│ │ ├── create_shot.xml
│ │ ├── crop.xml
│ │ ├── detail.xml
│ │ ├── filer_sort.xml
│ │ ├── filter_shots.xml
│ │ ├── home.xml
│ │ ├── main.xml
│ │ └── menu_big_photo.xml
│ │ ├── mipmap-hdpi
│ │ ├── dribbble_icon.png
│ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ ├── dribbble_icon.png
│ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ ├── dribbble_icon.png
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ ├── dribbble_icon.png
│ │ ├── ic_launcher.png
│ │ └── qq.jpeg
│ │ ├── mipmap-xxxhdpi
│ │ ├── dribbble_icon.png
│ │ └── ic_launcher.png
│ │ ├── values-v21
│ │ ├── crop_attrs.xml
│ │ └── styles.xml
│ │ ├── values-w820dp
│ │ └── dimens.xml
│ │ ├── values
│ │ ├── arrays.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── drawables.xml
│ │ ├── load_attrs.xml
│ │ ├── loading_dia_attrs.xml
│ │ ├── nav_attrs.xml
│ │ ├── strings.xml
│ │ ├── styles.xml
│ │ └── tags_attrs.xml
│ │ └── xml
│ │ └── searchable.xml
│ └── test
│ └── java
│ └── com
│ └── simon
│ └── dribbble
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lib
└── src
│ └── main
│ └── res
│ ├── drawable-xhdpi
│ └── ucrop_ic_done.png
│ └── menu
│ └── ucrop_menu_activity.xml
├── screenshot
├── comment.gif
├── create.gif
├── detail_pager.gif
├── drawer_filter.gif
├── follower.gif
├── home_list.gif
└── loading.gif
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /local.properties
3 | /.idea/workspace.xml
4 | /.idea/libraries
5 | /build
6 | /captures
7 | .idea
8 | *.iml
--------------------------------------------------------------------------------
/agiledevelop/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/agiledevelop/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 25
5 | buildToolsVersion "25.0.0"
6 |
7 | defaultConfig {
8 | minSdkVersion 14
9 | targetSdkVersion 25
10 | versionCode 1
11 | versionName "1.0"
12 |
13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
14 |
15 | }
16 | buildTypes {
17 | release {
18 | minifyEnabled false
19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
20 | }
21 | }
22 | }
23 |
24 | repositories {
25 | flatDir() {
26 | dirs 'libs'
27 | }
28 | }
29 |
30 | dependencies {
31 | compile fileTree(include: ['*.jar'], dir: 'libs')
32 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
33 | exclude group: 'com.android.support', module: 'support-annotations'
34 | })
35 | compile 'com.android.support:appcompat-v7:25.0.1'
36 | testCompile 'junit:junit:4.12'
37 | compile 'com.android.support:recyclerview-v7:25.0.1'
38 | compile 'com.android.support:design:25.0.1'
39 | compile 'com.squareup.retrofit2:retrofit:2.1.0'
40 | compile 'com.squareup.retrofit2:converter-gson:2.1.0'
41 | compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
42 | compile 'com.github.bumptech.glide:glide:3.7.0'
43 | compile 'com.readystatesoftware.systembartint:systembartint:1.0.4'
44 | compile 'com.squareup.okhttp3:okhttp:3.5.0'
45 | compile 'io.reactivex:rxjava:1.2.6'
46 | compile 'io.reactivex:rxandroid:1.2.1'
47 | }
48 |
--------------------------------------------------------------------------------
/agiledevelop/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in E:\AndroidStudiosdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/agiledevelop/src/androidTest/java/com/simon/agiledevelop/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop;
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 | * Instrumentation 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.simon.agiledevelop.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/java/com/simon/agiledevelop/HttpInterceptor.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop;
2 |
3 |
4 | import java.io.IOException;
5 | import java.util.Map;
6 | import java.util.Set;
7 |
8 | import okhttp3.Headers;
9 | import okhttp3.Interceptor;
10 | import okhttp3.Request;
11 | import okhttp3.Response;
12 |
13 | public class HttpInterceptor implements Interceptor {
14 | private static String TAG = HttpInterceptor.class.getSimpleName();
15 | private Headers mHeaders;
16 | private Map mMapHeaders;
17 |
18 | @Override
19 | public Response intercept(Chain chain) throws IOException {
20 | //封装headers
21 | Request request;
22 |
23 | Request.Builder builder = chain.request().newBuilder();
24 | if (mHeaders != null) {
25 | Set set = mHeaders.names();
26 | for (String name : set) {
27 | builder.addHeader(name, mHeaders.get(name));
28 | }
29 | } else if (mMapHeaders != null) {
30 | for (String name : mMapHeaders.keySet()) {
31 | builder.addHeader(name, mMapHeaders.get(name));
32 | }
33 | }
34 | request = builder
35 | .addHeader("Content-Type", "application/json")
36 | .addHeader("Content-Type", "application/json;charset=UTF-8")
37 | .build();
38 | Response response = chain.proceed(request);
39 |
40 | return response;
41 | }
42 |
43 | public Headers getHeaders() {
44 | return mHeaders;
45 | }
46 |
47 | public void setHeaders(Headers headers) {
48 | this.mHeaders = headers;
49 | }
50 |
51 | public void setMapHeaders(Map mapHeaders) {
52 | this.mMapHeaders = mapHeaders;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/java/com/simon/agiledevelop/ResultSubscriber.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop;
2 |
3 |
4 | import rx.Subscriber;
5 |
6 | public abstract class ResultSubscriber extends Subscriber {
7 | /**
8 | * 自定义订阅,参数用来区分网络接口,以用来在不同接口操作过程中,处理不同的逻辑
9 | */
10 | public ResultSubscriber() {
11 |
12 | }
13 |
14 | @Override
15 | public void onCompleted() {
16 | onEndRequest();
17 | }
18 |
19 | @Override
20 | public void onError(Throwable e) {
21 | try {
22 | if (e != null) {
23 | onFailed(e);
24 | e.printStackTrace();
25 | }
26 | } catch (Throwable t) {
27 | t.printStackTrace();
28 | }
29 |
30 | }
31 |
32 | @Override
33 | public void onNext(T t) {
34 | onResult(t);
35 | }
36 |
37 | /**
38 | * 网络请求开始
39 | */
40 | public abstract void onStartRequest();
41 |
42 | /**
43 | * 网络请求结束
44 | */
45 | public abstract void onEndRequest();
46 |
47 | /**
48 | * 网络请求错误
49 | */
50 | public abstract void onFailed(Throwable e);
51 |
52 | /**
53 | * 处理请求结果
54 | */
55 | public abstract void onResult(T t);
56 | }
57 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/java/com/simon/agiledevelop/mvpframe/BasePresenter.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop.mvpframe;
2 |
3 | import android.support.annotation.Nullable;
4 |
5 | import java.lang.ref.WeakReference;
6 |
7 | /**
8 | * describe:
9 | *
10 | * @author Apeplan
11 | * @date 2016/12/27
12 | * @email hanzx1024@gmail.com
13 | */
14 |
15 | public class BasePresenter implements Presenter {
16 |
17 | private WeakReference viewRef;
18 |
19 | @Override
20 | public void attachView(V view) {
21 | viewRef = new WeakReference(view);
22 | }
23 |
24 | /**
25 | * Get the attached view. You should always call {@link #isViewAttached()} to check if the view
26 | * is
27 | * attached to avoid NullPointerExceptions.
28 | *
29 | * @return null
, if view is not attached, otherwise the concrete view instance
30 | */
31 | @Nullable
32 | protected V getView() {
33 | return viewRef == null ? null : viewRef.get();
34 | }
35 |
36 | /**
37 | * Checks if a view is attached to this presenter. You should always call this method before
38 | * calling {@link #getView()} to get the view instance.
39 | */
40 | protected boolean isViewAttached() {
41 | return viewRef != null && viewRef.get() != null;
42 | }
43 |
44 | @Override
45 | public void detachView(boolean retainInstance) {
46 | if (viewRef != null) {
47 | viewRef.clear();
48 | viewRef = null;
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/java/com/simon/agiledevelop/mvpframe/MvpModel.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop.mvpframe;
2 |
3 | /**
4 | * describe:
5 | *
6 | * @author Apeplan
7 | * @date 2016/12/27
8 | * @email hanzx1024@gmail.com
9 | */
10 |
11 | public interface MvpModel {
12 | }
13 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/java/com/simon/agiledevelop/mvpframe/MvpView.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop.mvpframe;
2 |
3 | /**
4 | * describe: All View must extends
5 | *
6 | * @author Simon Han
7 | * @date 2016.10.20
8 | * @email hanzx1024@gmail.com
9 | */
10 | public interface MvpView {
11 | /**
12 | * 显示加载进度框
13 | *
14 | * @param action 可以区分不同类型请求
15 | * @param msg 提示信息
16 | */
17 | void showLoading(int action, String msg);
18 |
19 | /**
20 | * 请求成功,但是没有数据
21 | *
22 | * @param msg 空页面的提示信息
23 | */
24 | void onEmpty(String msg);
25 |
26 | /**
27 | * 请求失败
28 | *
29 | * @param action 可以区分不同类型的失败
30 | * @param msg 失败信息
31 | */
32 | void onFailed(int action, String msg);
33 |
34 |
35 | /**
36 | * 请求执行完成,不管成功与否,都会调用这个方法
37 | *
38 | * @param action
39 | */
40 | void onCompleted(int action);
41 |
42 | /**
43 | * 将 View 中持有的 Presenter 赋值
44 | *
45 | * @param presenter
46 | */
47 | void setPresenter(T presenter);
48 |
49 | }
50 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/java/com/simon/agiledevelop/mvpframe/Presenter.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop.mvpframe;
2 |
3 | /**
4 | * describe:
5 | *
6 | * @author Apeplan
7 | * @date 2016/12/27
8 | * @email hanzx1024@gmail.com
9 | */
10 |
11 | public interface Presenter {
12 | /**
13 | * Set or attach the view to this presenter
14 | */
15 | void attachView(V view);
16 |
17 | /**
18 | * Will be called if the view has been destroyed. Typically this method will be invoked from
19 | * Activity.detachView()
or Fragment.onDestroyView()
20 | */
21 | void detachView(boolean retainInstance);
22 | }
23 |
--------------------------------------------------------------------------------
/agiledevelop/src/main/java/com/simon/agiledevelop/mvpframe/RxManager.java:
--------------------------------------------------------------------------------
1 | package com.simon.agiledevelop.mvpframe;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | import rx.Observable;
7 | import rx.Subscription;
8 | import rx.android.schedulers.AndroidSchedulers;
9 | import rx.functions.Action1;
10 | import rx.subscriptions.CompositeSubscription;
11 |
12 | /**
13 | * 用于管理RxBus的事件和Rxjava相关代码的生命周期处理
14 | */
15 |
16 | public class RxManager {
17 |
18 | public RxBus mRxBus = RxBus.$();
19 | private Map> mObservables = new HashMap<>();// 管理观察源
20 | private CompositeSubscription mCompositeSubscription = new CompositeSubscription();// 管理订阅者者
21 |
22 |
23 | public void on(String eventName, Action1