├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── CodeHub.iml ├── README.md ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── caij │ │ └── codehub │ │ ├── ApplicationTest.java │ │ └── DataTest.java │ ├── debug │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── caij │ │ └── codehub │ │ └── CodeHubDebugApplication.java │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── octicons.ttf │ ├── java │ └── com │ │ └── caij │ │ └── codehub │ │ ├── API.java │ │ ├── CodeHubApplication.java │ │ ├── CodeHubPrefs.java │ │ ├── Constant.java │ │ ├── bean │ │ ├── Comment.java │ │ ├── Deployment.java │ │ ├── DeploymentStatus.java │ │ ├── Entity.java │ │ ├── FileTreeItem.java │ │ ├── Forkee.java │ │ ├── Issue.java │ │ ├── Org.java │ │ ├── Page.java │ │ ├── PullRequest.java │ │ ├── Repository.java │ │ ├── SearchRepository.java │ │ ├── Team.java │ │ ├── Token.java │ │ ├── Tree.java │ │ ├── User.java │ │ └── event │ │ │ ├── BaseEvent.java │ │ │ ├── CommitCommentEvent.java │ │ │ ├── CreateEvent.java │ │ │ ├── DeleteEvent.java │ │ │ ├── DeploymentEvent.java │ │ │ ├── DeploymentStatusEvent.java │ │ │ ├── DownloadEvent.java │ │ │ ├── Event.java │ │ │ ├── EventWrap.java │ │ │ ├── ForkEvent.java │ │ │ ├── IssueCommentEvent.java │ │ │ ├── IssuesEvent.java │ │ │ ├── MemberEvent.java │ │ │ ├── MembershipEvent.java │ │ │ ├── PullRequestEvent.java │ │ │ ├── PullRequestReviewCommentEvent.java │ │ │ ├── PushEvent.java │ │ │ ├── RepositoryEvent.java │ │ │ ├── TeamAddEvent.java │ │ │ └── WatchEvent.java │ │ ├── interactor │ │ ├── AuthenticationInteractor.java │ │ ├── CommentActionInteractor.java │ │ ├── CommentsInteractor.java │ │ ├── EventsInteractor.java │ │ ├── FileTreeInteractor.java │ │ ├── FollowActionInteractor.java │ │ ├── Interactor.java │ │ ├── InteractorCallBack.java │ │ ├── InteractorFactory.java │ │ ├── IssueInteractor.java │ │ ├── IssueListInteractor.java │ │ ├── RepositoryActionInteractor.java │ │ ├── RepositoryInfoInteractor.java │ │ ├── RepositoryListInteractor.java │ │ ├── UserInteractor.java │ │ ├── UserListInteractor.java │ │ └── imp │ │ │ ├── AuthenticationInteractorImp.java │ │ │ ├── CommentActionInteractorImp.java │ │ │ ├── CommentsInteractorImp.java │ │ │ ├── EventsInteractorImp.java │ │ │ ├── FileTreeInteractorImp.java │ │ │ ├── FollowActionInteractorImp.java │ │ │ ├── IssueInteractorImp.java │ │ │ ├── IssueListInteractorImp.java │ │ │ ├── RepositoryActionInteractorImp.java │ │ │ ├── RepositoryInfoInteractorImp.java │ │ │ ├── RepositoryListInteractorImp.java │ │ │ ├── UserInteractorImp.java │ │ │ └── UserListInteractorImp.java │ │ ├── present │ │ ├── CommentPresent.java │ │ ├── CommentsPresent.java │ │ ├── DefaultInteractorCallback.java │ │ ├── EventsPresent.java │ │ ├── FileTreePresent.java │ │ ├── ListPresent.java │ │ ├── LoadType.java │ │ ├── MainPresent.java │ │ ├── Present.java │ │ ├── RepoIssuesPresent.java │ │ ├── RepositoriesPresent.java │ │ ├── RepositoryInfoPresent.java │ │ ├── SettingPresent.java │ │ ├── UserInfoPresent.java │ │ ├── UserLoginPresent.java │ │ ├── UsersPresent.java │ │ └── ui │ │ │ ├── BaseUi.java │ │ │ ├── CommentUi.java │ │ │ ├── ListUi.java │ │ │ ├── MainUi.java │ │ │ ├── RecyclerViewUi.java │ │ │ ├── RepositoryInfoUi.java │ │ │ ├── SettingUi.java │ │ │ ├── SwipeRefreshUi.java │ │ │ ├── UserAndActionUi.java │ │ │ ├── UserInfoUi.java │ │ │ ├── UserLoginUi.java │ │ │ └── UserUi.java │ │ ├── request │ │ └── EventRequest.java │ │ ├── ui │ │ ├── activity │ │ │ ├── AboutActivity.java │ │ │ ├── BaseActivity.java │ │ │ ├── BaseCodeHubActivity.java │ │ │ ├── BaseCodeHubToolBarActivity.java │ │ │ ├── CommentActivity.java │ │ │ ├── FileTreeActivity.java │ │ │ ├── FollowersActivity.java │ │ │ ├── FollowingActivity.java │ │ │ ├── InitActivity.java │ │ │ ├── IssueInfoActivity.java │ │ │ ├── LoginActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── PictureReviewActivity.java │ │ │ ├── RepoIssuesActivity.java │ │ │ ├── RepositoryInfoActivity.java │ │ │ ├── SearchActivity.java │ │ │ ├── SettingActivity.java │ │ │ ├── TrendingFilterActivity.java │ │ │ ├── UserInfoActivity.java │ │ │ ├── UserRepositoriesActivity.java │ │ │ └── WebActivity.java │ │ ├── adapter │ │ │ ├── AvatarOnClickListener.java │ │ │ ├── BaseAdapter.java │ │ │ ├── CommentAdapter.java │ │ │ ├── EventsAdapter.java │ │ │ ├── FileTreeAdapter.java │ │ │ ├── IAdapter.java │ │ │ ├── IssueAdapter.java │ │ │ ├── RepositoryAdapter.java │ │ │ └── UserAdapter.java │ │ ├── drawable │ │ │ └── MorphDrawable.java │ │ ├── fragment │ │ │ ├── BaseCodeHubFragment.java │ │ │ ├── BaseFragment.java │ │ │ ├── EventsFragment.java │ │ │ ├── FileTreeFragment.java │ │ │ ├── FollowersFragment.java │ │ │ ├── FollowingsFragment.java │ │ │ ├── IssueInfoFragment.java │ │ │ ├── LazyFragment.java │ │ │ ├── RecyclerViewFragment.java │ │ │ ├── RepoIssuesFragment.java │ │ │ ├── RepositoriesFragment.java │ │ │ ├── RepositoryPagesFragment.java │ │ │ ├── SearchRepositoriesFragment.java │ │ │ ├── SwipeRefreshRecyclerViewFragment.java │ │ │ ├── TrendingRepositoriesFragment.java │ │ │ ├── UserRepositoriesFragment.java │ │ │ ├── UserStarredRepositoriesFragment.java │ │ │ └── UsersFragment.java │ │ └── transitions │ │ │ ├── FabDialogMorphSetup.java │ │ │ ├── MorphDialogToFab.java │ │ │ └── MorphFabToDialog.java │ │ ├── utils │ │ ├── AnimUtils.java │ │ ├── AvatarUrlUtil.java │ │ ├── Base64.java │ │ ├── CropCircleTransformation.java │ │ ├── DensityUtil.java │ │ ├── EventSpannedUtils.java │ │ ├── MyGlideModule.java │ │ ├── OkHttpClientProvider.java │ │ ├── TextTypeFaceUtils.java │ │ └── TimeUtils.java │ │ └── widgets │ │ ├── CollapsingToolbarLayout.java │ │ ├── FixClickableSpanBugTextView.java │ │ ├── FloatingActionButton.java │ │ ├── GithubTypeFaceTextView.java │ │ ├── LinearBreadcrumb.java │ │ ├── recyclerview │ │ ├── HeaderAndFooterRecyclerViewAdapter.java │ │ ├── LoadMoreRecyclerView.java │ │ ├── LoadMoreView.java │ │ └── RecyclerViewOnItemClickListener.java │ │ └── swipeback │ │ ├── SwipeBackLayout.java │ │ ├── Utils.java │ │ ├── ViewDragHelper.java │ │ └── app │ │ ├── SwipeBackActivity.java │ │ ├── SwipeBackActivityBase.java │ │ ├── SwipeBackActivityHelper.java │ │ └── SwipeBackPreferenceActivity.java │ └── res │ ├── anim │ ├── finish_right_in.xml │ ├── finish_right_out.xml │ ├── start_right_in.xml │ └── start_right_out.xml │ ├── drawable-hdpi │ ├── ic_add.png │ └── ic_right_arrow.png │ ├── drawable-mdpi │ ├── ic_add.png │ └── ic_right_arrow.png │ ├── drawable-xhdpi │ └── ic_right_arrow.png │ ├── drawable-xxhdpi │ ├── bg_init_page_img.png │ ├── bg_shadow_bottom.png │ ├── bg_shadow_left.png │ ├── bg_shadow_right.png │ ├── gif_loading1.png │ ├── gif_loading2.png │ ├── gif_loading3.png │ ├── gif_loading4.png │ ├── gif_loading5.png │ ├── gif_loading6.png │ ├── gif_loading7.png │ ├── ic_action_search.png │ ├── ic_add.png │ ├── ic_default_circle_head_image.png │ ├── ic_right_arrow.png │ ├── source_data_load_error.png │ └── source_no_data_image.png │ ├── drawable │ ├── animation_loading.xml │ ├── dialog_background.xml │ ├── fab_normal.xml │ ├── fab_select.xml │ ├── fab_selector.xml │ ├── link_selector.xml │ ├── nav_item_selector.xml │ └── theme_color_btn_shape.xml │ ├── layout │ ├── activity_about.xml │ ├── activity_base_codehub.xml │ ├── activity_base_codehub_toolbar.xml │ ├── activity_comment.xml │ ├── activity_file_tree.xml │ ├── activity_init.xml │ ├── activity_issue.xml │ ├── activity_login.xml │ ├── activity_main.xml │ ├── activity_picture.xml │ ├── activity_repository_info.xml │ ├── activity_search.xml │ ├── activity_setting.xml │ ├── activity_trending_filter.xml │ ├── activity_user_info.xml │ ├── activity_web.xml │ ├── dialog_repository_filter.xml │ ├── fragment_base_code_hub.xml │ ├── fragment_issue_info.xml │ ├── fragment_repository_viewpager.xml │ ├── fragment_trending.xml │ ├── include_anim_loading.xml │ ├── include_empty_view.xml │ ├── include_listview.xml │ ├── include_load_error.xml │ ├── include_navigation_main.xml │ ├── include_progress_bar_loading.xml │ ├── include_recycle_view.xml │ ├── include_refresh_recycle_view.xml │ ├── include_tool_bar.xml │ ├── infinite_loading.xml │ ├── item_comment.xml │ ├── item_event.xml │ ├── item_issue.xml │ ├── item_issue_head.xml │ ├── item_repository.xml │ ├── item_treelist.xml │ ├── item_user.xml │ ├── widget_bread_crumb.xml │ └── widget_swipeback_layout.xml │ ├── menu │ ├── menu.xml │ ├── menu_drawer_view.xml │ ├── menu_issue.xml │ ├── menu_main.xml │ ├── menu_repository_info.xml │ ├── menu_trending.xml │ ├── menu_user.xml │ └── search.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── drawables.xml │ ├── ids.xml │ ├── paths.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── introduce ├── chinese.md ├── event.png ├── followers.png ├── issue.png ├── main.png ├── nav.png ├── repository.png └── user.png ├── lib ├── .gitignore ├── build.gradle ├── lib.iml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── caij │ │ └── lib │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── caij │ │ └── lib │ │ ├── utils │ │ ├── AppManager.java │ │ ├── CheckValueUtil.java │ │ ├── GsonUtils.java │ │ ├── LogUtil.java │ │ ├── SPUtils.java │ │ ├── SystemBarTintManager.java │ │ ├── ToastUtil.java │ │ └── VolleyManager.java │ │ └── volley │ │ ├── request │ │ ├── AbsRequest.java │ │ ├── GsonRequest.java │ │ ├── JsonParseError.java │ │ ├── NetworkResponseRequest.java │ │ └── StringRequest.java │ │ └── stack │ │ └── OkHttpStack.java │ └── res │ └── values │ └── strings.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | CodeHub -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 26 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 53 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /CodeHub.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodeHub 2 | Github client for android, include login, personal information , repository information, event, issue. Hope other developer join this project if you are interested. thanks. 3 | 4 | 5 | ![main](introduce/main.png) ![nav](introduce/nav.png) ![event](introduce/event.png) 6 | 7 | ![repository](introduce/repository.png) ![user](introduce/user.png) ![issue](introduce/issue.png) 8 | 9 | ###Thanks 10 | [CodeHub](https://github.com/thedillonb/CodeHub) 11 | 12 | ###Libs 13 | [butterknife](https://github.com/JakeWharton/butterknife) 14 | 15 | [glide](https://github.com/bumptech/glide) 16 | 17 | [stetho](https://github.com/facebook/stetho) 18 | 19 | [volley](https://github.com/mcxiaoke/android-volley) 20 | 21 | [leakcanary](https://github.com/square/leakcanary) 22 | 23 | ###Contact 24 | [worldcaij@gmail.com](mailto:worldcaij@gmail.com) 25 | 26 | ###License 27 | Copyright (C) 2015 Caij 28 | 29 | Licensed under the Apache License, Version 2.0 (the "License"); 30 | you may not use this file except in compliance with the License. 31 | You may obtain a copy of the License at 32 | 33 | http://www.apache.org/licenses/LICENSE-2.0 34 | 35 | Unless required by applicable law or agreed to in writing, software 36 | distributed under the License is distributed on an "AS IS" BASIS, 37 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 38 | See the License for the specific language governing permissions and 39 | limitations under the License. -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/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 D:\android-studio\android-sdk/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 | 19 | # GSON 20 | # Gson uses generic type information stored in a class file when working with fields. Proguard 21 | # removes such information by default, so configure it to keep all of it. 22 | -keepattributes Signature 23 | # Gson specific classes 24 | -keep class sun.misc.Unsafe { *; } 25 | -keep class com.caij.codehub.bean.** { *; } 26 | 27 | #Glide 28 | -keep public class * implements com.bumptech.glide.module.GlideModule 29 | -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { 30 | **[] $VALUES; 31 | public *; 32 | } 33 | 34 | # LeakCanary 35 | -keep class org.eclipse.mat.** { *; } 36 | -keep class com.squareup.leakcanary.** { *; } 37 | 38 | #UM 39 | -keepclassmembers class * { 40 | public (org.json.JSONObject); 41 | } 42 | -keep public class com.caij.codehub.R$*{ 43 | public static final int *; 44 | } 45 | -keepclassmembers enum * { 46 | public static **[] values(); 47 | public static ** valueOf(java.lang.String); 48 | } 49 | 50 | #butterknife 51 | -keep class butterknife.** { *; } 52 | -dontwarn butterknife.internal.** 53 | -keep class **$$ViewBinder { *; } 54 | 55 | -keepclasseswithmembernames class * { 56 | @butterknife.* ; 57 | } 58 | 59 | -keepclasseswithmembernames class * { 60 | @butterknife.* ; 61 | } 62 | 63 | ## 64 | -dontwarn org.apache.http.** 65 | -dontwarn com.android.volley.toolbox.** 66 | 67 | -dontwarn java.nio.file.Files 68 | -dontwarn java.nio.file.Path 69 | -dontwarn java.nio.file.OpenOption 70 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement -------------------------------------------------------------------------------- /app/src/androidTest/java/com/caij/codehub/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/caij/codehub/DataTest.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub; 2 | 3 | import android.test.AndroidTestCase; 4 | 5 | import com.caij.codehub.utils.AvatarUrlUtil; 6 | import com.caij.lib.utils.LogUtil; 7 | 8 | /** 9 | * Created by Administrator on 2015/8/24. 10 | */ 11 | public class DataTest extends AndroidTestCase{ 12 | public final static String HTTPS = "https://"; 13 | public final static String HOST = "api.github.com"; 14 | public final static String URL_SPLITTER = "/"; 15 | public final static String API_HOST = HTTPS + HOST + URL_SPLITTER; 16 | public final static String TOKEN_NOTE = "Github APP Token"; 17 | private final static String[] SCOPES = {"public_repo","repo", "user", "gist"}; 18 | public final static String CREATE_TOKEN = API_HOST + "authorizations"; // POST 19 | 20 | public static final String AUTHORIZATION = "Authorization"; 21 | 22 | public final static String REPO = "user/repos"; 23 | 24 | public void testAvatarUrlUtil() { 25 | String url = AvatarUrlUtil.restoreAvatarUrl("https://avatars.githubusercontent.com/u/10348598?v=2"); 26 | LogUtil.d("AndroidTestCase", url); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/debug/java/com/caij/codehub/CodeHubDebugApplication.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub; 2 | 3 | import android.content.Context; 4 | 5 | import com.facebook.stetho.Stetho; 6 | import com.squareup.leakcanary.LeakCanary; 7 | import com.squareup.leakcanary.RefWatcher; 8 | 9 | 10 | /** 11 | * Created by Caij on 15/11/03. 12 | */ 13 | public class CodeHubDebugApplication extends CodeHubApplication { 14 | 15 | private RefWatcher refWatcher; 16 | 17 | @Override 18 | public void onCreate() { 19 | super.onCreate(); 20 | Stetho.initialize( 21 | Stetho.newInitializerBuilder(this) 22 | .enableDumpapp(Stetho.defaultDumperPluginsProvider(this)) 23 | .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this)) 24 | .build()); 25 | refWatcher = LeakCanary.install(this); 26 | } 27 | 28 | public static RefWatcher getRefWatcher(Context context) { 29 | CodeHubDebugApplication application = (CodeHubDebugApplication) context.getApplicationContext(); 30 | return application.refWatcher; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/assets/octicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/assets/octicons.ttf -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/API.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * Created by Caij on 2015/8/25. 7 | */ 8 | public class API { 9 | 10 | public final static String API_HOST ="https://api.github.com"; 11 | public final static String TOKEN_NOTE = "Github APP Token"; 12 | public final static String[] SCOPES = {"public_repo","repo", "user", "gist"}; 13 | public final static String AUTHORIZATION_URL = API_HOST + "/authorizations"; // POST 14 | 15 | public final static String REPOSITORY_STARRED_URI = "/starred"; 16 | public final static String REPOSITORY_REPOS_URI = "/repos"; 17 | 18 | public final static String SEARCH_REPOSITORY_URI = "/search/repositories"; 19 | 20 | public static final String AUTHORIZATION = "Authorization"; 21 | 22 | public static final String PER_PAGE = "per_page"; 23 | public static final String PAGE = "page"; 24 | 25 | public static final String Q = "q"; 26 | public static final String SORT = "sort"; 27 | public static final String ORDER = "order"; 28 | 29 | public static Map configAuthorizationHead(Map head, String token) { 30 | head.put(AUTHORIZATION, "Token " + token); 31 | return head; 32 | } 33 | 34 | public static final String TRENDING_REPOSITORY_HOST = "http://trending.codehub-app.com/v2/trending"; 35 | 36 | public static final String TENDING_REPOSITORY_PARAM_LANGUAGE = "language"; 37 | 38 | public static final String TENDING_REPOSITORY_PARAM_SINCE = "since"; 39 | 40 | public static final String GITHUB_README = "https://github.com/%s/%s/blob/master/README.md"; 41 | 42 | public static final String GITHUB_FILE = "https://github.com/%s/%s/%s/%s"; 43 | 44 | public static final String PROJECT_README_URL = "https://github.com/Caij/CodeHub/blob/master/README.md"; 45 | 46 | public static final String PROJECT_URL = "https://github.com/Caij/CodeHub"; 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/CodeHubApplication.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub; 2 | 3 | import android.app.Application; 4 | 5 | import com.caij.codehub.utils.OkHttpClientProvider; 6 | import com.caij.lib.utils.LogUtil; 7 | import com.caij.lib.utils.SPUtils; 8 | import com.caij.lib.utils.VolleyManager; 9 | import com.caij.lib.volley.stack.OkHttpStack; 10 | 11 | 12 | /** 13 | * Created by Caij on 2015/8/25. 14 | */ 15 | public class CodeHubApplication extends Application{ 16 | 17 | private static final String SP_FILE_NAME = "profile"; 18 | 19 | private static final int VOLLEY_DISK_MAX_SIZE = 1024 * 1024 * 5; 20 | 21 | @Override 22 | public void onCreate() { 23 | super.onCreate(); 24 | SPUtils.init(this, SP_FILE_NAME); 25 | LogUtil.LOG_DEBUG = BuildConfig.LOG_DEBUG; 26 | VolleyManager.init(this, new OkHttpStack(OkHttpClientProvider.getOkHttpClient()), VOLLEY_DISK_MAX_SIZE); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/Constant.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub; 2 | 3 | /** 4 | * Created by Caij on 2015/8/26. 5 | */ 6 | public interface Constant { 7 | 8 | public static final String USER_TOKEN = "user_token"; 9 | 10 | public static final String USER_NAME = "user_name"; 11 | 12 | public static final String USER_INFO = "user_info"; 13 | 14 | public static final String REPO_NAME = "repo_name"; 15 | 16 | public static final String REPO_SEARCH_Q = "repo_search_q"; 17 | 18 | public static final String REPO_SORT= "repo_sort"; 19 | 20 | public static final String ORDER = "order"; 21 | 22 | public static final String URL = "url"; 23 | 24 | public static final String ISSUE_NUMBER = "issue_number"; 25 | 26 | public static final String ISSUE = "issue"; 27 | 28 | public static final String REPO_BRAN = "repo_bran"; 29 | 30 | public static final String REPO_SHA= "repo_sha"; 31 | 32 | public static final int ISSUE_COMMENT_REQUEST_CODE = 100; 33 | 34 | public static final int FILTER_REQUEST_CODE = 101; 35 | 36 | public static final String COMMENT = "comment"; 37 | 38 | public static final String ISSUE_TITLE = "issue_title"; 39 | 40 | public static final String ISSUE_BODY = "issue_body"; 41 | 42 | public static final String USER_TOKEN_ID = "user_token_id"; 43 | 44 | public static final String USER_PWD = "user_pwd"; 45 | 46 | public static final String TITLE = "title"; 47 | 48 | public static final String TRENDING_REPOSITORY_CHECK_SINCE_ID = "trending_repository_check_since_id"; 49 | 50 | public static final String TRENDING_REPOSITORY_CHECK_LANGUAGE_ID = "trending_repository_check_language_id"; 51 | 52 | public static final String TRANSIT_PIC = "transit_pic"; 53 | 54 | public static final String AVATAR_URL = "AVATAR_URL"; 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/Entity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Created by Caij on 2015/8/24. 7 | */ 8 | public class Entity implements Serializable{ 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/FileTreeItem.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean; 2 | 3 | /** 4 | * Created by Caij on 2/11/15. 5 | */ 6 | public class FileTreeItem extends Entity{ 7 | 8 | private static final long serialVersionUID = 6518261551932913340L; 9 | 10 | public static final String MODE_TREE = "tree"; 11 | public static final String MODE_BLOB = "blob"; 12 | 13 | private String path; 14 | private String mode; 15 | private String type; 16 | private String sha; 17 | private long size; 18 | private String url; 19 | 20 | public FileTreeItem() { 21 | 22 | } 23 | 24 | public String getMode() { 25 | return mode; 26 | } 27 | 28 | public void setMode(String mode) { 29 | this.mode = mode; 30 | } 31 | 32 | public String getPath() { 33 | return path; 34 | } 35 | 36 | public void setPath(String path) { 37 | this.path = path; 38 | } 39 | 40 | public static long getSerialVersionUID() { 41 | return serialVersionUID; 42 | } 43 | 44 | public String getSha() { 45 | return sha; 46 | } 47 | 48 | public void setSha(String sha) { 49 | this.sha = sha; 50 | } 51 | 52 | public long getSize() { 53 | return size; 54 | } 55 | 56 | public void setSize(long size) { 57 | this.size = size; 58 | } 59 | 60 | public String getType() { 61 | return type; 62 | } 63 | 64 | public void setType(String type) { 65 | this.type = type; 66 | } 67 | 68 | public String getUrl() { 69 | return url; 70 | } 71 | 72 | public void setUrl(String url) { 73 | this.url = url; 74 | } 75 | 76 | 77 | @Override 78 | public String toString() { 79 | return "FileTreeItem{" + 80 | "mode='" + mode + '\'' + 81 | ", path='" + path + '\'' + 82 | ", type='" + type + '\'' + 83 | ", sha='" + sha + '\'' + 84 | ", size=" + size + 85 | ", url='" + url + '\'' + 86 | '}'; 87 | } 88 | } 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/Org.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean; 2 | 3 | /** 4 | * Created by Caij on 2015/10/30. 5 | */ 6 | public class Org { 7 | 8 | private int id; 9 | private String login; 10 | private String gravatar_id; 11 | private String url; 12 | private String avatar_url; 13 | 14 | public void setId(int id) { 15 | this.id = id; 16 | } 17 | 18 | public void setLogin(String login) { 19 | this.login = login; 20 | } 21 | 22 | public void setGravatar_id(String gravatar_id) { 23 | this.gravatar_id = gravatar_id; 24 | } 25 | 26 | public void setUrl(String url) { 27 | this.url = url; 28 | } 29 | 30 | public void setAvatar_url(String avatar_url) { 31 | this.avatar_url = avatar_url; 32 | } 33 | 34 | public int getId() { 35 | return id; 36 | } 37 | 38 | public String getLogin() { 39 | return login; 40 | } 41 | 42 | public String getGravatar_id() { 43 | return gravatar_id; 44 | } 45 | 46 | public String getUrl() { 47 | return url; 48 | } 49 | 50 | public String getAvatar_url() { 51 | return avatar_url; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/Page.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean; 2 | 3 | /** 4 | * Created by Caij on 2015/9/21. 5 | */ 6 | public class Page { 7 | 8 | public final static int DEFAULT_PAGE_INDEX = 1; 9 | 10 | public final static int DEFAULT_PAGE_DATA_COUNT = 20; 11 | 12 | private int pageIndex; 13 | private final int pageDataCount; 14 | 15 | public Page() { 16 | this(DEFAULT_PAGE_INDEX, DEFAULT_PAGE_DATA_COUNT); 17 | } 18 | 19 | public Page(int pageIndex, int pageDataCount) { 20 | this.pageDataCount = pageDataCount; 21 | this.pageIndex = pageIndex; 22 | } 23 | 24 | public Page(int pageDataCount) { 25 | this(DEFAULT_PAGE_INDEX, pageDataCount); 26 | } 27 | 28 | public void next() { 29 | pageIndex ++; 30 | } 31 | 32 | public void reset() { 33 | pageIndex = 1; 34 | } 35 | 36 | 37 | public int getPageIndex() { 38 | return pageIndex; 39 | } 40 | 41 | public int getPageDataCount() { 42 | return pageDataCount; 43 | } 44 | 45 | public Page createRefreshPage() { 46 | return new Page(pageDataCount); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/SearchRepository.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by Caij on 2015/9/21. 7 | */ 8 | public class SearchRepository { 9 | 10 | /** 11 | */ 12 | 13 | private int total_count; 14 | private boolean incomplete_results; 15 | private List items; 16 | 17 | public void setTotal_count(int total_count) { 18 | this.total_count = total_count; 19 | } 20 | 21 | public void setIncomplete_results(boolean incomplete_results) { 22 | this.incomplete_results = incomplete_results; 23 | } 24 | 25 | public void setItems(List items) { 26 | this.items = items; 27 | } 28 | 29 | public int getTotal_count() { 30 | return total_count; 31 | } 32 | 33 | public boolean getIncomplete_results() { 34 | return incomplete_results; 35 | } 36 | 37 | public List getItems() { 38 | return items; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/Team.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean; 2 | 3 | /** 4 | * Created by Caij on 2015/10/30. 5 | */ 6 | public class Team extends Entity{ 7 | 8 | /** 9 | * name : Contractors 10 | * id : 123456 11 | * slug : contractors 12 | * permission : admin 13 | * url : https://api.github.com/teams/123456 14 | * members_url : https://api.github.com/teams/123456/members{/member} 15 | * repositories_url : https://api.github.com/teams/123456/repos 16 | */ 17 | 18 | private String name; 19 | private int id; 20 | private String slug; 21 | private String permission; 22 | private String url; 23 | private String members_url; 24 | private String repositories_url; 25 | 26 | public void setName(String name) { 27 | this.name = name; 28 | } 29 | 30 | public void setId(int id) { 31 | this.id = id; 32 | } 33 | 34 | public void setSlug(String slug) { 35 | this.slug = slug; 36 | } 37 | 38 | public void setPermission(String permission) { 39 | this.permission = permission; 40 | } 41 | 42 | public void setUrl(String url) { 43 | this.url = url; 44 | } 45 | 46 | public void setMembers_url(String members_url) { 47 | this.members_url = members_url; 48 | } 49 | 50 | public void setRepositories_url(String repositories_url) { 51 | this.repositories_url = repositories_url; 52 | } 53 | 54 | public String getName() { 55 | return name; 56 | } 57 | 58 | public int getId() { 59 | return id; 60 | } 61 | 62 | public String getSlug() { 63 | return slug; 64 | } 65 | 66 | public String getPermission() { 67 | return permission; 68 | } 69 | 70 | public String getUrl() { 71 | return url; 72 | } 73 | 74 | public String getMembers_url() { 75 | return members_url; 76 | } 77 | 78 | public String getRepositories_url() { 79 | return repositories_url; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/Tree.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by Caij 7 | */ 8 | public class Tree { 9 | private static final long serialVersionUID = -6181332657279059683L; 10 | 11 | private List tree; 12 | private String sha; 13 | private String url; 14 | 15 | public Tree() { 16 | 17 | } 18 | 19 | 20 | public String getSha() { 21 | return sha; 22 | } 23 | 24 | public void setSha(String sha) { 25 | this.sha = sha; 26 | } 27 | 28 | public List getTree() { 29 | return tree; 30 | } 31 | 32 | public void setTree(List tree) { 33 | this.tree = tree; 34 | } 35 | 36 | public String getUrl() { 37 | return url; 38 | } 39 | 40 | public void setUrl(String url) { 41 | this.url = url; 42 | } 43 | 44 | 45 | @Override 46 | public String toString() { 47 | return "Tree{" + 48 | "sha='" + sha + '\'' + 49 | ", tree=" + tree + 50 | ", url='" + url + '\'' + 51 | '}'; 52 | } 53 | } -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/event/BaseEvent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean.event; 2 | 3 | import com.caij.codehub.bean.Entity; 4 | import com.caij.codehub.bean.Repository; 5 | import com.caij.codehub.bean.User; 6 | 7 | /** 8 | * Created by Caij on 2015/10/30. 9 | */ 10 | public class BaseEvent extends Entity{ 11 | 12 | private User sender; 13 | private Repository repository; 14 | 15 | public User getSender() { 16 | return sender; 17 | } 18 | 19 | public void setSender(User sender) { 20 | this.sender = sender; 21 | } 22 | 23 | public Repository getRepository() { 24 | return repository; 25 | } 26 | 27 | public void setRepository(Repository repository) { 28 | this.repository = repository; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/event/DeploymentStatusEvent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean.event; 2 | 3 | import com.caij.codehub.bean.Deployment; 4 | import com.caij.codehub.bean.DeploymentStatus; 5 | 6 | /** 7 | * Created by Caij on 2015/10/30. 8 | */ 9 | public class DeploymentStatusEvent extends BaseEvent{ 10 | 11 | private DeploymentStatus deployment_status; 12 | private Deployment deployment; 13 | 14 | public void setDeployment_status(DeploymentStatus deployment_status) { 15 | this.deployment_status = deployment_status; 16 | } 17 | 18 | public DeploymentStatus getDeployment_status() { 19 | return deployment_status; 20 | } 21 | 22 | public Deployment getDeployment() { 23 | return deployment; 24 | } 25 | 26 | public void setDeployment(Deployment deployment) { 27 | this.deployment = deployment; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/event/DownloadEvent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean.event; 2 | 3 | import com.caij.codehub.bean.Forkee; 4 | 5 | /** 6 | * Created by Caij on 2015/10/30. 7 | */ 8 | public class DownloadEvent extends BaseEvent{ 9 | 10 | private Forkee forkee; 11 | 12 | public Forkee getForkee() { 13 | return forkee; 14 | } 15 | 16 | public void setForkee(Forkee forkee) { 17 | this.forkee = forkee; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/bean/event/TeamAddEvent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.bean.event; 2 | 3 | import com.caij.codehub.bean.Org; 4 | import com.caij.codehub.bean.Team; 5 | 6 | /** 7 | * Created by Caij on 2015/10/30. 8 | */ 9 | public class TeamAddEvent extends BaseEvent{ 10 | private Team team; 11 | private Org organization; 12 | 13 | public Team getTeam() { 14 | return team; 15 | } 16 | 17 | public void setTeam(Team team) { 18 | this.team = team; 19 | } 20 | 21 | public Org getOrganization() { 22 | return organization; 23 | } 24 | 25 | public void setOrganization(Org organization) { 26 | this.organization = organization; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/AuthenticationInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.android.volley.NetworkResponse; 4 | import com.caij.codehub.bean.Token; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by Caij on 2015/8/25. 10 | */ 11 | public interface AuthenticationInteractor extends Interactor { 12 | public void login(String username, String pwd, Object requestTag, InteractorCallBack interactorCallBack); 13 | 14 | public void logout(String base64UsernameAndPwd, String tokenId, Object requestTag, InteractorCallBack interactorCallBack); 15 | 16 | public void getHaveTokens(final String username, final String pwd, Object requestTag, final InteractorCallBack> interactorCallBack); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/CommentActionInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Comment; 4 | 5 | /** 6 | * Created by Caij on 2015/11/3. 7 | */ 8 | public interface CommentActionInteractor extends Interactor { 9 | 10 | public void createCommentForIssue(String comment, String owner, String repo, String num, String token, Object requestTag, InteractorCallBack interactorCallBack); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/CommentsInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Comment; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by Caij on 2015/10/31. 9 | */ 10 | public interface CommentsInteractor extends Interactor { 11 | 12 | public void getIssuesComments(String owner, String repo, String issueNumber, Object requestTag, InteractorCallBack> interactorCallBack); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/EventsInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Page; 4 | import com.caij.codehub.bean.event.Event; 5 | import com.caij.codehub.bean.event.EventWrap; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by Caij on 2015/9/24. 11 | */ 12 | public interface EventsInteractor extends Interactor { 13 | 14 | public void getReceivedEvents(String username, String token, Page page, Object requestTag, InteractorCallBack> interactorCallBack); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/FileTreeInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Tree; 4 | 5 | /** 6 | * Created by Caij on 2015/11/2. 7 | */ 8 | public interface FileTreeInteractor extends Interactor { 9 | 10 | public void loadFileTree(String name, String repo, String ref, Object requestTag, InteractorCallBack interactorCallBack); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/FollowActionInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.android.volley.NetworkResponse; 4 | 5 | /** 6 | * Created by Caij on 2015/11/1. 7 | */ 8 | public interface FollowActionInteractor extends Interactor { 9 | 10 | public void getFollowState(String token, String username, Object requestTag, InteractorCallBack interactorCallBack); 11 | 12 | public void followUser(String token, String username, Object requestTag, InteractorCallBack interactorCallBack); 13 | 14 | public void unfollowUser(String token, String username, Object requestTag, InteractorCallBack interactorCallBack); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/Interactor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | /** 4 | * Created by Administrator on 2015/8/26. 5 | */ 6 | public interface Interactor { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/InteractorCallBack.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.android.volley.VolleyError; 4 | 5 | /** 6 | * Created by Caij on 2015/11/4. 7 | */ 8 | public interface InteractorCallBack { 9 | 10 | public void onSuccess(E e); 11 | 12 | public void onLoading(); 13 | 14 | public void onError(VolleyError error); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/IssueInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | 4 | import com.caij.codehub.bean.Issue; 5 | 6 | /** 7 | * Created by Caij on 2015/10/31. 8 | */ 9 | public interface IssueInteractor extends Interactor { 10 | 11 | public void getIssue(String owner, String repo, String issueNumber, Object requestTag, InteractorCallBack interactorCallBack); 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/IssueListInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Issue; 4 | import com.caij.codehub.bean.Page; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by Caij on 2015/11/3. 10 | */ 11 | public interface IssueListInteractor extends Interactor { 12 | 13 | public void getIssueList(String owner, String repoName, Page page, Object requestTag, InteractorCallBack> interactorCallBack); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/RepositoryActionInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.android.volley.NetworkResponse; 4 | 5 | /** 6 | * Created by Caij on 2015/10/31. 7 | */ 8 | public interface RepositoryActionInteractor extends Interactor { 9 | 10 | public void hasStarRepo(String owner, String repo, String token, Object requestTag, InteractorCallBack interactorCallBack); 11 | 12 | public void starRepo(String owner, String repo, String token, Object requestTag, InteractorCallBack interactorCallBack); 13 | 14 | public void unstarRepo(String owner, String repo, String token, Object requestTag, InteractorCallBack interactorCallBack); 15 | 16 | public void forkRepo(String owner, String repo, String token, Object requestTag, InteractorCallBack interactorCallBack); 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/RepositoryInfoInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Repository; 4 | 5 | /** 6 | * Created by Caij on 2015/9/19. 7 | */ 8 | public interface RepositoryInfoInteractor extends Interactor { 9 | 10 | public void getRepositoryInfo(String repositoryName, String owner, String token, Object requestTag, InteractorCallBack interactorCallBack); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/RepositoryListInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Page; 4 | import com.caij.codehub.bean.Repository; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by Caij on 2015/9/18. 10 | */ 11 | public interface RepositoryListInteractor extends Interactor { 12 | 13 | public void getUserStarredRepositories(String username, String token, Page page, Object requestTag, InteractorCallBack> interactorCallBack); 14 | 15 | public void getUserRepositories(String username, String token, Page page, Object requestTag, InteractorCallBack> interactorCallBack); 16 | 17 | public void getSearchRepository(String q, String sort, String order, Page page, Object requestTag, InteractorCallBack> interactorCallBack); 18 | 19 | public void getTrendingRepository(String since, String language,Object requestTag, InteractorCallBack> interactorCallBack); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/UserInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.User; 4 | 5 | /** 6 | * Created by Caij on 2015/9/18. 7 | */ 8 | public interface UserInteractor extends Interactor { 9 | 10 | public void getUserInfo(String token, String username, Object requestTag, InteractorCallBack interactorCallBack); 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/UserListInteractor.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor; 2 | 3 | import com.caij.codehub.bean.Page; 4 | import com.caij.codehub.bean.User; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by Caij on 2015/9/18. 10 | */ 11 | public interface UserListInteractor extends Interactor { 12 | 13 | public void getFollowers(String token, String username, Page page, Object requestTag, InteractorCallBack> interactorCallBack); 14 | 15 | public void getFollowing(String token, String username, Page page, Object requestTag, InteractorCallBack> interactorCallBack); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/imp/CommentsInteractorImp.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor.imp; 2 | 3 | import com.android.volley.Request; 4 | import com.android.volley.Response; 5 | import com.android.volley.VolleyError; 6 | import com.caij.codehub.API; 7 | import com.caij.codehub.bean.Comment; 8 | import com.caij.codehub.interactor.CommentsInteractor; 9 | import com.caij.codehub.interactor.InteractorCallBack; 10 | import com.caij.lib.utils.VolleyManager; 11 | import com.caij.lib.volley.request.GsonRequest; 12 | import com.google.gson.reflect.TypeToken; 13 | 14 | import java.util.List; 15 | 16 | /** 17 | * Created by Caij on 2015/10/31. 18 | */ 19 | public class CommentsInteractorImp implements CommentsInteractor { 20 | 21 | 22 | @Override 23 | public void getIssuesComments(String owner, String repo, String issueNumber, Object requestTag, final InteractorCallBack> interactorCallBack) { 24 | interactorCallBack.onLoading(); 25 | String url = new StringBuilder().append(API.API_HOST).append("/repos/") 26 | .append(owner).append("/").append(repo).append("/issues/") 27 | .append(issueNumber).append("/comments").toString(); 28 | GsonRequest> request = new GsonRequest>(Request.Method.GET, url, new TypeToken>() { 29 | }.getType(), 30 | new Response.Listener>() { 31 | @Override 32 | public void onResponse(List response) { 33 | interactorCallBack.onSuccess(response); 34 | } 35 | }, new Response.ErrorListener() { 36 | @Override 37 | public void onErrorResponse(VolleyError error) { 38 | interactorCallBack.onError(error); 39 | } 40 | }); 41 | VolleyManager.addRequest(request, requestTag); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/imp/EventsInteractorImp.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor.imp; 2 | 3 | import com.android.volley.Request; 4 | import com.android.volley.Response; 5 | import com.android.volley.VolleyError; 6 | import com.caij.codehub.API; 7 | import com.caij.codehub.bean.Page; 8 | import com.caij.codehub.bean.event.Event; 9 | import com.caij.codehub.interactor.EventsInteractor; 10 | import com.caij.codehub.interactor.InteractorCallBack; 11 | import com.caij.codehub.request.EventRequest; 12 | import com.caij.lib.utils.VolleyManager; 13 | 14 | import java.util.HashMap; 15 | import java.util.List; 16 | import java.util.Map; 17 | 18 | /** 19 | * Created by Caij on 2015/9/24. 20 | */ 21 | public class EventsInteractorImp implements EventsInteractor { 22 | @Override 23 | public void getReceivedEvents(String username, String token, Page page, Object requestTag, final InteractorCallBack> interactorCallBack) { 24 | interactorCallBack.onLoading(); 25 | String url = API.API_HOST + "/users/" + username + "/received_events"; 26 | Map head = new HashMap<>(); 27 | API.configAuthorizationHead(head, token); 28 | Map params = new HashMap<>(); 29 | params.put(API.PAGE, String.valueOf(page.getPageIndex())); 30 | params.put(API.PER_PAGE, String.valueOf(page.getPageDataCount())); 31 | EventRequest request = new EventRequest(Request.Method.GET, url, params, head, new Response.Listener>() { 32 | @Override 33 | public void onResponse(List response) { 34 | interactorCallBack.onSuccess(response); 35 | } 36 | }, new Response.ErrorListener() { 37 | @Override 38 | public void onErrorResponse(VolleyError error) { 39 | interactorCallBack.onError(error); 40 | } 41 | }); 42 | VolleyManager.addRequest(request, requestTag); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/imp/FileTreeInteractorImp.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor.imp; 2 | 3 | import android.text.TextUtils; 4 | 5 | import com.android.volley.Request; 6 | import com.android.volley.Response; 7 | import com.android.volley.VolleyError; 8 | import com.caij.codehub.API; 9 | import com.caij.codehub.bean.Tree; 10 | import com.caij.codehub.interactor.FileTreeInteractor; 11 | import com.caij.codehub.interactor.InteractorCallBack; 12 | import com.caij.lib.utils.VolleyManager; 13 | import com.caij.lib.volley.request.GsonRequest; 14 | import com.google.gson.reflect.TypeToken; 15 | 16 | /** 17 | * Created by Caij on 2015/11/2. 18 | */ 19 | public class FileTreeInteractorImp implements FileTreeInteractor { 20 | 21 | @Override 22 | public void loadFileTree(String name, String repo, String ref, Object requestTag, final InteractorCallBack interactorCallBack) { 23 | interactorCallBack.onLoading(); 24 | StringBuilder builder = new StringBuilder(); 25 | builder.append(API.API_HOST).append("/repos/").append(name).append("/"). 26 | append(repo).append("/git/trees/"); 27 | if (!TextUtils.isEmpty(ref)) { 28 | builder.append(ref); 29 | } 30 | String url = builder.toString(); 31 | GsonRequest request = new GsonRequest(Request.Method.GET, url, new TypeToken() { 32 | }.getType(), new Response.Listener() { 33 | @Override 34 | public void onResponse(Tree response) { 35 | interactorCallBack.onSuccess(response); 36 | } 37 | }, new Response.ErrorListener() { 38 | @Override 39 | public void onErrorResponse(VolleyError error) { 40 | interactorCallBack.onError(error); 41 | } 42 | }); 43 | VolleyManager.addRequest(request, null); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/imp/IssueInteractorImp.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor.imp; 2 | 3 | import com.android.volley.Request; 4 | import com.android.volley.Response; 5 | import com.android.volley.VolleyError; 6 | import com.caij.codehub.API; 7 | import com.caij.codehub.bean.Issue; 8 | import com.caij.codehub.interactor.InteractorCallBack; 9 | import com.caij.codehub.interactor.IssueInteractor; 10 | import com.caij.lib.utils.VolleyManager; 11 | import com.caij.lib.volley.request.GsonRequest; 12 | import com.google.gson.reflect.TypeToken; 13 | 14 | /** 15 | * Created by Caij on 2015/10/31. 16 | */ 17 | public class IssueInteractorImp implements IssueInteractor { 18 | 19 | @Override 20 | public void getIssue(String owner, String repo, String issueNumber, Object requestTag, final InteractorCallBack interactorCallBack) { 21 | interactorCallBack.onLoading(); 22 | String url = new StringBuilder().append(API.API_HOST).append("/repos/").append(owner) 23 | .append("/").append(repo).append("/issues/") 24 | .append(issueNumber).toString(); 25 | GsonRequest request = new GsonRequest(Request.Method.GET, url, new TypeToken() { 26 | }.getType(), new Response.Listener() { 27 | @Override 28 | public void onResponse(Issue response) { 29 | interactorCallBack.onSuccess(response); 30 | } 31 | }, new Response.ErrorListener() { 32 | @Override 33 | public void onErrorResponse(VolleyError error) { 34 | interactorCallBack.onError(error); 35 | } 36 | }); 37 | VolleyManager.addRequest(request, requestTag); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/imp/IssueListInteractorImp.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor.imp; 2 | 3 | import com.android.volley.Request; 4 | import com.android.volley.Response; 5 | import com.android.volley.VolleyError; 6 | import com.caij.codehub.API; 7 | import com.caij.codehub.bean.Issue; 8 | import com.caij.codehub.bean.Page; 9 | import com.caij.codehub.interactor.IssueListInteractor; 10 | import com.caij.codehub.interactor.InteractorCallBack; 11 | import com.caij.lib.utils.VolleyManager; 12 | import com.caij.lib.volley.request.GsonRequest; 13 | import com.google.gson.reflect.TypeToken; 14 | 15 | import java.util.HashMap; 16 | import java.util.List; 17 | import java.util.Map; 18 | 19 | /** 20 | * Created by Caij on 2015/11/3. 21 | */ 22 | public class IssueListInteractorImp implements IssueListInteractor { 23 | 24 | @Override 25 | public void getIssueList(String owner, String repoName, Page page, Object requestTag, final InteractorCallBack> interactorCallBack) { 26 | interactorCallBack.onLoading(); 27 | StringBuilder builder = new StringBuilder(API.API_HOST); 28 | builder.append("/repos/").append(owner).append("/").append(repoName).append("/").append("issues"); 29 | String url = builder.toString(); 30 | 31 | Map params = new HashMap<>(); 32 | params.put(API.PAGE, String.valueOf(page.getPageIndex())); 33 | params.put(API.PER_PAGE, String.valueOf(page.getPageDataCount())); 34 | 35 | GsonRequest> request = new GsonRequest>(Request.Method.GET, url, params, new TypeToken>() { 36 | }.getType(), 37 | new Response.Listener>() { 38 | @Override 39 | public void onResponse(List response) { 40 | interactorCallBack.onSuccess(response); 41 | } 42 | }, new Response.ErrorListener() { 43 | @Override 44 | public void onErrorResponse(VolleyError error) { 45 | interactorCallBack.onError(error); 46 | } 47 | }); 48 | VolleyManager.addRequest(request, requestTag); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/imp/RepositoryInfoInteractorImp.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor.imp; 2 | 3 | import com.android.volley.Request; 4 | import com.android.volley.Response; 5 | import com.android.volley.VolleyError; 6 | import com.caij.codehub.API; 7 | import com.caij.codehub.bean.Repository; 8 | import com.caij.codehub.interactor.InteractorCallBack; 9 | import com.caij.codehub.interactor.RepositoryInfoInteractor; 10 | import com.caij.lib.utils.VolleyManager; 11 | import com.caij.lib.volley.request.GsonRequest; 12 | import com.google.gson.reflect.TypeToken; 13 | 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | /** 18 | * Created by Caij on 2015/9/19. 19 | */ 20 | public class RepositoryInfoInteractorImp implements RepositoryInfoInteractor { 21 | 22 | @Override 23 | public void getRepositoryInfo(String repositoryName, String owner, String token, Object requestTag, final InteractorCallBack interactorCallBack) { 24 | interactorCallBack.onLoading(); 25 | String url = API.API_HOST + API.REPOSITORY_REPOS_URI + "/" + owner + "/" + repositoryName; 26 | Map head = new HashMap<>(); 27 | API.configAuthorizationHead(head, token); 28 | GsonRequest request = new GsonRequest(Request.Method.GET, url, "", head, new TypeToken() {}.getType(), 29 | new Response.Listener() { 30 | @Override 31 | public void onResponse(Repository response) { 32 | interactorCallBack.onSuccess(response); 33 | } 34 | }, new Response.ErrorListener() { 35 | @Override 36 | public void onErrorResponse(VolleyError error) { 37 | interactorCallBack.onError(error); 38 | } 39 | }); 40 | VolleyManager.addRequest(request, requestTag); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/interactor/imp/UserInteractorImp.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.interactor.imp; 2 | 3 | import com.android.volley.Request; 4 | import com.android.volley.Response; 5 | import com.android.volley.VolleyError; 6 | import com.caij.codehub.API; 7 | import com.caij.codehub.bean.User; 8 | import com.caij.codehub.interactor.InteractorCallBack; 9 | import com.caij.codehub.interactor.UserInteractor; 10 | import com.caij.lib.utils.VolleyManager; 11 | import com.caij.lib.volley.request.GsonRequest; 12 | import com.google.gson.reflect.TypeToken; 13 | 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | /** 18 | * Created by Caij on 2015/9/18. 19 | */ 20 | public class UserInteractorImp implements UserInteractor { 21 | 22 | @Override 23 | public void getUserInfo(String token, String username, Object requestTag, final InteractorCallBack interactorCallBack) { 24 | interactorCallBack.onLoading(); 25 | String url = API.API_HOST + "/users/" + username; 26 | Map head = new HashMap<>(); 27 | API.configAuthorizationHead(head, token); 28 | GsonRequest request = new GsonRequest(Request.Method.GET, url, "", head, new TypeToken() {}.getType(),new Response.Listener() { 29 | @Override 30 | public void onResponse(User response) { 31 | interactorCallBack.onSuccess(response); 32 | } 33 | }, new Response.ErrorListener() { 34 | @Override 35 | public void onErrorResponse(VolleyError error) { 36 | interactorCallBack.onError(error); 37 | } 38 | }); 39 | VolleyManager.addRequest(request, requestTag); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/CommentPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.Comment; 4 | import com.caij.codehub.interactor.CommentActionInteractor; 5 | import com.caij.codehub.interactor.InteractorFactory; 6 | import com.caij.codehub.present.ui.CommentUi; 7 | 8 | /** 9 | * Author Caij 10 | * Email worldcaij@gmail.com 11 | * Created by Caij on 2015/11/17. 12 | */ 13 | public class CommentPresent extends Present{ 14 | 15 | private CommentActionInteractor mCommentActionInteractor; 16 | 17 | public CommentPresent(CommentUi ui) { 18 | super(ui); 19 | mCommentActionInteractor = InteractorFactory.newInteractorInstance(CommentActionInteractor.class); 20 | } 21 | 22 | public void createCommentForIssue(String comment, String owner, String repo, String num, String token) { 23 | mCommentActionInteractor.createCommentForIssue(comment, owner, repo, num, token, this, new DefaultInteractorCallback(mUi) { 24 | @Override 25 | public void onError(int msgId) { 26 | mUi.showProgressBarLoading(false); 27 | mUi.showError(msgId); 28 | } 29 | 30 | @Override 31 | public void onSuccess(Comment comment) { 32 | mUi.showProgressBarLoading(false); 33 | mUi.commentSuccess(comment); 34 | } 35 | 36 | @Override 37 | public void onLoading() { 38 | mUi.showProgressBarLoading(true); 39 | } 40 | }); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/CommentsPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.Comment; 4 | import com.caij.codehub.interactor.CommentsInteractor; 5 | import com.caij.codehub.interactor.InteractorFactory; 6 | import com.caij.codehub.present.ui.ListUi; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * Author Caij 12 | * Email worldcaij@gmail.com 13 | * Created by Caij on 2015/11/16. 14 | */ 15 | public class CommentsPresent extends ListPresent, Comment>{ 16 | 17 | private CommentsInteractor mCommentsInteractor; 18 | 19 | public CommentsPresent(ListUi ui) { 20 | super(ui); 21 | mCommentsInteractor = InteractorFactory.newInteractorInstance(CommentsInteractor.class); 22 | } 23 | 24 | public void getIssuesComments(String owner, String repo, String issueNumber) { 25 | mCommentsInteractor.getIssuesComments(owner, repo, issueNumber, this, new DefaultInteractorCallback>(mUi) { 26 | @Override 27 | public void onError(int msgId) { 28 | defaultDealWithError(msgId, LoadType.FIRST); 29 | } 30 | 31 | @Override 32 | public void onSuccess(List comments) { 33 | defaultDealWithSuccess(comments, LoadType.FIRST); 34 | } 35 | 36 | @Override 37 | public void onLoading() { 38 | defaultDealWithLoading(LoadType.FIRST); 39 | } 40 | }); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/DefaultInteractorCallback.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.android.volley.AuthFailureError; 4 | import com.android.volley.NetworkError; 5 | import com.android.volley.ServerError; 6 | import com.android.volley.TimeoutError; 7 | import com.android.volley.VolleyError; 8 | import com.caij.codehub.R; 9 | import com.caij.codehub.present.ui.BaseUi; 10 | import com.caij.codehub.interactor.InteractorCallBack; 11 | import com.caij.lib.utils.VolleyManager; 12 | import com.caij.lib.volley.request.JsonParseError; 13 | 14 | /** 15 | * Created by Caij on 2015/11/16. 16 | */ 17 | public abstract class DefaultInteractorCallback implements InteractorCallBack { 18 | 19 | private BaseUi mUi; 20 | 21 | public DefaultInteractorCallback(BaseUi ui) { 22 | this.mUi = ui; 23 | } 24 | 25 | @Override 26 | public void onError(VolleyError error) { 27 | onError(dealWithVolleyError(error)); 28 | } 29 | 30 | private int dealWithVolleyError(VolleyError error) { 31 | int msgId; 32 | if (error instanceof ServerError || error instanceof JsonParseError) { 33 | msgId = R.string.server_error_hint; 34 | }else if(error instanceof NetworkError || error instanceof TimeoutError) { 35 | msgId = R.string.network_error_hint; 36 | }else if (error instanceof AuthFailureError) { 37 | msgId = R.string.account_error_hint; 38 | VolleyManager.cancelAllRequest(); 39 | mUi.onAuthError(); 40 | }else { 41 | msgId = R.string.data_load_error_hint; 42 | } 43 | return msgId; 44 | } 45 | 46 | public abstract void onError(int msgId); 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/EventsPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.Page; 4 | import com.caij.codehub.bean.event.Event; 5 | import com.caij.codehub.bean.event.EventWrap; 6 | import com.caij.codehub.interactor.EventsInteractor; 7 | import com.caij.codehub.interactor.InteractorFactory; 8 | import com.caij.codehub.present.ui.ListUi; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * Author Caij 14 | * Email worldcaij@gmail.com 15 | * Created by Caij on 2015/11/16. 16 | */ 17 | public class EventsPresent extends ListPresent, Event>{ 18 | 19 | private EventsInteractor mEventsInteractor; 20 | 21 | public EventsPresent(ListUi ui) { 22 | super(ui); 23 | mEventsInteractor = InteractorFactory.newInteractorInstance(EventsInteractor.class); 24 | } 25 | 26 | public void getReceivedEvents(final LoadType loadType, String username, String token, Page page) { 27 | mEventsInteractor.getReceivedEvents(username, token, page, this, new DefaultInteractorCallback>(mUi) { 28 | @Override 29 | public void onError(int msgId) { 30 | defaultDealWithError(msgId, loadType); 31 | } 32 | 33 | @Override 34 | public void onSuccess(List eventWraps) { 35 | defaultDealWithSuccess(eventWraps, loadType); 36 | } 37 | 38 | @Override 39 | public void onLoading() { 40 | defaultDealWithLoading(loadType); 41 | } 42 | }); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/FileTreePresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.FileTreeItem; 4 | import com.caij.codehub.bean.Tree; 5 | import com.caij.codehub.interactor.FileTreeInteractor; 6 | import com.caij.codehub.interactor.InteractorFactory; 7 | import com.caij.codehub.present.ui.ListUi; 8 | 9 | /** 10 | * Author Caij 11 | * Email worldcaij@gmail.com 12 | * Created by Caij on 2015/11/16. 13 | */ 14 | public class FileTreePresent extends ListPresent, FileTreeItem>{ 15 | 16 | private FileTreeInteractor mFileTreeInteractor; 17 | 18 | public FileTreePresent(ListUi ui) { 19 | super(ui); 20 | mFileTreeInteractor = InteractorFactory.newInteractorInstance(FileTreeInteractor.class); 21 | } 22 | 23 | public void loadFileTree(String name, String repo, String ref) { 24 | mFileTreeInteractor.loadFileTree(name, repo, ref, this, new DefaultInteractorCallback(mUi) { 25 | @Override 26 | public void onError(int msgId) { 27 | defaultDealWithError(msgId, LoadType.FIRST); 28 | } 29 | 30 | @Override 31 | public void onSuccess(Tree tree) { 32 | defaultDealWithSuccess(tree.getTree(), LoadType.FIRST); 33 | } 34 | 35 | @Override 36 | public void onLoading() { 37 | defaultDealWithLoading(LoadType.FIRST); 38 | } 39 | }); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ListPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.Entity; 4 | import com.caij.codehub.present.ui.ListUi; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Author Caij 10 | * Email worldcaij@gmail.com 11 | * Created by Caij on 2015/11/16. 12 | */ 13 | public abstract class ListPresent, E extends Entity> extends Present{ 14 | 15 | public ListPresent(UI ui) { 16 | super(ui); 17 | } 18 | 19 | protected void defaultDealWithError(int msgId, LoadType loadType) { 20 | switch (loadType) { 21 | case FIRST: 22 | mUi.showContentAnimLoading(false); 23 | mUi.showContentError(); 24 | mUi.onFirstLoadError(msgId); 25 | break; 26 | 27 | case REFRESH: 28 | mUi.onRefreshError(msgId); 29 | break; 30 | 31 | case LOADMORE: 32 | mUi.onLoadMoreError(msgId); 33 | break; 34 | } 35 | } 36 | 37 | protected void defaultDealWithSuccess(List entities, LoadType loadType) { 38 | switch (loadType) { 39 | case FIRST: 40 | mUi.showContentAnimLoading(false); 41 | mUi.onFirstLoadSuccess(entities); 42 | if (entities == null || entities.size() == 0) { 43 | mUi.showEmptyView(true); 44 | } else { 45 | mUi.showEmptyView(false); 46 | } 47 | break; 48 | 49 | case REFRESH: 50 | mUi.onRefreshSuccess(entities); 51 | if (entities == null || entities.size() == 0) { 52 | mUi.showEmptyView(true); 53 | } else { 54 | mUi.showEmptyView(false); 55 | } 56 | break; 57 | 58 | case LOADMORE: 59 | mUi.onLoadMoreSuccess(entities); 60 | break; 61 | } 62 | } 63 | 64 | protected void defaultDealWithLoading(LoadType loadType) { 65 | switch (loadType) { 66 | case FIRST: 67 | mUi.showContentAnimLoading(true); 68 | break; 69 | 70 | case REFRESH: 71 | break; 72 | 73 | case LOADMORE: 74 | break; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/LoadType.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | /** 4 | * Author Caij 5 | * Email worldcaij@gmail.com 6 | * Created by Caij on 2015/11/16. 7 | */ 8 | public enum LoadType { 9 | FIRST, REFRESH, LOADMORE 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/MainPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.User; 4 | import com.caij.codehub.interactor.InteractorFactory; 5 | import com.caij.codehub.interactor.UserInteractor; 6 | import com.caij.codehub.present.ui.MainUi; 7 | 8 | /** 9 | * Author Caij 10 | * Email worldcaij@gmail.com 11 | * Created by Caij on 2015/11/16. 12 | */ 13 | public class MainPresent extends Present{ 14 | 15 | protected final UserInteractor mUserInterctor; 16 | 17 | public MainPresent(MainUi ui) { 18 | super(ui); 19 | mUserInterctor = InteractorFactory.newInteractorInstance(UserInteractor.class); 20 | } 21 | 22 | public void getUserInfo(String token, String username) { 23 | mUserInterctor.getUserInfo(token, username, this, new DefaultInteractorCallback(mUi) { 24 | @Override 25 | public void onSuccess(User user) { 26 | mUi.onGetUserInfoSuccess(user); 27 | } 28 | 29 | @Override 30 | public void onLoading() { 31 | 32 | } 33 | 34 | @Override 35 | public void onError(int msgId) { 36 | mUi.showError(msgId); 37 | } 38 | }); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/Present.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.present.ui.BaseUi; 4 | import com.caij.lib.utils.VolleyManager; 5 | 6 | import java.lang.ref.WeakReference; 7 | 8 | /** 9 | * Created by Caij on 2015/11/16. 10 | */ 11 | public abstract class Present { 12 | 13 | public UI mUi; 14 | 15 | public Present(UI ui) { 16 | this.mUi = ui; 17 | if (ui == null) throw new RuntimeException("ui is null"); 18 | } 19 | 20 | public void onDeath() { 21 | VolleyManager.cancelRequestByTag(this); 22 | mUi = null; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/RepoIssuesPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.Issue; 4 | import com.caij.codehub.bean.Page; 5 | import com.caij.codehub.interactor.InteractorFactory; 6 | import com.caij.codehub.interactor.IssueListInteractor; 7 | import com.caij.codehub.present.ui.ListUi; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Author Caij 13 | * Email worldcaij@gmail.com 14 | * Created by Caij on 2015/11/16. 15 | */ 16 | public class RepoIssuesPresent extends ListPresent, Issue>{ 17 | 18 | private IssueListInteractor mIssueListInteractor; 19 | 20 | public RepoIssuesPresent(ListUi ui) { 21 | super(ui); 22 | mIssueListInteractor = InteractorFactory.newInteractorInstance(IssueListInteractor.class); 23 | } 24 | 25 | public void getIssueList(final LoadType loadType, String owner, String repoName, Page page) { 26 | mIssueListInteractor.getIssueList(owner, repoName, page, this, new DefaultInteractorCallback>(mUi) { 27 | @Override 28 | public void onError(int msgId) { 29 | defaultDealWithError(msgId, loadType); 30 | } 31 | 32 | @Override 33 | public void onSuccess(List issues) { 34 | defaultDealWithSuccess(issues, loadType); 35 | } 36 | 37 | @Override 38 | public void onLoading() { 39 | defaultDealWithLoading(loadType); 40 | } 41 | }); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/SettingPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.android.volley.NetworkResponse; 4 | import com.caij.codehub.interactor.InteractorFactory; 5 | import com.caij.codehub.interactor.AuthenticationInteractor; 6 | import com.caij.codehub.present.ui.SettingUi; 7 | 8 | /** 9 | * Author Caij 10 | * Email worldcaij@gmail.com 11 | * Created by Caij on 2015/11/17. 12 | */ 13 | public class SettingPresent extends Present{ 14 | 15 | private final AuthenticationInteractor mAuthenticationInteractor; 16 | 17 | public SettingPresent(SettingUi ui) { 18 | super(ui); 19 | mAuthenticationInteractor = InteractorFactory.newInteractorInstance(AuthenticationInteractor.class); 20 | } 21 | 22 | public void logout(String base64UsernameAndPwd, String tokenId){ 23 | mAuthenticationInteractor.logout(base64UsernameAndPwd, tokenId, this, new DefaultInteractorCallback(mUi) { 24 | @Override 25 | public void onError(int msgId) { 26 | mUi.showLogoutLoading(false); 27 | mUi.showError(msgId); 28 | } 29 | 30 | @Override 31 | public void onSuccess(NetworkResponse response) { 32 | mUi.showLogoutLoading(false); 33 | mUi.logoutSuccess(); 34 | } 35 | 36 | @Override 37 | public void onLoading() { 38 | mUi.showLogoutLoading(true); 39 | } 40 | }); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/UsersPresent.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present; 2 | 3 | import com.caij.codehub.bean.Page; 4 | import com.caij.codehub.bean.User; 5 | import com.caij.codehub.interactor.InteractorFactory; 6 | import com.caij.codehub.interactor.UserListInteractor; 7 | import com.caij.codehub.present.ui.ListUi; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Author Caij 13 | * Email worldcaij@gmail.com 14 | * Created by Caij on 2015/11/16. 15 | */ 16 | public class UsersPresent extends ListPresent, User>{ 17 | 18 | private UserListInteractor mUserListInteractor; 19 | 20 | public UsersPresent(ListUi ui) { 21 | super(ui); 22 | mUserListInteractor = InteractorFactory.newInteractorInstance(UserListInteractor.class); 23 | } 24 | 25 | public void getFollowers(final LoadType loadType, String token, String username, Page page) { 26 | mUserListInteractor.getFollowers(token, username, page, this, new DefaultInteractorCallback>(mUi) { 27 | @Override 28 | public void onError(int msgId) { 29 | defaultDealWithError(msgId, loadType); 30 | } 31 | 32 | @Override 33 | public void onSuccess(List users) { 34 | defaultDealWithSuccess(users, loadType); 35 | } 36 | 37 | @Override 38 | public void onLoading() { 39 | defaultDealWithLoading(loadType); 40 | } 41 | }); 42 | } 43 | 44 | public void getFollowing(final LoadType loadType, String token, String username, Page page){ 45 | mUserListInteractor.getFollowing(token, username, page, this, new DefaultInteractorCallback>(mUi) { 46 | @Override 47 | public void onError(int msgId) { 48 | defaultDealWithError(msgId, loadType); 49 | } 50 | 51 | @Override 52 | public void onSuccess(List users) { 53 | defaultDealWithSuccess(users, loadType); 54 | } 55 | 56 | @Override 57 | public void onLoading() { 58 | defaultDealWithLoading(loadType); 59 | } 60 | }); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/BaseUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | /** 4 | * Created by Caij on 2015/11/16. 5 | */ 6 | public interface BaseUi { 7 | 8 | public void onAuthError(); 9 | 10 | public void showContentAnimLoading(boolean isVisible); 11 | 12 | public void showError(int msgId); 13 | 14 | public void showContentError(); 15 | 16 | public void showProgressBarLoading(boolean isVisible); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/CommentUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | import com.caij.codehub.bean.Comment; 4 | 5 | /** 6 | * Author Caij 7 | * Email worldcaij@gmail.com 8 | * Created by Caij on 2015/11/17. 9 | */ 10 | public interface CommentUi extends BaseUi{ 11 | 12 | public void commentSuccess(Comment comment); 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/ListUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | import com.caij.codehub.bean.Entity; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by Caij on 2015/11/2. 9 | */ 10 | public interface ListUi extends RecyclerViewUi, SwipeRefreshUi{ 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/MainUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | /** 4 | * Author Caij 5 | * Email worldcaij@gmail.com 6 | * Created by Caij on 2015/11/16. 7 | */ 8 | public interface MainUi extends UserUi{ 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/RecyclerViewUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Author: Caij 7 | * Email: worldcaij@gmail.com 8 | * Date: 2015/11/21 9 | * Description: 10 | */ 11 | public interface RecyclerViewUi extends BaseUi{ 12 | 13 | public void onFirstLoadSuccess(List entities); 14 | 15 | public void onFirstLoadError(int msgId); 16 | 17 | public void onLoadMoreSuccess(List entities); 18 | 19 | public void onLoadMoreError(int msgId); 20 | 21 | public void showEmptyView(boolean isVisible); 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/RepositoryInfoUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | import com.caij.codehub.bean.Repository; 4 | 5 | /** 6 | * Author Caij 7 | * Email worldcaij@gmail.com 8 | * Created by Caij on 2015/11/16. 9 | */ 10 | public interface RepositoryInfoUi extends BaseUi{ 11 | 12 | public void getRepositoryInfoSuccess(Repository repository); 13 | 14 | public void getStarStateSuccess(boolean isStar); 15 | 16 | public void starSuccess(); 17 | 18 | public void unstarSuccess(); 19 | 20 | public void forkSuccess(); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/SettingUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | /** 4 | * Author Caij 5 | * Email worldcaij@gmail.com 6 | * Created by Caij on 2015/11/17. 7 | */ 8 | public interface SettingUi extends BaseUi{ 9 | 10 | public void logoutSuccess(); 11 | 12 | public void showLogoutLoading(boolean isVisible); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/SwipeRefreshUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Author: Caij 7 | * Email: worldcaij@gmail.com 8 | * Date: 2015/11/21 9 | * Description: 10 | */ 11 | public interface SwipeRefreshUi extends BaseUi{ 12 | 13 | public void onRefreshSuccess(List entities); 14 | 15 | public void onRefreshError(int msgId); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/UserAndActionUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | /** 4 | * Author Caij 5 | * Email worldcaij@gmail.com 6 | * Created by Caij on 2015/11/16. 7 | */ 8 | public interface UserAndActionUi extends UserUi{ 9 | 10 | public void onGetFollowInfoSuccess(boolean isFollow); 11 | public void onGetFollowInfoError(boolean isFollow); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/UserInfoUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | /** 4 | * Author Caij 5 | * Email worldcaij@gmail.com 6 | * Created by Caij on 2015/11/16. 7 | */ 8 | public interface UserInfoUi extends UserUi{ 9 | 10 | public void onGetFollowStateSuccess(boolean isFollow); 11 | public void onFollowSuccess(); 12 | public void onUnfollowSuccess(); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/UserLoginUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | import com.caij.codehub.bean.Token; 4 | 5 | /** 6 | * Created by Caij on 2015/11/16. 7 | */ 8 | public interface UserLoginUi extends BaseUi{ 9 | 10 | public void onLoginSuccess(Token token); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/present/ui/UserUi.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.present.ui; 2 | 3 | import com.caij.codehub.bean.User; 4 | 5 | /** 6 | * Author Caij 7 | * Email worldcaij@gmail.com 8 | * Created by Caij on 2015/11/16. 9 | */ 10 | public interface UserUi extends BaseUi{ 11 | public void onGetUserInfoSuccess(User user); 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/AboutActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.content.Intent; 4 | import android.content.pm.PackageInfo; 5 | import android.content.pm.PackageManager; 6 | import android.os.Bundle; 7 | import android.widget.TextView; 8 | 9 | import com.caij.codehub.API; 10 | import com.caij.codehub.R; 11 | 12 | import butterknife.Bind; 13 | import butterknife.OnClick; 14 | 15 | /** 16 | * Created by Caij on 2015/11/7. 17 | */ 18 | public class AboutActivity extends BaseCodeHubToolBarActivity { 19 | 20 | @Bind(R.id.tv_version) 21 | TextView mTvVersion; 22 | @Bind(R.id.tv_contact) 23 | TextView mTvContact; 24 | 25 | @Override 26 | protected int getAttachLayoutId() { 27 | return R.layout.activity_about; 28 | } 29 | 30 | @Override 31 | protected void handleIntent(Intent intent) { 32 | setTitle(getString(R.string.about)); 33 | try { 34 | PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); 35 | mTvVersion.setText(getString(R.string.current_version) + ":" + packageInfo.versionName); 36 | } catch (PackageManager.NameNotFoundException e) { 37 | mTvVersion.setText(getString(R.string.current_version) + ":" + "UnKnow"); 38 | } 39 | mTvContact.setText(R.string.my_email); 40 | } 41 | 42 | @OnClick(R.id.ll_open_source) 43 | public void onOpenSourceClick() { 44 | Intent intent = WebActivity.newIntent(this, getString(R.string.app_name), API.PROJECT_README_URL); 45 | startActivity(intent); 46 | } 47 | 48 | @OnClick(R.id.ll_source_code) 49 | public void onSourceCodeClick() { 50 | Intent intent = WebActivity.newIntent(this, getString(R.string.app_name), API.PROJECT_URL); 51 | startActivity(intent); 52 | } 53 | 54 | @OnClick(R.id.ll_about_me) 55 | public void onAboutMeClick() { 56 | Intent intent = WebActivity.newIntent(this, getString(R.string.about_me), getString(R.string.about_me_github)); 57 | startActivity(intent); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/BaseCodeHubToolBarActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.widget.Toolbar; 6 | import android.text.TextUtils; 7 | import android.view.MenuItem; 8 | import com.caij.codehub.R; 9 | 10 | import butterknife.Bind; 11 | 12 | /** 13 | * Created by Caij on 2015/9/19. 14 | */ 15 | public abstract class BaseCodeHubToolBarActivity extends BaseCodeHubActivity{ 16 | 17 | @Bind(R.id.toolbar) 18 | protected Toolbar mToolbar; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setSystemBarTintColor(getResources().getColor(R.color.color_primary_dark)); 24 | setSupportActionBar(mToolbar); 25 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 26 | 27 | handleIntent(getIntent()); 28 | } 29 | 30 | protected abstract void handleIntent(Intent intent); 31 | 32 | @Override 33 | protected int getContentLayoutId() { 34 | return R.layout.activity_base_codehub_toolbar; 35 | } 36 | 37 | @Override 38 | protected int getContentContainerViewId() { 39 | return R.id.base_code_hub_container; 40 | } 41 | 42 | @Override 43 | public boolean onOptionsItemSelected(MenuItem item) { 44 | switch (item.getItemId()) { 45 | case android.R.id.home: 46 | finish(); 47 | return true; 48 | } 49 | return super.onOptionsItemSelected(item); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/CommentActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.widget.EditText; 6 | 7 | import com.caij.codehub.CodeHubPrefs; 8 | import com.caij.codehub.Constant; 9 | import com.caij.codehub.R; 10 | import com.caij.codehub.bean.Comment; 11 | import com.caij.codehub.present.CommentPresent; 12 | import com.caij.codehub.present.ui.CommentUi; 13 | import com.caij.lib.utils.ToastUtil; 14 | 15 | import butterknife.Bind; 16 | import butterknife.OnClick; 17 | 18 | /** 19 | * Created by Caij on 2015/11/3. 20 | */ 21 | public class CommentActivity extends BaseCodeHubToolBarActivity implements CommentUi { 22 | 23 | @Bind(R.id.edit_comment) 24 | EditText mEditComment; 25 | 26 | private CommentPresent mCommentPresent; 27 | private String mRepo; 28 | private String mIssueNumber; 29 | private String mOwner; 30 | private String mToken; 31 | 32 | public static Intent newIntent(Activity activity,String owner, String repo, String issueNumber) { 33 | Intent intent = new Intent(activity, CommentActivity.class); 34 | intent.putExtra(Constant.REPO_NAME, repo); 35 | intent.putExtra(Constant.USER_NAME, owner); 36 | intent.putExtra(Constant.ISSUE_NUMBER, issueNumber); 37 | return intent; 38 | } 39 | 40 | @Override 41 | protected int getAttachLayoutId() { 42 | return R.layout.activity_comment; 43 | } 44 | 45 | @Override 46 | protected void handleIntent(Intent intent) { 47 | setTitle(getString(R.string.comment)); 48 | mCommentPresent = new CommentPresent(this); 49 | mRepo = intent.getStringExtra(Constant.REPO_NAME); 50 | mIssueNumber = intent.getStringExtra(Constant.ISSUE_NUMBER); 51 | mOwner = intent.getStringExtra(Constant.USER_NAME); 52 | mToken = CodeHubPrefs.get().getToken(); 53 | } 54 | 55 | @OnClick(R.id.btn_comment) 56 | public void onCommentClick() { 57 | mCommentPresent.createCommentForIssue(mEditComment.getText().toString(), mOwner, mRepo, mIssueNumber, mToken); 58 | } 59 | 60 | @Override 61 | public void commentSuccess(Comment comment) { 62 | ToastUtil.show(CommentActivity.this, R.string.comment_success); 63 | Intent intent = new Intent(); 64 | intent.putExtra(Constant.COMMENT, comment); 65 | setResult(RESULT_OK, intent); 66 | finish(); 67 | } 68 | 69 | @Override 70 | protected void onDestroy() { 71 | mCommentPresent.onDeath(); 72 | super.onDestroy(); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/FollowersActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | 6 | import com.caij.codehub.Constant; 7 | import com.caij.codehub.R; 8 | import com.caij.codehub.present.UsersPresent; 9 | import com.caij.codehub.ui.fragment.FollowersFragment; 10 | import com.caij.codehub.ui.fragment.FollowingsFragment; 11 | 12 | /** 13 | * Created by Caij on 2015/9/25. 14 | */ 15 | public class FollowersActivity extends BaseCodeHubToolBarActivity{ 16 | 17 | public static Intent newIntent(Activity activity, String username) { 18 | Intent intent = new Intent(activity, FollowersActivity.class); 19 | intent.putExtra(Constant.USER_NAME, username); 20 | return intent; 21 | } 22 | 23 | @Override 24 | protected void handleIntent(Intent intent) { 25 | setTitle(getString(R.string.follows)); 26 | FollowersFragment fragment = FollowersFragment.newInstance(getIntent().getStringExtra(Constant.USER_NAME)); 27 | fragment.setUserVisibleHint(true); 28 | getSupportFragmentManager().beginTransaction() 29 | .replace(R.id.base_code_hub_container, fragment) 30 | .commit(); 31 | } 32 | 33 | @Override 34 | protected int getAttachLayoutId() { 35 | return 0; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/FollowingActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | 6 | import com.caij.codehub.Constant; 7 | import com.caij.codehub.R; 8 | import com.caij.codehub.ui.fragment.FollowingsFragment; 9 | 10 | /** 11 | * Created by Caij on 2015/9/25. 12 | */ 13 | public class FollowingActivity extends BaseCodeHubToolBarActivity{ 14 | 15 | public static Intent newIntent(Activity activity, String username) { 16 | Intent intent = new Intent(activity, FollowingActivity.class); 17 | intent.putExtra(Constant.USER_NAME, username); 18 | return intent; 19 | } 20 | 21 | @Override 22 | protected void handleIntent(Intent intent) { 23 | setTitle(getString(R.string.following)); 24 | FollowingsFragment fragment = FollowingsFragment.newInstance(getIntent().getStringExtra(Constant.USER_NAME)); 25 | fragment.setUserVisibleHint(true); 26 | getSupportFragmentManager().beginTransaction() 27 | .replace(R.id.base_code_hub_container, fragment) 28 | .commit(); 29 | } 30 | 31 | @Override 32 | protected int getAttachLayoutId() { 33 | return 0; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/InitActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.content.Intent; 4 | import android.os.Handler; 5 | import android.os.Bundle; 6 | import android.text.TextUtils; 7 | 8 | import com.caij.codehub.CodeHubPrefs; 9 | import com.caij.codehub.Constant; 10 | import com.caij.codehub.R; 11 | import com.caij.lib.utils.SPUtils; 12 | 13 | public class InitActivity extends BaseCodeHubActivity { 14 | 15 | public static final long SKIP_DELAY_TIME = 3000; 16 | 17 | private Handler mHandler; 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setFullScreen(); 23 | mHandler = new Handler(); 24 | } 25 | 26 | @Override 27 | protected int getAttachLayoutId() { 28 | return R.layout.activity_init; 29 | } 30 | 31 | @Override 32 | protected void onStart() { 33 | super.onStart(); 34 | mHandler.postDelayed(new Runnable() { 35 | @Override 36 | public void run() { 37 | Intent intent; 38 | if (TextUtils.isEmpty(CodeHubPrefs.get().getToken())) { 39 | intent = new Intent(InitActivity.this, LoginActivity.class); 40 | } else { 41 | intent = new Intent(InitActivity.this, MainActivity.class); 42 | } 43 | startActivity(intent); 44 | finish(); 45 | } 46 | }, SKIP_DELAY_TIME); 47 | } 48 | 49 | @Override 50 | protected void onStop() { 51 | super.onStop(); 52 | mHandler.removeCallbacksAndMessages(null); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/IssueInfoActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.view.Menu; 8 | import android.view.MenuItem; 9 | import android.view.View; 10 | import android.widget.TextView; 11 | 12 | 13 | import com.caij.codehub.Constant; 14 | import com.caij.codehub.R; 15 | import com.caij.codehub.bean.Comment; 16 | import com.caij.codehub.interactor.CommentsInteractor; 17 | import com.caij.codehub.interactor.InteractorFactory; 18 | import com.caij.codehub.present.CommentsPresent; 19 | import com.caij.codehub.ui.adapter.BaseAdapter; 20 | import com.caij.codehub.ui.adapter.CommentAdapter; 21 | import com.caij.codehub.ui.fragment.IssueInfoFragment; 22 | import com.caij.codehub.widgets.recyclerview.LoadMoreRecyclerView; 23 | 24 | 25 | /** 26 | * Created by Caij on 2015/10/31. 27 | */ 28 | public class IssueInfoActivity extends BaseCodeHubToolBarActivity { 29 | 30 | public static Intent newIntent(Activity activity, String owner, String repo, String issueNumber, String issueTitle, String issueBody) { 31 | Intent intent = new Intent(activity, IssueInfoActivity.class); 32 | intent.putExtra(Constant.REPO_NAME, repo); 33 | intent.putExtra(Constant.USER_NAME, owner); 34 | intent.putExtra(Constant.ISSUE_NUMBER, issueNumber); 35 | intent.putExtra(Constant.ISSUE_TITLE, issueTitle); 36 | intent.putExtra(Constant.ISSUE_BODY, issueBody); 37 | return intent; 38 | } 39 | 40 | @Override 41 | protected void handleIntent(Intent intent) { 42 | String repoName = intent.getStringExtra(Constant.REPO_NAME); 43 | String issueNumber = intent.getStringExtra(Constant.ISSUE_NUMBER); 44 | 45 | setTitle(repoName + " #" + issueNumber); 46 | 47 | IssueInfoFragment fragment = IssueInfoFragment.newInstance(intent.getStringExtra(Constant.USER_NAME), repoName, 48 | issueNumber, intent.getStringExtra(Constant.ISSUE_TITLE), intent.getStringExtra(Constant.ISSUE_BODY)); 49 | fragment.setUserVisibleHint(true); 50 | getSupportFragmentManager().beginTransaction().replace(R.id.base_code_hub_container, fragment).commit(); 51 | } 52 | 53 | @Override 54 | protected int getAttachLayoutId() { 55 | return 0; 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/LoginActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Intent; 5 | import android.widget.EditText; 6 | 7 | import com.caij.codehub.CodeHubPrefs; 8 | import com.caij.codehub.R; 9 | import com.caij.codehub.bean.Token; 10 | import com.caij.codehub.present.UserLoginPresent; 11 | import com.caij.codehub.present.ui.UserLoginUi; 12 | 13 | import butterknife.Bind; 14 | import butterknife.OnClick; 15 | 16 | /** 17 | * Created by Caij on 2015/8/26. 18 | */ 19 | public class LoginActivity extends BaseCodeHubToolBarActivity implements UserLoginUi { 20 | 21 | @Bind(R.id.edit_username) 22 | EditText mEditUsername; 23 | @Bind(R.id.edit_pwd) 24 | EditText mEditPassword; 25 | private ProgressDialog mLoginDialog; 26 | private UserLoginPresent mLoginPresent; 27 | 28 | @Override 29 | protected void handleIntent(Intent intent) { 30 | getSupportActionBar().setDisplayHomeAsUpEnabled(false); 31 | setTitle(getString(R.string.action_login)); 32 | mLoginPresent = new UserLoginPresent(this); 33 | mLoginDialog = new ProgressDialog(this); 34 | mLoginDialog.setMessage(getString(R.string.logining)); 35 | mLoginDialog.setCancelable(false); 36 | mLoginDialog.setProgressStyle(R.style.AppCompatAlertDialogStyle); 37 | } 38 | 39 | @Override 40 | protected int getAttachLayoutId() { 41 | return R.layout.activity_login; 42 | } 43 | 44 | @OnClick(R.id.button_login) 45 | public void onSubmit() { 46 | mLoginPresent.login(mEditUsername.getText().toString(), mEditPassword.getText().toString()); 47 | } 48 | 49 | @Override 50 | public void onLoginSuccess(Token token) { 51 | CodeHubPrefs.get().setToken(token); 52 | CodeHubPrefs.get().setUsernameAndPwd(mEditUsername.getText().toString(), mEditPassword.getText().toString()); 53 | Intent intent = MainActivity.newIntent(this); 54 | startActivity(intent); 55 | finish(); 56 | } 57 | 58 | 59 | @Override 60 | public void showProgressBarLoading(boolean isVisible) { 61 | if (isVisible) { 62 | mLoginDialog.show(); 63 | }else { 64 | mLoginDialog.dismiss(); 65 | } 66 | } 67 | 68 | 69 | 70 | @Override 71 | protected void onDestroy() { 72 | mLoginDialog = null; 73 | mLoginPresent.onDeath(); 74 | super.onDestroy(); 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/PictureReviewActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.v4.view.ViewCompat; 7 | import android.view.View; 8 | import android.widget.ImageView; 9 | 10 | import com.bumptech.glide.Glide; 11 | import com.bumptech.glide.load.engine.DiskCacheStrategy; 12 | import com.caij.codehub.Constant; 13 | import com.caij.codehub.R; 14 | 15 | import butterknife.Bind; 16 | import butterknife.ButterKnife; 17 | import butterknife.OnClick; 18 | 19 | /** 20 | * Created by Caij on 2015/12/4. 21 | */ 22 | public class PictureReviewActivity extends BaseCodeHubActivity{ 23 | 24 | @Bind(R.id.imageview) 25 | ImageView mImageView; 26 | 27 | public static Intent newIntent(Activity activity, String imageUrl) { 28 | Intent intent = new Intent(activity, PictureReviewActivity.class); 29 | intent.putExtra(Constant.URL, imageUrl); 30 | return intent; 31 | } 32 | 33 | @Override 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | setFullScreen(); 37 | mContentContainer.setFitsSystemWindows(false); 38 | ButterKnife.bind(this); 39 | ViewCompat.setTransitionName(mImageView, Constant.TRANSIT_PIC); 40 | String url = getIntent().getStringExtra(Constant.URL); 41 | Glide.with(PictureReviewActivity.this).load(url).diskCacheStrategy(DiskCacheStrategy.ALL).dontAnimate().into(mImageView); 42 | } 43 | 44 | @Override 45 | protected int getAttachLayoutId() { 46 | return R.layout.activity_picture; 47 | } 48 | 49 | 50 | @OnClick(R.id.imageview) 51 | public void imageViewOnclick(View view) { 52 | onBackPressed(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/RepoIssuesActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | 6 | import com.caij.codehub.Constant; 7 | import com.caij.codehub.R; 8 | import com.caij.codehub.ui.fragment.RepoIssuesFragment; 9 | 10 | /** 11 | * Created by Caij on 2015/11/3. 12 | */ 13 | public class RepoIssuesActivity extends BaseCodeHubToolBarActivity { 14 | 15 | public static Intent newIntent(Activity activity, String owner, String repo) { 16 | Intent intent = new Intent(activity, RepoIssuesActivity.class); 17 | intent.putExtra(Constant.USER_NAME, owner); 18 | intent.putExtra(Constant.REPO_NAME, repo); 19 | return intent; 20 | } 21 | 22 | @Override 23 | protected int getAttachLayoutId() { 24 | return 0; 25 | } 26 | 27 | @Override 28 | protected void handleIntent(Intent intent) { 29 | setTitle(getString(R.string.issue)); 30 | String owner = getIntent().getStringExtra(Constant.USER_NAME); 31 | String repo = getIntent().getStringExtra(Constant.REPO_NAME); 32 | RepoIssuesFragment fragment = RepoIssuesFragment.newInstance(owner, repo); 33 | fragment.setUserVisibleHint(true); 34 | getSupportFragmentManager().beginTransaction().replace(R.id.base_code_hub_container, fragment).commit(); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/activity/UserRepositoriesActivity.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.activity; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.v4.app.Fragment; 7 | 8 | import com.caij.codehub.Constant; 9 | import com.caij.codehub.R; 10 | import com.caij.codehub.ui.fragment.UserRepositoriesFragment; 11 | 12 | 13 | /** 14 | * Created by Caij on 2015/9/24. 15 | */ 16 | public class UserRepositoriesActivity extends BaseCodeHubToolBarActivity { 17 | 18 | 19 | public static Intent newIntent(Activity activity, String username) { 20 | Intent intent = new Intent(activity, UserRepositoriesActivity.class); 21 | intent.putExtra(Constant.USER_NAME, username); 22 | return intent; 23 | } 24 | 25 | @Override 26 | protected void handleIntent(Intent intent) { 27 | String username = intent.getStringExtra(Constant.USER_NAME); 28 | setTitle(username); 29 | Fragment fragment = UserRepositoriesFragment.newInstance(username); 30 | fragment.setUserVisibleHint(true); 31 | getSupportFragmentManager().beginTransaction().add(R.id.base_code_hub_container, fragment).commit(); 32 | } 33 | 34 | @Override 35 | protected int getAttachLayoutId() { 36 | return 0; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/adapter/AvatarOnClickListener.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.adapter; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.view.View; 6 | 7 | import com.caij.codehub.bean.User; 8 | import com.caij.codehub.ui.activity.UserInfoActivity; 9 | 10 | /** 11 | * Author: Caij 12 | * Email: worldcaij@gmail.com 13 | * Date: 2015/11/19 14 | * Description: 15 | */ 16 | public interface AvatarOnClickListener { 17 | 18 | public void onAvatarClick(View view, int position); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/adapter/FileTreeAdapter.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.TextView; 8 | 9 | import com.caij.codehub.R; 10 | import com.caij.codehub.bean.FileTreeItem; 11 | import com.caij.codehub.widgets.recyclerview.RecyclerViewOnItemClickListener; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | * Created by Caij on 2015/11/2. 17 | */ 18 | public class FileTreeAdapter extends BaseAdapter{ 19 | 20 | public FileTreeAdapter(Context context) { 21 | this(context, null); 22 | } 23 | 24 | public FileTreeAdapter(Context context, List entities) { 25 | super(context, entities); 26 | } 27 | 28 | public void onBindViewHolderReal(FileItemViewHolder holder, int position) { 29 | FileTreeItem treeItem = getItem(position); 30 | holder.treeItemName.setText(treeItem.getPath()); 31 | if(treeItem.getType().equals(FileTreeItem.MODE_BLOB)){ 32 | holder.treeItemImg.setText(context.getString(R.string.icon_readme)); 33 | }else{ 34 | holder.treeItemImg.setText(context.getString(R.string.icon_owner)); 35 | } 36 | } 37 | 38 | @Override 39 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 40 | View convertView = mInflater.inflate(R.layout.item_treelist, parent, false); 41 | FileItemViewHolder viewHolder = new FileItemViewHolder(convertView, mOnItemClickListener); 42 | return viewHolder; 43 | } 44 | 45 | @Override 46 | public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 47 | onBindViewHolderReal((FileItemViewHolder) holder, position); 48 | } 49 | 50 | public static class FileItemViewHolder extends ViewHolder{ 51 | 52 | public TextView treeItemImg; 53 | public TextView treeItemName; 54 | 55 | public FileItemViewHolder(View itemView, RecyclerViewOnItemClickListener onItemClickListener) { 56 | super(itemView, onItemClickListener); 57 | treeItemImg = (TextView) itemView.findViewById(R.id.treeItemImg); 58 | treeItemName = (TextView) itemView.findViewById(R.id.treeItemName); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/adapter/IAdapter.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.adapter; 2 | 3 | import com.caij.codehub.bean.Entity; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by Caij on 2015/9/23. 9 | */ 10 | public interface IAdapter { 11 | public void addEntity(E entity); 12 | public void removeEntity(E entiry); 13 | public void removeEntities(List entities); 14 | public void addEntities(List entities); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/adapter/UserAdapter.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ImageView; 8 | import android.widget.TextView; 9 | 10 | import com.bumptech.glide.Glide; 11 | import com.bumptech.glide.load.engine.DiskCacheStrategy; 12 | import com.caij.codehub.R; 13 | import com.caij.codehub.bean.User; 14 | import com.caij.codehub.utils.AvatarUrlUtil; 15 | import com.caij.codehub.utils.CropCircleTransformation; 16 | import com.caij.codehub.widgets.recyclerview.RecyclerViewOnItemClickListener; 17 | 18 | import java.util.List; 19 | 20 | import butterknife.Bind; 21 | import butterknife.ButterKnife; 22 | 23 | /** 24 | * Created by Caij on 2015/9/24. 25 | */ 26 | public class UserAdapter extends BaseAdapter { 27 | 28 | private final CropCircleTransformation cropCircleTransformation; 29 | 30 | public UserAdapter(Context context) { 31 | this(context, null); 32 | } 33 | 34 | public UserAdapter(Context context, List entities) { 35 | super(context, entities); 36 | cropCircleTransformation = new CropCircleTransformation(context); 37 | } 38 | 39 | public void onBindViewHolderReal(UserViewHolder holder, int i) { 40 | User user = getItem(i); 41 | holder.tvUserName.setText(user.getLogin()); 42 | Glide.with(context).load(AvatarUrlUtil.restoreAvatarUrl(user.getAvatar_url())).placeholder(R.drawable.ic_default_circle_head_image).diskCacheStrategy(DiskCacheStrategy.ALL). 43 | bitmapTransform(cropCircleTransformation).into(holder.imgUserAvatar); 44 | } 45 | 46 | @Override 47 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 48 | View view = mInflater.inflate(R.layout.item_user, parent, false); 49 | UserViewHolder holder= new UserViewHolder(view, mOnItemClickListener); 50 | return holder; 51 | } 52 | 53 | @Override 54 | public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 55 | onBindViewHolderReal((UserViewHolder) holder, position); 56 | } 57 | 58 | public static class UserViewHolder extends ViewHolder{ 59 | 60 | @Bind(R.id.img_user_avatar) 61 | ImageView imgUserAvatar; 62 | @Bind(R.id.tv_user_name) 63 | TextView tvUserName; 64 | 65 | public UserViewHolder(View itemView, RecyclerViewOnItemClickListener onItemClickListener) { 66 | super(itemView, onItemClickListener); 67 | ButterKnife.bind(this, itemView); 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/fragment/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.fragment; 2 | 3 | 4 | import android.support.v4.app.Fragment; 5 | 6 | 7 | /** 8 | * Created by Administrator on 2015/8/24. 9 | */ 10 | public class BaseFragment extends Fragment{ 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/fragment/FollowersFragment.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.View; 6 | 7 | import com.caij.codehub.CodeHubPrefs; 8 | import com.caij.codehub.Constant; 9 | import com.caij.codehub.present.LoadType; 10 | import com.caij.codehub.present.UsersPresent; 11 | 12 | /** 13 | * Author Caij 14 | * Email worldcaij@gmail.com 15 | * Created by Caij on 2015/11/18. 16 | */ 17 | public class FollowersFragment extends UsersFragment{ 18 | 19 | 20 | private String mUsername; 21 | private String mToken; 22 | private UsersPresent mUsersPresent; 23 | 24 | public static FollowersFragment newInstance(String username) { 25 | FollowersFragment followersFragment = new FollowersFragment(); 26 | Bundle bundle = new Bundle(); 27 | bundle.putString(Constant.USER_NAME, username); 28 | followersFragment.setArguments(bundle); 29 | return followersFragment; 30 | } 31 | 32 | @Override 33 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 34 | super.onViewCreated(view, savedInstanceState); 35 | mUsername = getArguments().getString(Constant.USER_NAME); 36 | mToken = CodeHubPrefs.get().getToken(); 37 | mUsersPresent = new UsersPresent(this); 38 | } 39 | 40 | @Override 41 | protected void onUserFirstVisible() { 42 | mUsersPresent.getFollowers(LoadType.FIRST, mToken, mUsername, mPage); 43 | } 44 | 45 | @Override 46 | public void onLoadMore() { 47 | mUsersPresent.getFollowers(LoadType.LOADMORE, mToken, mUsername, mPage); 48 | } 49 | 50 | @Override 51 | public void onRefresh() { 52 | mUsersPresent.getFollowers(LoadType.REFRESH, mToken, mUsername, mPage.createRefreshPage()); 53 | } 54 | 55 | @Override 56 | public void onReFreshBtnClick(View view) { 57 | super.onReFreshBtnClick(view); 58 | mUsersPresent.getFollowers(LoadType.FIRST, mToken, mUsername, mPage); 59 | } 60 | 61 | @Override 62 | public void onDestroyView() { 63 | mUsersPresent.onDeath(); 64 | super.onDestroyView(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/fragment/FollowingsFragment.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.View; 6 | 7 | import com.caij.codehub.CodeHubPrefs; 8 | import com.caij.codehub.Constant; 9 | import com.caij.codehub.present.LoadType; 10 | import com.caij.codehub.present.UsersPresent; 11 | 12 | /** 13 | * Author Caij 14 | * Email worldcaij@gmail.com 15 | * Created by Caij on 2015/11/18. 16 | */ 17 | public class FollowingsFragment extends UsersFragment{ 18 | 19 | private String mUsername; 20 | private String mToken; 21 | private UsersPresent mUsersPresent; 22 | 23 | public static FollowingsFragment newInstance(String username) { 24 | FollowingsFragment followingsFragment = new FollowingsFragment(); 25 | Bundle bundle = new Bundle(); 26 | bundle.putString(Constant.USER_NAME, username); 27 | followingsFragment.setArguments(bundle); 28 | return followingsFragment; 29 | } 30 | 31 | @Override 32 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 33 | super.onViewCreated(view, savedInstanceState); 34 | mUsername = getArguments().getString(Constant.USER_NAME); 35 | mToken = CodeHubPrefs.get().getToken(); 36 | mUsersPresent = new UsersPresent(this); 37 | } 38 | 39 | @Override 40 | protected void onUserFirstVisible() { 41 | mUsersPresent.getFollowing(LoadType.FIRST, mToken, mUsername, mPage); 42 | } 43 | 44 | @Override 45 | public void onLoadMore() { 46 | mUsersPresent.getFollowing(LoadType.LOADMORE, mToken, mUsername, mPage); 47 | } 48 | 49 | @Override 50 | public void onRefresh() { 51 | mUsersPresent.getFollowing(LoadType.REFRESH, mToken, mUsername, mPage.createRefreshPage()); 52 | } 53 | 54 | @Override 55 | public void onReFreshBtnClick(View view) { 56 | super.onReFreshBtnClick(view); 57 | mUsersPresent.getFollowing(LoadType.FIRST, mToken, mUsername, mPage); 58 | } 59 | 60 | @Override 61 | public void onDestroyView() { 62 | mUsersPresent.onDeath(); 63 | super.onDestroyView(); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/fragment/LazyFragment.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | 6 | /** 7 | * Created by Caij on 2015/9/18. 8 | */ 9 | public abstract class LazyFragment extends BaseCodeHubFragment{ 10 | 11 | private boolean isFirstVisible = true; 12 | private boolean isPrepared = false; 13 | 14 | @Override 15 | public void onActivityCreated(@Nullable Bundle savedInstanceState) { 16 | super.onActivityCreated(savedInstanceState); 17 | initPrepare(); 18 | } 19 | 20 | @Override 21 | public void setUserVisibleHint(boolean isVisibleToUser) { 22 | super.setUserVisibleHint(isVisibleToUser); 23 | if (isVisibleToUser) { 24 | if (isFirstVisible) { 25 | isFirstVisible = false; 26 | initPrepare(); 27 | } 28 | } 29 | } 30 | 31 | private synchronized void initPrepare() { 32 | if (isPrepared) { 33 | onUserFirstVisible(); 34 | } else { 35 | isPrepared = true; 36 | } 37 | } 38 | 39 | protected abstract void onUserFirstVisible(); 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/fragment/SwipeRefreshRecyclerViewFragment.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v4.widget.SwipeRefreshLayout; 7 | import android.view.View; 8 | import android.view.ViewParent; 9 | import android.widget.FrameLayout; 10 | 11 | import com.caij.codehub.R; 12 | import com.caij.codehub.bean.Entity; 13 | import com.caij.codehub.present.ui.ListUi; 14 | import com.caij.codehub.present.ui.SwipeRefreshUi; 15 | 16 | import java.util.List; 17 | 18 | import butterknife.Bind; 19 | 20 | /** 21 | * Created by Caij on 2015/11/4. 22 | */ 23 | public abstract class SwipeRefreshRecyclerViewFragment extends RecyclerViewFragment implements SwipeRefreshUi, ListUi, SwipeRefreshLayout.OnRefreshListener { 24 | 25 | @Bind(R.id.swipe_refresh_layout) 26 | SwipeRefreshLayout mSwipeRefreshLayout; 27 | 28 | @Override 29 | protected int getAttachLayoutId() { 30 | return R.layout.include_refresh_recycle_view; 31 | } 32 | 33 | @Override 34 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 35 | super.onViewCreated(view, savedInstanceState); 36 | mSwipeRefreshLayout.setOnRefreshListener(this); 37 | mSwipeRefreshLayout.setColorSchemeColors( 38 | getResources().getColor(R.color.gplus_color_1), 39 | getResources().getColor(R.color.gplus_color_2), 40 | getResources().getColor(R.color.gplus_color_3), 41 | getResources().getColor(R.color.gplus_color_4)); 42 | 43 | } 44 | 45 | @Override 46 | public void onRefreshSuccess(List entities) { 47 | mSwipeRefreshLayout.setRefreshing(false); 48 | getRecyclerViewAdapter().setEntities(entities); 49 | getRecyclerViewAdapter().notifyDataSetChanged(); 50 | } 51 | 52 | @Override 53 | public void onRefreshError(int msgId) { 54 | showError(msgId); 55 | mSwipeRefreshLayout.setRefreshing(false); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/fragment/UserRepositoriesFragment.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.View; 6 | 7 | import com.caij.codehub.CodeHubPrefs; 8 | import com.caij.codehub.Constant; 9 | import com.caij.codehub.present.LoadType; 10 | import com.caij.codehub.present.RepositoriesPresent; 11 | import com.caij.lib.utils.CheckValueUtil; 12 | 13 | /** 14 | * Created by Caij on 2015/9/21. 15 | */ 16 | public class UserRepositoriesFragment extends RepositoriesFragment { 17 | 18 | protected String mUsername; 19 | protected String mToken; 20 | private RepositoriesPresent mRepositoriesPresent; 21 | 22 | public static RepositoriesFragment newInstance(String username) { 23 | CheckValueUtil.check(username); 24 | Bundle bundle = new Bundle(); 25 | bundle.putString(Constant.USER_NAME, username); 26 | RepositoriesFragment fragment = new UserRepositoriesFragment(); 27 | fragment.setArguments(bundle); 28 | return fragment; 29 | } 30 | 31 | @Override 32 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 33 | super.onViewCreated(view, savedInstanceState); 34 | mUsername = getArguments().getString(Constant.USER_NAME); 35 | mToken = CodeHubPrefs.get().getToken(); 36 | mRepositoriesPresent = new RepositoriesPresent(this); 37 | } 38 | 39 | @Override 40 | protected void onUserFirstVisible() { 41 | mRepositoriesPresent.getUserRepositories(LoadType.FIRST, mUsername, mToken, mPage); 42 | } 43 | 44 | @Override 45 | public void onRefresh() { 46 | mRepositoriesPresent.getUserRepositories(LoadType.REFRESH, mUsername, mToken, mPage.createRefreshPage()); 47 | } 48 | 49 | @Override 50 | public void onReFreshBtnClick(View view) { 51 | super.onReFreshBtnClick(view); 52 | mRepositoriesPresent.getUserRepositories(LoadType.FIRST, mUsername, mToken, mPage); 53 | } 54 | 55 | @Override 56 | public void onLoadMore() { 57 | mRepositoriesPresent.getUserRepositories(LoadType.LOADMORE, mUsername, mToken, mPage); 58 | } 59 | 60 | @Override 61 | public void onDestroyView() { 62 | mRepositoriesPresent.onDeath(); 63 | super.onDestroyView(); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/ui/fragment/UserStarredRepositoriesFragment.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.ui.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.View; 6 | 7 | import com.caij.codehub.CodeHubPrefs; 8 | import com.caij.codehub.Constant; 9 | import com.caij.codehub.present.LoadType; 10 | import com.caij.codehub.present.RepositoriesPresent; 11 | import com.caij.lib.utils.CheckValueUtil; 12 | 13 | 14 | /** 15 | * Created by Caij on 2015/9/21. 16 | */ 17 | public class UserStarredRepositoriesFragment extends RepositoriesFragment { 18 | 19 | protected String mUsername; 20 | protected String mToken; 21 | private RepositoriesPresent mRepositoriesPresent; 22 | 23 | public static RepositoriesFragment newInstance(String username) { 24 | CheckValueUtil.check(username); 25 | Bundle bundle = new Bundle(); 26 | bundle.putString(Constant.USER_NAME, username); 27 | RepositoriesFragment fragment = new UserStarredRepositoriesFragment(); 28 | fragment.setArguments(bundle); 29 | return fragment; 30 | } 31 | 32 | 33 | @Override 34 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 35 | super.onViewCreated(view, savedInstanceState); 36 | mUsername = getArguments().getString(Constant.USER_NAME); 37 | mToken = CodeHubPrefs.get().getToken(); 38 | mRepositoriesPresent = new RepositoriesPresent(this); 39 | } 40 | 41 | @Override 42 | protected void onUserFirstVisible() { 43 | mRepositoriesPresent.getUserStarredRepositories(LoadType.FIRST, mUsername, mToken, mPage); 44 | } 45 | 46 | @Override 47 | public void onRefresh() { 48 | mRepositoriesPresent.getUserStarredRepositories(LoadType.REFRESH, mUsername, mToken, mPage.createRefreshPage()); 49 | } 50 | 51 | @Override 52 | public void onReFreshBtnClick(View view) { 53 | super.onReFreshBtnClick(view); 54 | mRepositoriesPresent.getUserStarredRepositories(LoadType.FIRST, mUsername, mToken, mPage); 55 | } 56 | 57 | @Override 58 | public void onLoadMore() { 59 | mRepositoriesPresent.getUserStarredRepositories(LoadType.LOADMORE, mUsername, mToken, mPage); 60 | } 61 | 62 | @Override 63 | public void onDestroyView() { 64 | mRepositoriesPresent.onDeath(); 65 | super.onDestroyView(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/utils/AvatarUrlUtil.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.utils; 2 | 3 | import java.net.MalformedURLException; 4 | import java.net.URL; 5 | 6 | /** 7 | * Created by Caij on 2015/12/4. 8 | * https://avatars.githubusercontent.com/u/10348598?v=3 same as https://avatars.githubusercontent.com/u/10348598 9 | * lead to Glide load image twice 10 | */ 11 | public class AvatarUrlUtil { 12 | 13 | public static String restoreAvatarUrl(String stringUrl) { 14 | try { 15 | StringBuilder sb = new StringBuilder(); 16 | URL url = new URL(stringUrl); 17 | sb.append(url.getProtocol()).append("://").append(url.getHost()).append(url.getPath()); 18 | return sb.toString(); 19 | } catch (MalformedURLException e) { 20 | return stringUrl; 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/utils/DensityUtil.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.utils; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Author: Caij 7 | * Email: worldcaij@gmail.com 8 | * Date: 2015/11/21 9 | * Description: 10 | */ 11 | public class DensityUtil { 12 | 13 | 14 | public static int dip2px(Context context, float dpValue) { 15 | final float scale = context.getResources().getDisplayMetrics().density; 16 | return (int) (dpValue * scale + 0.5f); 17 | } 18 | 19 | public static int px2dip(Context context, float pxValue) { 20 | final float scale = context.getResources().getDisplayMetrics().density; 21 | return (int) (pxValue / scale + 0.5f); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/utils/MyGlideModule.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.utils; 2 | 3 | import android.content.Context; 4 | 5 | import com.bumptech.glide.Glide; 6 | import com.bumptech.glide.GlideBuilder; 7 | import com.bumptech.glide.integration.okhttp.OkHttpUrlLoader; 8 | import com.bumptech.glide.load.model.GlideUrl; 9 | import com.bumptech.glide.module.GlideModule; 10 | import com.bumptech.glide.request.target.ViewTarget; 11 | import com.caij.codehub.R; 12 | 13 | import java.io.InputStream; 14 | 15 | 16 | /** 17 | * Created by Caij on 15/8/14. 18 | */ 19 | public class MyGlideModule implements GlideModule { 20 | 21 | @Override 22 | public void applyOptions(Context context, GlideBuilder builder) { 23 | ViewTarget.setTagId(R.id.glide_view_tag_id); 24 | } 25 | 26 | @Override 27 | public void registerComponents(Context context, Glide glide) { 28 | glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(OkHttpClientProvider.getOkHttpClient())); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/utils/OkHttpClientProvider.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.utils; 2 | 3 | import com.caij.lib.utils.LogUtil; 4 | import com.squareup.okhttp.Interceptor; 5 | import com.squareup.okhttp.OkHttpClient; 6 | 7 | /** 8 | * Created by Caij on 2015/10/30. 9 | */ 10 | public class OkHttpClientProvider { 11 | 12 | private static final String TAG = "OkHttpClientProvider"; 13 | 14 | private static OkHttpClient mOkHttpClient; 15 | 16 | public static OkHttpClient getOkHttpClient() { 17 | if (mOkHttpClient == null) { 18 | mOkHttpClient = new OkHttpClient(); 19 | try { 20 | // only debug use 21 | Class c = Class.forName("com.facebook.stetho.okhttp.StethoInterceptor"); 22 | mOkHttpClient.networkInterceptors().add((Interceptor) c.newInstance()); 23 | } catch (Exception e) { 24 | LogUtil.e(TAG, "com.facebook.stetho.okhttp.StethoInterceptor not found"); 25 | } 26 | } 27 | return mOkHttpClient; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/utils/TextTypeFaceUtils.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.utils; 2 | 3 | import android.content.Context; 4 | import android.graphics.Typeface; 5 | 6 | /** 7 | * Created by Caij on 2015/9/19. 8 | */ 9 | public class TextTypeFaceUtils { 10 | 11 | private static Typeface mTypeface; 12 | 13 | public static Typeface getGithubTypeFace(Context context) { 14 | if (mTypeface == null) { 15 | mTypeface = Typeface.createFromAsset(context.getAssets(), "octicons.ttf"); 16 | } 17 | return mTypeface; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/utils/TimeUtils.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.utils; 2 | 3 | import android.text.format.DateUtils; 4 | 5 | import java.text.SimpleDateFormat; 6 | import java.util.Date; 7 | 8 | import static android.text.format.DateUtils.FORMAT_NUMERIC_DATE; 9 | import static android.text.format.DateUtils.FORMAT_SHOW_DATE; 10 | import static android.text.format.DateUtils.FORMAT_SHOW_YEAR; 11 | import static android.text.format.DateUtils.MINUTE_IN_MILLIS; 12 | 13 | /** 14 | * Utilities for dealing with dates and times 15 | */ 16 | public class TimeUtils { 17 | 18 | public final static String PATTERN = "yyyy-MM-dd"; 19 | 20 | /** 21 | * Get relative time for date 22 | * 23 | * @param date 24 | * @return relative time 25 | */ 26 | public static CharSequence getRelativeTime(final Date date) { 27 | long now = System.currentTimeMillis(); 28 | if (Math.abs(now - date.getTime()) > 60000) 29 | return DateUtils.getRelativeTimeSpanString(date.getTime(), now, 30 | MINUTE_IN_MILLIS, FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR 31 | | FORMAT_NUMERIC_DATE); 32 | else 33 | return "just now"; 34 | } 35 | 36 | /** 37 | * Get relative time for date 38 | * 39 | * @param date 40 | */ 41 | public static CharSequence getStringTime(final Date date) { 42 | SimpleDateFormat dateFormat = new SimpleDateFormat(PATTERN); 43 | return dateFormat.format(date); 44 | } 45 | } 46 | 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/CollapsingToolbarLayout.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.widgets; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.ViewCompat; 5 | import android.support.v4.view.WindowInsetsCompat; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | 9 | /** 10 | * Created by Caij on 2015/12/9. 11 | */ 12 | public class CollapsingToolbarLayout extends android.support.design.widget.CollapsingToolbarLayout{ 13 | 14 | public CollapsingToolbarLayout(Context context) { 15 | super(context); 16 | } 17 | 18 | public CollapsingToolbarLayout(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | } 21 | 22 | public CollapsingToolbarLayout(Context context, AttributeSet attrs, int defStyleAttr) { 23 | super(context, attrs, defStyleAttr); 24 | 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/FloatingActionButton.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.widgets; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.Nullable; 5 | import android.util.AttributeSet; 6 | 7 | /** 8 | * Created by Caij on 2015/12/8. 9 | */ 10 | public class FloatingActionButton extends android.support.design.widget.FloatingActionButton{ 11 | public FloatingActionButton(Context context) { 12 | super(context); 13 | } 14 | 15 | public FloatingActionButton(Context context, AttributeSet attrs) { 16 | super(context, attrs); 17 | } 18 | 19 | public FloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) { 20 | super(context, attrs, defStyleAttr); 21 | } 22 | 23 | @Override 24 | public void hide() { 25 | 26 | } 27 | 28 | @Override 29 | public void hide(@Nullable OnVisibilityChangedListener listener) { 30 | 31 | } 32 | 33 | @Override 34 | public void show() { 35 | } 36 | 37 | @Override 38 | public void show(@Nullable OnVisibilityChangedListener listener) { 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/GithubTypeFaceTextView.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.widgets; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.TextView; 6 | 7 | import com.caij.codehub.utils.TextTypeFaceUtils; 8 | 9 | /** 10 | * Created by Caij on 2015/10/29. 11 | */ 12 | public class GithubTypeFaceTextView extends TextView{ 13 | public GithubTypeFaceTextView(Context context) { 14 | super(context); 15 | initTypeFace(context); 16 | } 17 | 18 | public GithubTypeFaceTextView(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | initTypeFace(context); 21 | } 22 | 23 | public GithubTypeFaceTextView(Context context, AttributeSet attrs, int defStyleAttr) { 24 | super(context, attrs, defStyleAttr); 25 | initTypeFace(context); 26 | } 27 | 28 | private void initTypeFace(Context context) { 29 | setTypeface(TextTypeFaceUtils.getGithubTypeFace(context)); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/recyclerview/RecyclerViewOnItemClickListener.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.widgets.recyclerview; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * Created by Caij on 2015/11/5. 7 | */ 8 | public interface RecyclerViewOnItemClickListener { 9 | 10 | public void onItemClick(View view, int position); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/swipeback/app/SwipeBackActivity.java: -------------------------------------------------------------------------------- 1 | 2 | package com.caij.codehub.widgets.swipeback.app; 3 | 4 | import android.os.Bundle; 5 | import android.view.View; 6 | 7 | import com.caij.codehub.R; 8 | import com.caij.codehub.ui.activity.BaseActivity; 9 | import com.caij.codehub.widgets.swipeback.SwipeBackLayout; 10 | import com.caij.codehub.widgets.swipeback.Utils; 11 | 12 | public abstract class SwipeBackActivity extends BaseActivity implements SwipeBackActivityBase { 13 | private SwipeBackActivityHelper mHelper; 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | if (isSwipeBackEnable()) { 18 | overridePendingTransition(R.anim.start_right_in, R.anim.start_right_out); 19 | mHelper = new SwipeBackActivityHelper(this); 20 | mHelper.onActivityCreate(); 21 | } 22 | super.onCreate(savedInstanceState); 23 | } 24 | 25 | protected abstract boolean isSwipeBackEnable(); 26 | 27 | @Override 28 | protected void onPostCreate(Bundle savedInstanceState) { 29 | super.onPostCreate(savedInstanceState); 30 | if (isSwipeBackEnable() && mHelper != null) { 31 | mHelper.onPostCreate(); 32 | } 33 | } 34 | 35 | @Override 36 | public void finish() { 37 | super.finish(); 38 | if (isSwipeBackEnable()) { 39 | overridePendingTransition(R.anim.finish_right_in, R.anim.finish_right_out); 40 | } 41 | } 42 | 43 | @Override 44 | public View findViewById(int id) { 45 | View v = super.findViewById(id); 46 | if (v == null && mHelper != null) 47 | return mHelper.findViewById(id); 48 | return v; 49 | } 50 | 51 | @Override 52 | public SwipeBackLayout getSwipeBackLayout() { 53 | if (mHelper != null) { 54 | return mHelper.getSwipeBackLayout(); 55 | } 56 | return null; 57 | } 58 | 59 | @Override 60 | public void setSwipeBackEnable(boolean enable) { 61 | if (getSwipeBackLayout() != null) { 62 | getSwipeBackLayout().setEnableGesture(enable); 63 | } 64 | } 65 | 66 | @Override 67 | public void scrollToFinishActivity() { 68 | if (getSwipeBackLayout() != null) { 69 | Utils.convertActivityToTranslucent(this); 70 | getSwipeBackLayout().scrollToFinishActivity(); 71 | } 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/swipeback/app/SwipeBackActivityBase.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.widgets.swipeback.app; 2 | 3 | import com.caij.codehub.widgets.swipeback.SwipeBackLayout; 4 | 5 | /** 6 | * @author Yrom 7 | */ 8 | public interface SwipeBackActivityBase { 9 | /** 10 | * @return the SwipeBackLayout associated with this activity. 11 | */ 12 | public abstract SwipeBackLayout getSwipeBackLayout(); 13 | 14 | public abstract void setSwipeBackEnable(boolean enable); 15 | 16 | /** 17 | * Scroll out contentView and finish the activity 18 | */ 19 | public abstract void scrollToFinishActivity(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/swipeback/app/SwipeBackActivityHelper.java: -------------------------------------------------------------------------------- 1 | package com.caij.codehub.widgets.swipeback.app; 2 | 3 | import android.app.Activity; 4 | import android.graphics.Color; 5 | import android.graphics.drawable.ColorDrawable; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | 9 | import com.caij.codehub.R; 10 | import com.caij.codehub.widgets.swipeback.SwipeBackLayout; 11 | import com.caij.codehub.widgets.swipeback.Utils; 12 | 13 | /** 14 | * @author Yrom 15 | */ 16 | public class SwipeBackActivityHelper { 17 | private Activity mActivity; 18 | 19 | private SwipeBackLayout mSwipeBackLayout; 20 | 21 | public SwipeBackActivityHelper(Activity activity) { 22 | mActivity = activity; 23 | } 24 | 25 | @SuppressWarnings("deprecation") 26 | public void onActivityCreate() { 27 | mActivity.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 28 | mActivity.getWindow().getDecorView().setBackgroundDrawable(null); 29 | mSwipeBackLayout = (SwipeBackLayout) LayoutInflater.from(mActivity).inflate( 30 | R.layout.widget_swipeback_layout, null); 31 | mSwipeBackLayout.addSwipeListener(new SwipeBackLayout.SwipeListener() { 32 | @Override 33 | public void onScrollStateChange(int state, float scrollPercent) { 34 | } 35 | 36 | @Override 37 | public void onEdgeTouch(int edgeFlag) { 38 | Utils.convertActivityToTranslucent(mActivity); 39 | } 40 | 41 | @Override 42 | public void onScrollOverThreshold() { 43 | 44 | } 45 | }); 46 | } 47 | 48 | public void onPostCreate() { 49 | mSwipeBackLayout.attachToActivity(mActivity); 50 | } 51 | 52 | public View findViewById(int id) { 53 | if (mSwipeBackLayout != null) { 54 | return mSwipeBackLayout.findViewById(id); 55 | } 56 | return null; 57 | } 58 | 59 | public SwipeBackLayout getSwipeBackLayout() { 60 | return mSwipeBackLayout; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/caij/codehub/widgets/swipeback/app/SwipeBackPreferenceActivity.java: -------------------------------------------------------------------------------- 1 | 2 | package com.caij.codehub.widgets.swipeback.app; 3 | 4 | import android.os.Bundle; 5 | import android.preference.PreferenceActivity; 6 | import android.view.View; 7 | 8 | import com.caij.codehub.widgets.swipeback.SwipeBackLayout; 9 | 10 | public class SwipeBackPreferenceActivity extends PreferenceActivity implements SwipeBackActivityBase { 11 | private SwipeBackActivityHelper mHelper; 12 | 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | mHelper = new SwipeBackActivityHelper(this); 17 | mHelper.onActivityCreate(); 18 | } 19 | 20 | @Override 21 | protected void onPostCreate(Bundle savedInstanceState) { 22 | super.onPostCreate(savedInstanceState); 23 | mHelper.onPostCreate(); 24 | } 25 | 26 | @Override 27 | public View findViewById(int id) { 28 | View v = super.findViewById(id); 29 | if (v == null && mHelper != null) 30 | return mHelper.findViewById(id); 31 | return v; 32 | } 33 | 34 | @Override 35 | public SwipeBackLayout getSwipeBackLayout() { 36 | return mHelper.getSwipeBackLayout(); 37 | } 38 | @Override 39 | public void setSwipeBackEnable(boolean enable) { 40 | getSwipeBackLayout().setEnableGesture(enable); 41 | } 42 | 43 | @Override 44 | public void scrollToFinishActivity() { 45 | getSwipeBackLayout().scrollToFinishActivity(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/res/anim/finish_right_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/anim/finish_right_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/anim/start_right_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/anim/start_right_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-hdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-hdpi/ic_right_arrow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-mdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-mdpi/ic_right_arrow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xhdpi/ic_right_arrow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/bg_init_page_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/bg_init_page_img.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/bg_shadow_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/bg_shadow_bottom.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/bg_shadow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/bg_shadow_left.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/bg_shadow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/bg_shadow_right.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/gif_loading1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/gif_loading1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/gif_loading2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/gif_loading2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/gif_loading3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/gif_loading3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/gif_loading4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/gif_loading4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/gif_loading5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/gif_loading5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/gif_loading6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/gif_loading6.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/gif_loading7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/gif_loading7.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/ic_action_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_default_circle_head_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/ic_default_circle_head_image.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/ic_right_arrow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/source_data_load_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/source_data_load_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/source_no_data_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Caij/CodeHub/20d0f667eb4ef0ccfd0bbbb361a815e744e87bef/app/src/main/res/drawable-xxhdpi/source_no_data_image.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/animation_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fab_normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fab_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fab_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/link_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nav_item_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/theme_color_btn_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_base_codehub.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 14 | 15 | 21 | 22 | 28 | 29 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_base_codehub_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 18 | 19 | 20 | 21 | 27 | 28 | 34 | 35 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_comment.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 |