├── .gitignore ├── CoreModule ├── .gitignore ├── adapter │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── core │ │ ├── adapter │ │ ├── BaseListAdapter.java │ │ └── ListHolder.java │ │ └── widget │ │ └── FooterView.java ├── api │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── api │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── api │ │ │ │ └── Api.java │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── api │ │ └── ExampleUnitTest.java ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── oslab │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── oslab │ │ │ │ ├── base │ │ │ │ ├── BaseDetailDelegate.java │ │ │ │ ├── BaseListFragment.java │ │ │ │ └── BasePullUpMultiTypeAdapter.java │ │ │ │ ├── inter │ │ │ │ └── IRequestVo.java │ │ │ │ ├── module │ │ │ │ ├── blog │ │ │ │ │ ├── BlogDetailActivity.java │ │ │ │ │ ├── BlogDetailDelegate.java │ │ │ │ │ ├── BlogFragment.java │ │ │ │ │ └── BlogListViewDelegate.java │ │ │ │ ├── browser │ │ │ │ │ └── MobelBrowserActivity.java │ │ │ │ ├── dress │ │ │ │ │ └── DressFragment.java │ │ │ │ └── main │ │ │ │ │ ├── Main2Activity.java │ │ │ │ │ ├── MainViewDelegate.java │ │ │ │ │ └── TestActivity.java │ │ │ │ └── utils │ │ │ │ ├── AppConfig.java │ │ │ │ ├── FileSizeUtil.java │ │ │ │ ├── KJAnimations.java │ │ │ │ ├── LinkDispatcher.java │ │ │ │ ├── SystemTool.java │ │ │ │ └── Tools.java │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ └── icon_share.png │ │ │ ├── drawable-v21 │ │ │ ├── ic_menu_camera.xml │ │ │ ├── ic_menu_gallery.xml │ │ │ ├── ic_menu_manage.xml │ │ │ ├── ic_menu_send.xml │ │ │ ├── ic_menu_share.xml │ │ │ └── ic_menu_slideshow.xml │ │ │ ├── drawable │ │ │ ├── bg_bottombar.xml │ │ │ ├── bg_search_edittext.xml │ │ │ ├── selector_bottombar_blog.xml │ │ │ ├── selector_bottombar_find.xml │ │ │ └── side_nav_bar.xml │ │ │ ├── layout │ │ │ ├── activity_demo_baseback.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_main_new.xml │ │ │ ├── delegate_detail.xml │ │ │ ├── fragment_blog.xml │ │ │ ├── item_banner.xml │ │ │ ├── item_blog_image.xml │ │ │ ├── item_blog_text.xml │ │ │ ├── item_bottombar.xml │ │ │ └── item_search.xml │ │ │ ├── menu │ │ │ └── menu_share.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── blog_item_recommend_icon.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_time.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_search.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── bottombar_blog_nor.png │ │ │ ├── bottombar_blog_over.png │ │ │ ├── bottombar_find_nor.png │ │ │ ├── bottombar_find_over.png │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── def_zone_image.jpg │ │ │ ├── ic_axis_top_line.png │ │ │ └── ic_launcher.png │ │ │ ├── values-v19 │ │ │ └── dimens.xml │ │ │ ├── values-v21 │ │ │ └── styles.xml │ │ │ ├── values-w820dp │ │ │ └── dimens.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── drawables.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── oslab │ │ └── ExampleUnitTest.java ├── base-back │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── base │ │ │ └── backactivity │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── base │ │ │ │ └── backactivity │ │ │ │ ├── BackActivityHelper.java │ │ │ │ ├── BaseBackActivity.java │ │ │ │ ├── SwipeBackLayout.java │ │ │ │ ├── Utils.java │ │ │ │ └── ViewDragHelper.java │ │ └── res │ │ │ ├── drawable │ │ │ ├── baseback_shadow_bottom.png │ │ │ ├── baseback_shadow_left.png │ │ │ └── baseback_shadow_right.png │ │ │ └── values │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── base │ │ └── backactivity │ │ └── ExampleUnitTest.java ├── base │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── base │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── base │ │ │ │ ├── activity │ │ │ │ ├── BaseActivity.java │ │ │ │ └── BaseDataBindingActivity.java │ │ │ │ ├── fragment │ │ │ │ ├── BaseDataBindingFragment.java │ │ │ │ └── BaseFragment.java │ │ │ │ ├── util │ │ │ │ └── ActivityUtils.java │ │ │ │ └── viewdelegate │ │ │ │ ├── BaseListDelegate.java │ │ │ │ └── PullListDelegate.java │ │ └── res │ │ │ ├── layout │ │ │ └── base_list_fragment.xml │ │ │ └── values │ │ │ └── colors.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── base │ │ └── ExampleUnitTest.java ├── browser │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── browser │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ └── template │ │ │ │ └── common.css │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── browser │ │ │ │ ├── BrowserActivity.java │ │ │ │ ├── BrowserDelegate.java │ │ │ │ ├── BrowserDelegateOption.java │ │ │ │ ├── BrowserFragment.java │ │ │ │ └── interf │ │ │ │ ├── ILinkDispatcher.java │ │ │ │ ├── OnWebViewImageListener.java │ │ │ │ └── WebViewCallback.java │ │ └── res │ │ │ ├── layout │ │ │ ├── browser_activity_layout.xml │ │ │ ├── browser_fragment_layout.xml │ │ │ ├── delegate_layout_browser.xml │ │ │ └── item_browser_bottombar.xml │ │ │ ├── menu │ │ │ └── browser_menu_share.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── browser_icon_delete.png │ │ │ └── browser_icon_share.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── browser │ │ └── ExampleUnitTest.java ├── build.gradle ├── crash │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── crash │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── crash │ │ │ │ ├── CustomActivityOnCrash.java │ │ │ │ └── activity │ │ │ │ └── DefaultErrorActivity.java │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ └── customactivityoncrash_error_image.png │ │ │ ├── drawable-mdpi │ │ │ └── customactivityoncrash_error_image.png │ │ │ ├── drawable-xhdpi │ │ │ └── customactivityoncrash_error_image.png │ │ │ ├── drawable-xxhdpi │ │ │ └── customactivityoncrash_error_image.png │ │ │ ├── drawable-xxxhdpi │ │ │ └── customactivityoncrash_error_image.png │ │ │ ├── layout │ │ │ └── customactivityoncrash_default_error_activity.xml │ │ │ ├── values-v14 │ │ │ └── styles.xml │ │ │ ├── values-v21 │ │ │ └── styles.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── crash │ │ └── ExampleUnitTest.java ├── empty-view │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── view │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── view │ │ │ │ └── EmptyLayout.java │ │ └── res │ │ │ ├── layout │ │ │ └── emptyview_content.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── emptyview_icon_empty.png │ │ │ ├── emptyview_icon_failed.png │ │ │ └── emptyview_icon_network.png │ │ │ └── values │ │ │ ├── color.xml │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── view │ │ └── ExampleUnitTest.java ├── gallery │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── gallery │ │ │ └── ApplicationTest.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── kymjs │ │ │ └── gallery │ │ │ ├── HackyViewPager.java │ │ │ ├── KJGalleryActivity.java │ │ │ └── SamplePagerAdapter.java │ │ └── res │ │ ├── drawable │ │ └── gallery_progressloading.xml │ │ ├── layout │ │ ├── gallery_activity_kjgallery.xml │ │ └── gallery_item_pager.xml │ │ ├── mipmap │ │ ├── gallery_default_img_rect.png │ │ └── gallery_loading.png │ │ └── values │ │ └── styles.xml ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── kotlin-common │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── kotlin │ │ │ └── common │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── kotlin │ │ │ │ └── common │ │ │ │ ├── FileUtils.kt │ │ │ │ └── extension │ │ │ │ ├── ExtensionActivity.kt │ │ │ │ ├── ExtensionContext.kt │ │ │ │ ├── ExtensionDensity.kt │ │ │ │ ├── ExtensionDialog.kt │ │ │ │ ├── ExtensionFragment.kt │ │ │ │ ├── ExtensionTextView.kt │ │ │ │ ├── ExtensionThread.kt │ │ │ │ ├── ExtensionView.kt │ │ │ │ └── ExtensionViewGroup.kt │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── kotlin │ │ └── common │ │ └── ExampleUnitTest.java ├── model │ ├── .gitignore │ ├── build.gradle │ ├── libs │ │ └── xstream-1.4.7.jar │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── model │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── model │ │ │ │ ├── Blog.java │ │ │ │ ├── BlogList.java │ │ │ │ ├── Event.java │ │ │ │ ├── XituBlog.java │ │ │ │ ├── XituBlogList.java │ │ │ │ ├── osc │ │ │ │ ├── Favorite.java │ │ │ │ ├── FavoriteList.java │ │ │ │ ├── News.java │ │ │ │ ├── NewsList.java │ │ │ │ ├── OSCBlog.java │ │ │ │ ├── OSCBlogEntity.java │ │ │ │ └── OSCBlogList.java │ │ │ │ └── utils │ │ │ │ └── XmlUtil.java │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── model │ │ └── ExampleUnitTest.java ├── recycler-databinding │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── recycler_databinding │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── recycler_databinding │ │ │ │ ├── BasePullBindingAdapter.java │ │ │ │ ├── BindingRecyclerAdapter.java │ │ │ │ └── BindingViewHolder.java │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── recycler_databinding │ │ └── ExampleUnitTest.java ├── recycler │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── recycler │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── recycler │ │ │ │ ├── Divider.java │ │ │ │ ├── OnItemClickListener.java │ │ │ │ ├── OnItemLongClickListener.java │ │ │ │ ├── RecyclerBin.java │ │ │ │ ├── RecyclerItemClickListener.java │ │ │ │ └── adapter │ │ │ │ ├── BasePullMultiTypeRecyclerAdapter.java │ │ │ │ ├── BasePullUpRecyclerAdapter.java │ │ │ │ ├── BaseRecyclerAdapter.java │ │ │ │ └── RecyclerHolder.java │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── recycler │ │ └── ExampleUnitTest.java ├── replay_pid4780.log ├── settings.gradle ├── share-sdk │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── kymjs │ │ │ └── share_sdk │ │ │ └── ApplicationTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── kymjs │ │ │ │ └── share_sdk │ │ │ │ └── ShareSDK.java │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── kymjs │ │ └── share_sdk │ │ └── ExampleUnitTest.java └── titlebar │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── kymjs │ │ └── titlebar │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── kymjs │ │ │ └── titlebar │ │ │ └── Titlebar.java │ └── res │ │ ├── layout │ │ └── titlebar_default.xml │ │ └── values │ │ ├── dimens.xml │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── kymjs │ └── titlebar │ └── ExampleUnitTest.java ├── LICENSE ├── NOTICE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | tomsuite.xml 2 | **pom.xml.releaseBackup 3 | release.properties 4 | gen 5 | */seed.txt 6 | notes 7 | logs 8 | gen-external-apklibs 9 | .idea 10 | *.iml 11 | .DS_Store 12 | *.swp 13 | out 14 | .gradle 15 | /local.properties 16 | /build 17 | 18 | ###OSX### 19 | 20 | .DS_Store 21 | .AppleDouble 22 | .LSOverride 23 | 24 | # Icon must ends with two \r. 25 | Icon 26 | 27 | 28 | # Thumbnails 29 | ._* 30 | 31 | # Files that might appear on external disk 32 | .Spotlight-V100 33 | .Trashes 34 | 35 | 36 | ###Linux### 37 | 38 | *~ 39 | 40 | # KDE directory preferences 41 | .directory 42 | 43 | 44 | ###Android### 45 | 46 | # Built application files 47 | *.apk 48 | *.ap_ 49 | 50 | # Files for ART and Dalvik VM 51 | *.dex 52 | 53 | # Java class files 54 | *.class 55 | 56 | # Generated files 57 | bin/ 58 | gen/ 59 | 60 | # Gradle files 61 | .gradle/ 62 | .gradletasknamecache 63 | build/ 64 | 65 | # Local configuration file (sdk path, etc) 66 | local.properties 67 | 68 | # Proguard folder generated by Eclipse 69 | proguard/ 70 | 71 | # Lint 72 | lint-report.html 73 | lint-report_files/ 74 | lint_result.txt 75 | 76 | # Mobile Tools for Java (J2ME) 77 | .mtj.tmp/ 78 | 79 | # Package Files # 80 | *.war 81 | *.ear 82 | 83 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 84 | hs_err_pid* 85 | 86 | 87 | ###IntelliJ### 88 | 89 | *.iml 90 | *.ipr 91 | *.iws 92 | .idea/ 93 | 94 | 95 | ###Eclipse### 96 | 97 | *.pydevproject 98 | .metadata 99 | tmp/ 100 | *.tmp 101 | *.bak 102 | *.swp 103 | *~.nib 104 | .settings/ 105 | .loadpath 106 | 107 | # External tool builders 108 | .externalToolBuilders/ 109 | 110 | # Locally stored "Eclipse launch configurations" 111 | *.launch 112 | 113 | # CDT-specific 114 | .cproject 115 | 116 | # PDT-specific 117 | .buildpath 118 | 119 | # sbteclipse plugin 120 | .target 121 | 122 | # TeXlipse plugin 123 | .texlipseXml version="1.0" encoding="UTF-8"?>captures 124 | -------------------------------------------------------------------------------- /CoreModule/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /CoreModule/adapter/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /CoreModule/adapter/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.0" 6 | 7 | defaultConfig { 8 | minSdkVersion 14 9 | targetSdkVersion 24 10 | versionCode 1 11 | versionName version 12 | resourcePrefix "adapter_" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | } 26 | 27 | 28 | apply plugin: 'com.jfrog.bintray' 29 | apply plugin: 'com.github.dcendents.android-maven' 30 | 31 | def siteUrl = REPO_URL // 项目的主页 32 | def gitUrl = REPO_GIT // Git仓库的url 33 | def module_name = ADAPTER_MODULE_NAME 34 | 35 | group = PROJECT_GROUP 36 | version = ADAPTER_MODULE_VERSION 37 | 38 | install { 39 | repositories.mavenInstaller { 40 | // This generates POM.xml with proper parameters 41 | pom { 42 | project { 43 | packaging 'aar' 44 | name PROJECT_DESCRIPTION 45 | url siteUrl 46 | // Set your license 47 | licenses { 48 | license { 49 | name LICENSE_NAME 50 | url LICENSE_URL 51 | } 52 | } 53 | developers { 54 | developer { 55 | id DEVELOPER_ID //填写的一些基本信息 56 | name DEVELOPER_NAME 57 | email DEVELOPER_EMAIL 58 | } 59 | } 60 | scm { 61 | connection gitUrl 62 | developerConnection gitUrl 63 | url siteUrl 64 | } 65 | } 66 | } 67 | } 68 | } 69 | task sourcesJar(type: Jar) { 70 | from android.sourceSets.main.java.srcDirs 71 | classifier = 'sources' 72 | } 73 | task javadoc(type: Javadoc) { 74 | source = android.sourceSets.main.java.srcDirs 75 | classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) 76 | } 77 | task javadocJar(type: Jar, dependsOn: javadoc) { 78 | classifier = 'javadoc' 79 | from javadoc.destinationDir 80 | } 81 | artifacts { 82 | archives javadocJar 83 | archives sourcesJar 84 | } 85 | Properties properties = new Properties() 86 | properties.load(project.rootProject.file('local.properties').newDataInputStream()) 87 | bintray { 88 | user = properties.getProperty("bintray.user") 89 | key = properties.getProperty("bintray.apikey") 90 | configurations = ['archives'] 91 | pkg { 92 | repo = "maven" 93 | name = module_name //发布到JCenter上的项目名字 94 | websiteUrl = siteUrl 95 | vcsUrl = gitUrl 96 | licenses = ["Apache-2.0"] 97 | publish = true 98 | } 99 | } -------------------------------------------------------------------------------- /CoreModule/adapter/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 /Users/kymjs/developer/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 | -------------------------------------------------------------------------------- /CoreModule/adapter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CoreModule/adapter/src/main/java/com/kymjs/core/adapter/ListHolder.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.core.adapter; 2 | 3 | import android.graphics.Bitmap; 4 | import android.util.SparseArray; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | 11 | /** 12 | * @author kymjs (http://www.kymjs.com/) on 11/16/15. 13 | */ 14 | public class ListHolder { 15 | private final SparseArray mViews; 16 | private final View mConvertView; 17 | 18 | private ListHolder(ViewGroup parent, int layoutId) { 19 | this.mViews = new SparseArray<>(); 20 | mConvertView = LayoutInflater.from(parent.getContext()).inflate( 21 | layoutId, parent, false); 22 | // setTag 23 | mConvertView.setTag(this); 24 | } 25 | 26 | /** 27 | * 拿到全部View 28 | * 29 | * @return 30 | */ 31 | public SparseArray getAllView() { 32 | return mViews; 33 | } 34 | 35 | /** 36 | * 拿到一个ViewHolder对象 37 | */ 38 | public static ListHolder get(View convertView, ViewGroup parent, int layoutId) { 39 | if (convertView == null) { 40 | return new ListHolder(parent, layoutId); 41 | } else { 42 | return (ListHolder) convertView.getTag(); 43 | } 44 | } 45 | 46 | public View getConvertView() { 47 | return mConvertView; 48 | } 49 | 50 | /** 51 | * 通过控件的Id获取对于的控件,如果没有则加入views 52 | * 53 | * @param viewId 54 | * @return 55 | */ 56 | @SuppressWarnings("unchecked") 57 | public T getView(int viewId) { 58 | View view = mViews.get(viewId); 59 | if (view == null) { 60 | view = mConvertView.findViewById(viewId); 61 | mViews.put(viewId, view); 62 | } 63 | return (T) view; 64 | } 65 | 66 | /** 67 | * 为TextView设置字符串 68 | * 69 | * @param viewId 70 | * @param text 71 | * @return 72 | */ 73 | public ListHolder setText(int viewId, CharSequence text) { 74 | TextView view = getView(viewId); 75 | view.setText(text); 76 | return this; 77 | } 78 | 79 | /** 80 | * 为ImageView设置图片 81 | * 82 | * @param viewId 83 | * @param drawableId 84 | * @return 85 | */ 86 | public ListHolder setImageResource(int viewId, int drawableId) { 87 | ImageView view = getView(viewId); 88 | view.setImageResource(drawableId); 89 | return this; 90 | } 91 | 92 | /** 93 | * 为ImageView设置图片 94 | * 95 | * @param viewId 96 | * @param bm 97 | * @return 98 | */ 99 | public ListHolder setImageBitmap(int viewId, Bitmap bm) { 100 | ImageView view = getView(viewId); 101 | view.setImageBitmap(bm); 102 | return this; 103 | } 104 | 105 | } 106 | -------------------------------------------------------------------------------- /CoreModule/api/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /CoreModule/api/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.0" 6 | 7 | defaultConfig { 8 | minSdkVersion 14 9 | targetSdkVersion 24 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | compile fileTree(include: ['*.jar'], dir: 'libs') 23 | testCompile 'junit:junit:4.12' 24 | } 25 | -------------------------------------------------------------------------------- /CoreModule/api/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 /Users/kymjs/developer/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 | -------------------------------------------------------------------------------- /CoreModule/api/src/androidTest/java/com/kymjs/api/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.api; 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 | } -------------------------------------------------------------------------------- /CoreModule/api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /CoreModule/api/src/main/java/com/kymjs/api/Api.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.api; 2 | 3 | /** 4 | * @author kymjs (http://www.kymjs.com/) on 12/2/15. 5 | */ 6 | public class Api { 7 | public static final String BLOG_LIST = "http://kymjs.com/rss.xml"; 8 | public static final String XITU_BLOG_LIST = "http://gold.xitu.io/rss"; 9 | public static final String ZONE_IMAGE = "http://kymjs.com/api/zone_image"; 10 | public static final String OSC_BLOG = "http://www.oschina.net/action/api/userblog_list"; 11 | public static final String OSC_BLOG_DETAIL = "http://www.oschina" + 12 | ".net/action/api/blog_detail?id="; 13 | public static final String OSC_COLLECT_BLOG = "http://www.oschina" + 14 | ".net/action/api/favorite_list?uid=2426111&type=3"; 15 | public static final String OSC_NEWS = "http://www.oschina.net/action/api/news_list?show=week"; 16 | 17 | public static final String OSC_COOKIE = "oscid=ueFRQyc8CLsm0MwbSLC22bH2Qv7BMFuG3u" + 18 | "%2BkdVWPBRRUmoAVhqctQz5fG%2Fs5JSB5JGVMZrm4jNl57z9o1biYHKHXZ2%2FG" + 19 | "%2Bi1qDPe5f6o1KJkT68PfyJ0pZA%3D%3D;\n"; 20 | 21 | public static final String OSL = "http://kymjs.com/works"; 22 | } 23 | -------------------------------------------------------------------------------- /CoreModule/api/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | API 3 | 4 | -------------------------------------------------------------------------------- /CoreModule/api/src/test/java/com/kymjs/api/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.api; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 9 | */ 10 | public class ExampleUnitTest { 11 | @Test 12 | public void addition_isCorrect() throws Exception { 13 | assertEquals(4, 2 + 2); 14 | } 15 | } -------------------------------------------------------------------------------- /CoreModule/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /CoreModule/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.0" 6 | 7 | defaultConfig { 8 | applicationId "com.kymjs.oslab" 9 | minSdkVersion 14 10 | targetSdkVersion 24 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | dataBinding { 22 | enabled = true 23 | } 24 | } 25 | 26 | dependencies { 27 | compile fileTree(dir: 'libs', include: ['*.jar']) 28 | testCompile 'junit:junit:4.12' 29 | debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' // or 1.4-beta1 30 | releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' // or 1.4-beta1 31 | 32 | compile 'com.android.support:appcompat-v7:24.0.0' 33 | compile 'com.android.support:palette-v7:24.0.0' 34 | compile 'com.android.support:design:24.0.0' 35 | compile 'com.kymjs.rxvolley:rxvolley:1.0.9' 36 | compile 'com.squareup.picasso:picasso:2.5.2' 37 | 38 | compile project(':recycler-databinding') 39 | 40 | compile project(':browser') 41 | 42 | compile project(':crash') 43 | compile project(':titlebar') 44 | compile project(':kotlin-common') 45 | compile project(':model') 46 | compile project(':api') 47 | } 48 | -------------------------------------------------------------------------------- /CoreModule/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 /Users/kymjs/developer/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 | -------------------------------------------------------------------------------- /CoreModule/app/src/androidTest/java/com/kymjs/oslab/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab; 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 | } -------------------------------------------------------------------------------- /CoreModule/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/base/BaseDetailDelegate.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.base; 2 | 3 | import android.support.design.widget.CollapsingToolbarLayout; 4 | import android.support.v4.widget.NestedScrollView; 5 | import android.support.v7.widget.Toolbar; 6 | import android.view.View; 7 | import android.view.ViewGroup.LayoutParams; 8 | 9 | import com.kymjs.oslab.R; 10 | import com.kymjs.themvp.view.AppDelegate; 11 | 12 | 13 | /** 14 | * ActionBar下拉显示图片的基类 15 | * 16 | * @author kymjs (http://www.kymjs.com/) on 12/4/15. 17 | */ 18 | public abstract class BaseDetailDelegate extends AppDelegate { 19 | @Override 20 | public int getRootLayoutId() { 21 | return R.layout.delegate_detail; 22 | } 23 | 24 | public abstract int getContentLayoutId(); 25 | 26 | @Override 27 | public void initWidget() { 28 | super.initWidget(); 29 | NestedScrollView nestedScrollView = get(R.id.nested_scrollview); 30 | LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams 31 | .MATCH_PARENT); 32 | nestedScrollView.addView(View.inflate(getActivity(), getContentLayoutId(), null), params); 33 | nestedScrollView.invalidate(); 34 | } 35 | 36 | @Override 37 | public Toolbar getToolbar() { 38 | super.getToolbar(); 39 | Toolbar toolbar = get(R.id.toolbar); 40 | CollapsingToolbarLayout collapsingToolbar = get(R.id.collapsing_toolbar); 41 | collapsingToolbar.setTitle(rootView.getResources().getString(R.string.blog_detail)); 42 | int titleColor = rootView.getResources().getColor(android.R.color.white); 43 | collapsingToolbar.setCollapsedTitleTextColor(titleColor); 44 | collapsingToolbar.setExpandedTitleColor(titleColor); 45 | return toolbar; 46 | } 47 | 48 | @Override 49 | public int getOptionsMenuId() { 50 | return R.menu.menu_share; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/base/BasePullUpMultiTypeAdapter.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.base; 2 | 3 | import android.support.v7.widget.RecyclerView; 4 | import android.view.ViewGroup; 5 | 6 | import com.kymjs.recycler.adapter.BasePullUpRecyclerAdapter; 7 | import com.kymjs.recycler.adapter.RecyclerHolder; 8 | 9 | import java.util.Collection; 10 | 11 | /** 12 | * Created by ZhangTao on 9/4/16. 13 | */ 14 | public abstract class BasePullUpMultiTypeAdapter extends BasePullUpRecyclerAdapter { 15 | public BasePullUpMultiTypeAdapter(RecyclerView v, Collection datas) { 16 | super(v, datas, 0); 17 | } 18 | 19 | public abstract int getItemTypeForPosition(int position); 20 | 21 | public abstract RecyclerHolder onCreateViewHolderForType(ViewGroup parent, int viewType); 22 | 23 | 24 | @Override 25 | public int getItemViewType(int position) { 26 | if (position == getItemCount() - 1) { 27 | return TYPE_FOOTER; 28 | } else { 29 | return getItemTypeForPosition(position); 30 | } 31 | } 32 | 33 | @Override 34 | public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) { 35 | if (viewType == TYPE_FOOTER) { 36 | return super.onCreateViewHolder(parent, viewType); 37 | } else { 38 | return onCreateViewHolderForType(parent, viewType); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/inter/IRequestVo.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.inter; 2 | 3 | /** 4 | * 网络请求 5 | * 6 | * @author kymjs (http://www.kymjs.com/) on 12/3/15. 7 | */ 8 | public interface IRequestVo { 9 | void doRequest(); 10 | } 11 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/module/blog/BlogListViewDelegate.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.module.blog; 2 | 3 | import com.kymjs.base.viewdelegate.BaseListDelegate; 4 | import com.kymjs.base.viewdelegate.PullListDelegate; 5 | import com.kymjs.oslab.R; 6 | 7 | /** 8 | * Created by ZhangTao on 9/4/16. 9 | */ 10 | public class BlogListViewDelegate extends PullListDelegate { 11 | 12 | @Override 13 | public int getRootLayoutId() { 14 | return R.layout.fragment_blog; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/module/browser/MobelBrowserActivity.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.module.browser; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.annotation.NonNull; 7 | import android.support.annotation.Nullable; 8 | import android.support.design.widget.CollapsingToolbarLayout; 9 | import android.support.v7.app.ActionBar; 10 | import android.view.MenuItem; 11 | 12 | import com.kymjs.base.backactivity.BaseBackActivity; 13 | import com.kymjs.browser.interf.ILinkDispatcher; 14 | import com.kymjs.oslab.R; 15 | import com.kymjs.oslab.module.blog.BlogDetailDelegate; 16 | import com.kymjs.oslab.utils.LinkDispatcher; 17 | import com.kymjs.oslab.utils.Tools; 18 | 19 | 20 | /** 21 | * 对手机页面做了适配的网站 22 | * 23 | * @author kymjs (http://www.kymjs.com/) on 12/5/15. 24 | */ 25 | public class MobelBrowserActivity extends BaseBackActivity { 26 | 27 | public static final String KEY_BLOG_URL = "blog_url_key"; 28 | public static final String KEY_BLOG_TITLE = "blog_title_key"; 29 | 30 | private ILinkDispatcher linkDispatcher = new LinkDispatcher(); 31 | 32 | @Override 33 | protected Class getDelegateClass() { 34 | return BlogDetailDelegate.class; 35 | } 36 | 37 | @Override 38 | protected void onCreate(Bundle savedInstanceState) { 39 | super.onCreate(savedInstanceState); 40 | Intent intent = getIntent(); 41 | String url = intent.getStringExtra(KEY_BLOG_URL); 42 | String title = intent.getStringExtra(KEY_BLOG_TITLE); 43 | CollapsingToolbarLayout collapsingToolbar = viewDelegate.get(R.id.collapsing_toolbar); 44 | title = linkDispatcher.getActionTitle(url, title); 45 | if (title != null) { 46 | collapsingToolbar.setTitle(title); 47 | } else { 48 | collapsingToolbar.setTitle(getString(R.string.app_name)); 49 | } 50 | 51 | viewDelegate.setContentUrl(url); 52 | } 53 | 54 | @Override 55 | protected void initToolbar() { 56 | setSupportActionBar(viewDelegate.getToolbar()); 57 | ActionBar actionBar = getSupportActionBar(); 58 | if (actionBar != null) { 59 | actionBar.setDisplayHomeAsUpEnabled(true); 60 | } 61 | } 62 | 63 | @Override 64 | public boolean onOptionsItemSelected(MenuItem item) { 65 | if (item.getItemId() == android.R.id.home) { 66 | finish(); 67 | return true; 68 | } 69 | if (item.getItemId() == R.id.action_share 70 | && viewDelegate != null && viewDelegate.getWebView() != null) { 71 | Tools.shareUrl(this, viewDelegate.getWebView().getUrl()); 72 | return true; 73 | } 74 | return super.onOptionsItemSelected(item); 75 | } 76 | 77 | /** 78 | * 跳转到博客详情界面 79 | * 80 | * @param url 传递要显示的博客的地址 81 | * @param title 传递要显示的博客的标题 82 | */ 83 | public static void goinActivity(Context cxt, @NonNull String url, @Nullable String title) { 84 | Intent intent = new Intent(cxt, MobelBrowserActivity.class); 85 | intent.putExtra(KEY_BLOG_URL, url); 86 | intent.putExtra(KEY_BLOG_TITLE, title); 87 | cxt.startActivity(intent); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/module/dress/DressFragment.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.module.dress; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.view.View; 6 | 7 | import com.kymjs.browser.BrowserFragment; 8 | 9 | /** 10 | * Created by ZhangTao on 9/4/16. 11 | */ 12 | public class DressFragment extends BrowserFragment { 13 | 14 | @Override 15 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 16 | super.onViewCreated(view, savedInstanceState); 17 | mWebView.loadUrl("http://www.uullnn.com/articles"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/module/main/MainViewDelegate.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2015, 张涛. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.kymjs.oslab.module.main; 17 | 18 | import com.kymjs.oslab.R; 19 | import com.kymjs.themvp.view.AppDelegate; 20 | 21 | 22 | /** 23 | * View视图层,完全移除与Presenter业务逻辑的耦合 24 | * 25 | * @author kymjs (http://www.kymjs.com/) on 10/23/15. 26 | */ 27 | public class MainViewDelegate extends AppDelegate { 28 | 29 | @Override 30 | public int getRootLayoutId() { 31 | return R.layout.activity_main; 32 | } 33 | } -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/module/main/TestActivity.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.module.main; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.app.Fragment; 5 | import android.util.Log; 6 | 7 | import com.kymjs.common.ThreadSwitch; 8 | import com.kymjs.oslab.databinding.ActivityMainBinding; 9 | import com.kymjs.oslab.module.blog.BlogFragment; 10 | import com.kymjs.themvp.databind.DataBindActivity; 11 | 12 | public class TestActivity extends DataBindActivity { 13 | 14 | private static final String TAG = "MainActivity"; 15 | Fragment fragment = new BlogFragment(); 16 | 17 | @Override 18 | protected Class getDelegateClass() { 19 | return MainViewDelegate.class; 20 | } 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | ThreadSwitch.get() 26 | .io(new ThreadSwitch.IO() { 27 | @Override 28 | public void run() { 29 | Log.d(TAG, "run: ========io"); 30 | try { 31 | Thread.sleep(1000); 32 | } catch (InterruptedException e) { 33 | e.printStackTrace(); 34 | } 35 | Log.d(TAG, "run: ========io2"); 36 | } 37 | }) 38 | .ui(new ThreadSwitch.Function() { 39 | @Override 40 | public void run() { 41 | Log.d(TAG, "run: ========hello"); 42 | } 43 | }) 44 | .breakTask() 45 | .ui(new ThreadSwitch.Function() { 46 | @Override 47 | public void run() { 48 | Log.d(TAG, "run: ========hello2"); 49 | } 50 | }); 51 | 52 | // ActivityUtils.addFragmentToActivity(getSupportFragmentManager(), fragment, R.id.main_body); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/utils/AppConfig.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.utils; 2 | 3 | 4 | import com.kymjs.rxvolley.toolbox.FileUtils; 5 | 6 | import java.io.File; 7 | import java.util.LinkedList; 8 | 9 | /** 10 | * 全局常量配置器 11 | * Created by kymjs on 3/2/16. 12 | */ 13 | public class AppConfig { 14 | //捐赠页域名包含的字符串 15 | public static final String DONATE_STR = "kymjs.com/donate"; 16 | 17 | public static final String DEF_AVATAR = "http://7xjria.com5.z0.glb.clouddn.com/default162813_JnM6_1767531.png"; 18 | 19 | //支付婊相关 20 | public static final String ALIPAY_PKGNAME = "com.eg.android.AlipayGphone"; 21 | public static final String ALIPAY_MAIN_NAME = "com.alipay.mobile.quinox.LauncherActivity"; 22 | public static final String ALIPAY_ID = "#吱口令# EaIq4w54ym"; 23 | 24 | //疼逊相关 25 | public static final String QQ_AVATAR = "http://qlogo4.store.qq.com/qzone/%ld/%ld/100"; 26 | 27 | public static String getAvatarURL() { 28 | long qq = getQQNumber(); 29 | if (qq > 0) { 30 | return QQ_AVATAR.replace("%ld", qq + ""); 31 | } else { 32 | return DEF_AVATAR; 33 | } 34 | } 35 | 36 | /** 37 | * 获取用户的QQ号 38 | * 根据用户手机SD卡中QQ缓存文件夹的文件夹名获取 39 | */ 40 | public static long getQQNumber() { 41 | File rootFile = getTencentQQFolder(); 42 | if (rootFile.exists() && rootFile.isDirectory()) { 43 | final LinkedList list = new LinkedList<>(); 44 | for (String fileName : rootFile.list()) { 45 | long qq = Tools.toLong(fileName, -1); 46 | if (qq > 0) { 47 | list.add(qq); 48 | } 49 | } 50 | return getMaxFolderName(list); 51 | } else { 52 | return -1L; 53 | } 54 | } 55 | 56 | /** 57 | * 找到QQ所在文件夹 58 | */ 59 | public static File getTencentQQFolder() { 60 | return new File(FileUtils.getSDCardPath() + "/tencent/MobileQQ/"); 61 | } 62 | 63 | /** 64 | * 获取最大文件夹的QQ号码 65 | * 缓存目录可能有多个QQ号,根据每个缓存文件夹大小,找出最常用的文件夹 66 | * 67 | * @param folderList 所有缓存文件夹的名字(QQ号)集合 68 | */ 69 | public static long getMaxFolderName(LinkedList folderList) { 70 | File rootFolder = getTencentQQFolder(); 71 | long size = 0; 72 | long maxFolderName = 0; 73 | for (Long folderName : folderList) { 74 | File folder = new File(rootFolder.getAbsolutePath() + File.separator + folderName); 75 | long tempSize = FileSizeUtil.getFileSize(folder); 76 | if (tempSize > size) { 77 | size = tempSize; 78 | maxFolderName = folderName; 79 | } 80 | } 81 | return maxFolderName; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/utils/FileSizeUtil.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.utils; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Created by kymjs on 3/2/16. 7 | */ 8 | public final class FileSizeUtil { 9 | 10 | /*** 11 | * 获取文件夹大小 12 | ***/ 13 | public static long getFileSize(File f) { 14 | long size = 0L; 15 | if (f != null && f.exists()) { 16 | File flist[] = f.listFiles(); 17 | for (File aFlist : flist) { 18 | size += aFlist.isDirectory() ? getFileSize(aFlist) : aFlist.length(); 19 | } 20 | } 21 | return size; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/utils/LinkDispatcher.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.utils; 2 | 3 | import android.content.Context; 4 | import android.webkit.WebView; 5 | 6 | import com.kymjs.browser.BrowserActivity; 7 | import com.kymjs.browser.interf.ILinkDispatcher; 8 | import com.kymjs.oslab.module.blog.BlogDetailActivity; 9 | import com.kymjs.oslab.module.browser.MobelBrowserActivity; 10 | 11 | import java.util.regex.Matcher; 12 | import java.util.regex.Pattern; 13 | 14 | 15 | /** 16 | * 链接分发调度器 17 | * 特殊链接,特殊处理 18 | * 19 | * @author kymjs (http://www.kymjs.com/) on 12/5/15. 20 | */ 21 | public class LinkDispatcher implements ILinkDispatcher { 22 | /** 23 | * 分发已知适配手机页面的url,对于未知页面调用#BrowserActivity显示 24 | */ 25 | public void dispatchUrl(Context cxt, String url) { 26 | if ((getActionTitle(url, null)) != null) { 27 | MobelBrowserActivity.goinActivity(cxt, url, getActionTitle(url, "")); 28 | } else { 29 | BrowserActivity.toBrowser(cxt, url); 30 | } 31 | } 32 | 33 | /** 34 | * 对不同的链接调用不同的Activity去展示 35 | * 36 | * @param view 当前视图中的webview 37 | * @param url 链接 38 | */ 39 | @Override 40 | public void dispatch(WebView view, String url) { 41 | String currentHost = getHost(view.getUrl()); 42 | String remoteHost = getHost(url); 43 | if (url.contains("kymjs.com")) { 44 | BlogDetailActivity.goinActivity(view.getContext(), url, null); 45 | } else { 46 | if (currentHost.equals(remoteHost)) { 47 | view.loadUrl(url); 48 | } else { 49 | dispatchUrl(view.getContext(), url); 50 | } 51 | } 52 | } 53 | 54 | 55 | /** 56 | * 设置ActionBar的title 57 | * 特殊站点优待 58 | * 59 | * @param url 站点的url 60 | * @param defTitle 如果不在优待范围内 61 | */ 62 | @Override 63 | public String getActionTitle(String url, String defTitle) { 64 | String title; 65 | //还有哪些移动页面已经适配的网站呢? 66 | if (url.contains("github.io")) { 67 | title = "GitHub博客"; 68 | } else if (url.contains("github.com")) { 69 | title = "GitHub项目"; 70 | } else if (url.contains("kymjs.com")) { 71 | title = "开源实验室"; 72 | } else if (url.contains("droidyue")) { 73 | title = "技术小黑屋"; 74 | } else if (url.contains("androidweekly")) { 75 | title = "Android开发技术周报"; 76 | } else if (url.contains("mp.weixin.qq.com")) { 77 | title = "微信公众号"; 78 | } else { 79 | title = defTitle; 80 | } 81 | return title; 82 | } 83 | 84 | /** 85 | * 获取一个url的域名 86 | */ 87 | @Override 88 | public String getHost(String url) { 89 | Pattern pattern = Pattern.compile("(http|https|ftp|svn)://[a-zA-Z0-9].?]"); 90 | Matcher matcher = pattern.matcher(url); 91 | if (matcher.find()) return matcher.group(); 92 | else return ""; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/java/com/kymjs/oslab/utils/Tools.java: -------------------------------------------------------------------------------- 1 | package com.kymjs.oslab.utils; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | /** 7 | * Created by kymjs on 3/2/16. 8 | */ 9 | public class Tools { 10 | 11 | public static int toInt(String num, int defualt) { 12 | try { 13 | return Integer.valueOf(num); 14 | } catch (NumberFormatException e) { 15 | return defualt; 16 | } 17 | } 18 | 19 | public static long toLong(String num, long defualt) { 20 | try { 21 | return Long.valueOf(num); 22 | } catch (NumberFormatException e) { 23 | return defualt; 24 | } 25 | } 26 | 27 | public static void shareUrl(Context context, String url) { 28 | Intent sendIntent = new Intent(); 29 | sendIntent.setAction(Intent.ACTION_SEND); 30 | sendIntent.putExtra(Intent.EXTRA_TEXT, "来自开源实验室的分享:" + url); 31 | sendIntent.setType("text/plain"); 32 | context.startActivity(Intent.createChooser(sendIntent, "发送到:")); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable-hdpi/icon_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kymjs/CoreModule/dabbd6bc8f0e598cafd0171a1fedc4c75bbeaa73/CoreModule/app/src/main/res/drawable-hdpi/icon_share.png -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable-v21/ic_menu_camera.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable-v21/ic_menu_gallery.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable-v21/ic_menu_manage.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable-v21/ic_menu_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable-v21/ic_menu_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable-v21/ic_menu_slideshow.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable/bg_bottombar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable/bg_search_edittext.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable/selector_bottombar_blog.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable/selector_bottombar_find.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /CoreModule/app/src/main/res/layout/activity_demo_baseback.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |