├── .flow.yml ├── .gitignore ├── README.md ├── apk └── kaiyan-1.1.apk ├── app ├── .gitignore ├── build.gradle ├── kaiyan.jks ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── moment │ │ └── eyepetizer │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── fonts │ │ │ ├── FZLanTingHeiS-DB1-GB-Regular.TTF │ │ │ ├── FZLanTingHeiS-L-GB-Regular.TTF │ │ │ └── Lobster-1.4.otf │ ├── java │ │ └── com │ │ │ └── moment │ │ │ └── eyepetizer │ │ │ ├── MainActivity.kt │ │ │ ├── MainActivitys.java │ │ │ ├── MyApplication.kt │ │ │ ├── TabSwitchActivity.kt │ │ │ ├── Test.kt │ │ │ ├── ad │ │ │ └── AdActivity.kt │ │ │ ├── adapters │ │ │ ├── ItemClickListener.java │ │ │ ├── Section.java │ │ │ ├── SectionStateChangeListener.java │ │ │ ├── SectionedExpandableGridAdapter.java │ │ │ └── SectionedExpandableLayoutHelper.java │ │ │ ├── base │ │ │ ├── BaseActivity.kt │ │ │ ├── BaseFragment.kt │ │ │ ├── BasePresenter.kt │ │ │ └── BaseView.kt │ │ │ ├── event │ │ │ ├── RxBus.kt │ │ │ └── entity │ │ │ │ ├── ChangeTabEvent.kt │ │ │ │ ├── CurrentTagEvent.kt │ │ │ │ └── RefreshEvent.kt │ │ │ ├── follow │ │ │ ├── FollowFragment.kt │ │ │ └── mvp │ │ │ │ ├── FollowContract.kt │ │ │ │ └── FollowPresenter.kt │ │ │ ├── home │ │ │ ├── CategoriesAllActivity.kt │ │ │ ├── CategoriesTagListActivity.kt │ │ │ ├── CategoryFragment.kt │ │ │ ├── CategoryTagListFragment.kt │ │ │ ├── DiscoveryFragment.kt │ │ │ ├── DiscussListActivity.kt │ │ │ ├── FeedFragment.kt │ │ │ ├── HomeFragment.kt │ │ │ ├── RankListActivity.kt │ │ │ ├── RankListFragment.kt │ │ │ ├── RecommendFragment.kt │ │ │ ├── SpecialTopicsActivity.kt │ │ │ ├── TagIndexActivity.kt │ │ │ ├── TagIndexFragment.kt │ │ │ ├── adapter │ │ │ │ ├── CategoriesAllAdapter.kt │ │ │ │ ├── GalleryAdapter.kt │ │ │ │ ├── ItemBind.kt │ │ │ │ ├── ItemDivider.java │ │ │ │ ├── ItemHolder.kt │ │ │ │ ├── MyMultiTypeAdapter.kt │ │ │ │ └── VideoCollectionAdapter.kt │ │ │ └── mvp │ │ │ │ ├── CategoriesAllContract.kt │ │ │ │ ├── CategoriesAllPresenter.kt │ │ │ │ ├── CategoriesContract.kt │ │ │ │ ├── CategoriesDetailContract.kt │ │ │ │ ├── CategoriesDetailPresenter.kt │ │ │ │ ├── CategoriesPresenter.kt │ │ │ │ ├── CategoryContract.kt │ │ │ │ ├── CategoryPresenter.kt │ │ │ │ ├── CategoryTabListContract.kt │ │ │ │ ├── CategoryTabListPresenter.kt │ │ │ │ ├── DiscoveryContract.kt │ │ │ │ ├── DiscoveryPresenter.kt │ │ │ │ ├── DiscussListContract.kt │ │ │ │ ├── DiscussListPresenter.kt │ │ │ │ ├── FeedContract.kt │ │ │ │ ├── FeedPresenter.kt │ │ │ │ ├── RankListContract.kt │ │ │ │ ├── RankListDetailContract.kt │ │ │ │ ├── RankListDetailPresenter.kt │ │ │ │ ├── RankListPresenter.kt │ │ │ │ ├── RecommendContract.kt │ │ │ │ ├── RecommendPresenter.kt │ │ │ │ ├── SpecialTopicsContract.kt │ │ │ │ ├── SpecialTopicsPresenter.kt │ │ │ │ ├── TagIndexContract.kt │ │ │ │ └── TagIndexPresenter.kt │ │ │ ├── mine │ │ │ ├── MineFragment.kt │ │ │ └── WebViewActivity.kt │ │ │ ├── models │ │ │ └── Item.java │ │ │ ├── net │ │ │ ├── CallBack.kt │ │ │ ├── GetDataList.kt │ │ │ ├── RetrofitUtils.kt │ │ │ ├── Service.kt │ │ │ └── entity │ │ │ │ ├── Banner.kt │ │ │ │ ├── BriefCard.kt │ │ │ │ ├── Categories.kt │ │ │ │ ├── CategoryInfo.kt │ │ │ │ ├── DynamicInfoCard.kt │ │ │ │ ├── FollowCard.kt │ │ │ │ ├── HorizontalScrollCard.kt │ │ │ │ ├── RankList.kt │ │ │ │ ├── Result.kt │ │ │ │ ├── SquareCardCollection.kt │ │ │ │ ├── TagIndex.kt │ │ │ │ ├── TextCard.kt │ │ │ │ ├── VideoCollectionWithBrief.kt │ │ │ │ └── VideoSmallCard.kt │ │ │ ├── notification │ │ │ └── NotificationFragment.kt │ │ │ ├── search │ │ │ ├── SearchActivity.kt │ │ │ ├── SearchFragment.kt │ │ │ └── mvp │ │ │ │ ├── SearchContract.kt │ │ │ │ ├── SearchHotPresenter.kt │ │ │ │ └── SearchPresenter.kt │ │ │ ├── utils │ │ │ ├── AppBarStateChangeListener.java │ │ │ ├── CommonTools.kt │ │ │ ├── Constant.kt │ │ │ ├── DensityUtil.kt │ │ │ ├── DiskCacheMoudle.kt │ │ │ ├── ImageLoad.kt │ │ │ ├── ItemClickSupport.java │ │ │ ├── ItemTouchHelperAdapter.kt │ │ │ ├── ItemTouchHelperCallback.kt │ │ │ ├── ItemTouchHelperViewHolder.kt │ │ │ ├── MyGlideModule.kt │ │ │ ├── RouteUtil.kt │ │ │ ├── TabSwitchAdapter.kt │ │ │ ├── TimeUtils.kt │ │ │ └── UriUtils.kt │ │ │ └── view │ │ │ ├── FlowLayout.kt │ │ │ ├── SearchView.kt │ │ │ └── TabLayout.kt │ └── res │ │ ├── anim │ │ ├── slide_in_bottom.xml │ │ ├── slide_in_left.xml │ │ ├── slide_in_right.xml │ │ ├── slide_in_top.xml │ │ ├── slide_out_bottom.xml │ │ ├── slide_out_left.xml │ │ ├── slide_out_right.xml │ │ └── slide_out_top.xml │ │ ├── color │ │ ├── default_text_color.xml │ │ └── theme_color.xml │ │ ├── drawable-hdpi │ │ ├── action_download_cut.png │ │ ├── btn_back.png │ │ ├── default_icon.png │ │ ├── ic_action_back.png │ │ ├── ic_action_back_white.png │ │ ├── ic_action_focus.png │ │ ├── ic_action_search_no_padding.png │ │ ├── ic_grey_heart.png │ │ ├── ic_menu_more.png │ │ ├── icon_close.png │ │ ├── icon_search.png │ │ └── menu_download_icon.png │ │ ├── drawable-mdpi │ │ ├── action_download_cut.png │ │ ├── btn_back.png │ │ ├── ic_action_back.png │ │ ├── ic_action_back_white.png │ │ ├── ic_action_focus.png │ │ ├── ic_action_search_no_padding.png │ │ ├── ic_grey_heart.png │ │ ├── ic_menu_more.png │ │ ├── icon_close.png │ │ ├── icon_search.png │ │ └── menu_download_icon.png │ │ ├── drawable-xhdpi │ │ ├── action_download_cut.png │ │ ├── btn_back.png │ │ ├── ic_action_back.png │ │ ├── ic_action_back_white.png │ │ ├── ic_action_focus.png │ │ ├── ic_action_search_no_padding.png │ │ ├── ic_grey_heart.png │ │ ├── ic_keyboard_arrow_down_white_24dp.png │ │ ├── ic_keyboard_arrow_up_white_24dp.png │ │ ├── ic_menu_more.png │ │ ├── icon_close.png │ │ ├── icon_search.png │ │ └── menu_download_icon.png │ │ ├── drawable-xxhdpi │ │ ├── action_download_cut.png │ │ ├── all_category_img.png │ │ ├── blur.jpeg │ │ ├── btn_back.png │ │ ├── default_banner.png │ │ ├── drag_icon.png │ │ ├── goto_icon.png │ │ ├── ic_account_login_header.png │ │ ├── ic_action_back.png │ │ ├── ic_action_back_white.png │ │ ├── ic_action_focus.png │ │ ├── ic_action_focus_white_no_margin.png │ │ ├── ic_action_search_no_padding.png │ │ ├── ic_grey_heart.png │ │ ├── ic_menu_more.png │ │ ├── ic_tab_strip_icon_category.png │ │ ├── ic_tab_strip_icon_category_selected.png │ │ ├── ic_tab_strip_icon_feed.png │ │ ├── ic_tab_strip_icon_feed_selected.png │ │ ├── ic_tab_strip_icon_follow.png │ │ ├── ic_tab_strip_icon_follow_selected.png │ │ ├── ic_tab_strip_icon_profile.png │ │ ├── ic_tab_strip_icon_profile_selected.png │ │ ├── icon_close.png │ │ ├── icon_search.png │ │ ├── landing_background.jpg │ │ ├── menu_download_icon.png │ │ └── no_account_tip.png │ │ ├── drawable │ │ ├── bg_auto_shap.xml │ │ ├── bg_banner2_shap.xml │ │ ├── bg_search_shap.xml │ │ ├── btn_shap.xml │ │ ├── btn_shap_bg.xml │ │ ├── btn_shap_time.xml │ │ ├── btn_shap_txt.xml │ │ ├── color_cursor.xml │ │ ├── ic_tab_strip_icon_category_selector.xml │ │ ├── ic_tab_strip_icon_feed_selector.xml │ │ ├── ic_tab_strip_icon_follow_selector.xml │ │ ├── ic_tab_strip_icon_profile_selector.xml │ │ ├── image_circle_shap.xml │ │ ├── selector_section_toggle.xml │ │ └── theme_color.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_mains.xml │ │ ├── activity_recycler_item.xml │ │ ├── ad_activity.xml │ │ ├── banner2_item.xml │ │ ├── banner_item.xml │ │ ├── brief_card_item.xml │ │ ├── categories_all_activity.xml │ │ ├── categories_taglist_activity.xml │ │ ├── category_fragment.xml │ │ ├── category_taglist_fragment.xml │ │ ├── discovery_fragment.xml │ │ ├── discuss_list_activity.xml │ │ ├── dynamic_infocard_item.xml │ │ ├── empty_item.xml │ │ ├── feed_fragment.xml │ │ ├── follow_fragment.xml │ │ ├── followcard_item.xml │ │ ├── home_fragment.xml │ │ ├── horizontal_scrollcard_item.xml │ │ ├── layout_item.xml │ │ ├── layout_section.xml │ │ ├── mine_fragment.xml │ │ ├── notification_fragment.xml │ │ ├── ranklist_activity.xml │ │ ├── ranklist_fragment.xml │ │ ├── recommend_fragment.xml │ │ ├── rectangle_card_item.xml │ │ ├── search_activity.xml │ │ ├── search_fragment.xml │ │ ├── special_topics_activity.xml │ │ ├── square_card_item.xml │ │ ├── squarecard_collection_item.xml │ │ ├── tab_switch_activity.xml │ │ ├── tab_switch_item.xml │ │ ├── tagindex_activity.xml │ │ ├── tagindex_fragment.xml │ │ ├── text_card_item.xml │ │ ├── text_footer_item.xml │ │ ├── text_header_item.xml │ │ ├── video_collection_recycler_item.xml │ │ ├── video_smallcard_item.xml │ │ ├── videocollection_ofhoriscroll_item.xml │ │ ├── videocollection_withbrief_item.xml │ │ └── web_profile_webview.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── daily_label.png │ │ ├── ic_action_back.png │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── values-v21 │ │ └── styles.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimen.xml │ │ ├── dimens.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── moment │ └── eyepetizer │ └── ExampleUnitTest.java ├── build.gradle ├── compiler ├── .gitignore ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── moment │ └── compiler │ └── RouterProcessor.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── img ├── download_dialog.png ├── download_path.png ├── guanzhu.png ├── meitu_detai_1.png ├── meitu_detail_0.png ├── meitu_list.png ├── meitu_preview.png ├── shouye-faxian.png ├── shouye-guanggao.png ├── shouye-tuijian.png ├── sousuo-error.png ├── sousuo-succ.png ├── sousuo.png ├── tab_1.png ├── tab_2.png ├── tongzhi.png └── wode.png ├── release_kaiyan.sh ├── sdkmanager ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── sdkmanager │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── sdkmanager │ │ │ ├── ACache.java │ │ │ ├── AudioCapturer.java │ │ │ ├── PathDialog.java │ │ │ ├── SdCardManager.java │ │ │ ├── StorageUtils.java │ │ │ ├── StorageVolumeUtil.java │ │ │ └── annotation │ │ │ ├── ViewById.java │ │ │ └── ViewUtils.java │ └── res │ │ ├── drawable │ │ ├── path_dialog_shap.xml │ │ ├── switch_path.xml │ │ ├── switch_path_off.xml │ │ └── switch_path_on.xml │ │ ├── layout │ │ └── path_dialog.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── sdkmanager │ └── ExampleUnitTest.java └── settings.gradle /.flow.yml: -------------------------------------------------------------------------------- 1 | # 2 | # Pre-requirements: 3 | # 4 | # - Setup default agent directory, the default is ${HOME} folder if the variable not defined 5 | # - FLOW_AGENT_WORKSPACE: 6 | # 7 | # - Setup project name 8 | # - ANDROID_PROJECT_NAME: your project name 9 | # 10 | # - Setup Android build parameter: 11 | # - ANDROID_GRADLE_BUILD_TASK 12 | # 13 | # Import to your project: 14 | # - Rename android.flow.yml to .flow.yml and save to project root directory 15 | 16 | flow: 17 | - envs: 18 | FLOW_AGENT_WORKSPACE: "${HOME}/agent-workspace" 19 | FLOW_ENV_OUTPUT_PREFIX: "ANDORID_OUTPUT_" 20 | ANDROID_GRADLE_BUILD_TASK: "build" 21 | ANDROID_PROJECT_NAME: "Eyepetizer" 22 | 23 | steps: 24 | - name: Git Clone 25 | script: | 26 | rm -r -f ${ANDROID_PROJECT_NAME} 27 | export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" 28 | git clone --branch ${FLOW_GIT_BRANCH} --single-branch ${FLOW_GIT_URL} ${ANDROID_PROJECT_NAME} 29 | 30 | - name: Build 31 | script: | 32 | cd ${ANDROID_PROJECT_NAME} 33 | ./release_kaiyan.sh -r 34 | 35 | - name: Find APK 36 | script: | 37 | cd ${ANDROID_PROJECT_NAME} 38 | array=$(find ./ -name *.apk 2>&1) 39 | for file in ${array[@]} 40 | do 41 | echo $file 42 | export ANDROID_OUTPUT_IPA_PATH=$file 43 | done 44 | 45 | - name: Print APK Path 46 | script: | 47 | echo ${ANDROID_OUTPUT_IPA_PATH} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/ 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Eyepetizer 2 | 3 | ## 公告: 4 | > 因近期公司项目在模块化改造,工作量较大,所以本项目暂时停更,后期本项目将会进行模块化改造,敬请期待~ 5 | 6 | 仿开眼视频Android客户端,本项目主要用来练手Google-MVP已及kotlin,对于急切想熟悉kotlin的童鞋来说是一个不错的练手项目,由于公司任务比较紧急所以本项目目前处于功能完善中,相关技术文章还未整理发布,想参与本项目开发的童鞋可以先自己去熟悉项目并在issues留言,或在目前的基础上进行修改,后续会陆续相关文章会发布到个人主页,欢迎各位积极PR,相关文章发布地址如下: 7 | 8 | [简书](https://www.jianshu.com/u/e687a486a27c) 9 | [掘金](https://juejin.im/user/57102c3c71cfe40067537379/posts) 10 | [blog](http://liuzheng.space/#blog) 11 | [源码地址](https://github.com/momentslz/Eyepetizer) 12 | 13 | 14 | # 截图说明 15 | 16 | 17 | 18 | 19 | # 项目功能简介 20 | * 数据来源 [开眼视频官网](http://www.kaiyanapp.com/) 21 | 22 | > 本项目功能参考的是开眼视频Version 3.0所有API均来自开眼视频,数据接口均属于非正常渠道获取,请勿用于商业用途,原公司拥有数据所有权,侵权删. 23 | 24 | * 应用功能 25 | 26 | > 开眼视频首页分类tab切换【已完成】 27 | 开眼视频社区内容展示【已完成】 28 | 开眼视频搜索页面【已完成】 29 | 开眼视频首页置顶分类排序【待开发】 30 | 视频详情页添加【待开发】 31 | 视频缓存【待开发】 32 | 观看记录【待开发】 33 | 34 | * 知识点 35 | 36 | > Google MVP 37 | kotlin 38 | tabLayout 39 | glide使用封装 40 | rxbus 41 | RecyclerViewSnap实现类似viewpager的切换方式 42 | 43 | 44 | ## 技术栈 45 | 46 | [googleMvp](https://github.com/googlesamples/android-architecture) 47 | 48 | [SlidingTabLayout](https://github.com/H07000223/FlycoTabLayout/blob/master/README_CN.md) 49 | 50 | [仿写SlidingTabLayout文章地址 : https://www.jianshu.com/p/c283a2403190](https://www.jianshu.com/p/c283a2403190) 51 | 52 | [rxandroid](https://github.com/ReactiveX/RxAndroid) 53 | 54 | [RxRelay](https://github.com/JakeWharton/RxRelay) 55 | 56 | [RecyclerViewSnap](https://github.com/rubensousa/RecyclerViewSnap) 57 | 58 | [SmartRefreshLayout](https://github.com/scwang90/SmartRefreshLayout) 59 | 60 | ``` 61 | 注:技术栈中的相关框架后期会进行源码解析,在原有框架基础上进行功能拓展 62 | ``` 63 | 64 | # Changelog 65 | 66 | ``` 67 | 2018-08-08 68 | 首页部分页面api被屏蔽出现异常的bug修复 69 | 70 | 2018-02-24 71 | 图片加载优化 72 | 73 | 2018-02-14 74 | 第一版上线,实现开眼视频基本功能 75 | ``` 76 | 77 | # Demo下载 78 | 79 | 网页下载: 80 | [下载地址](https://www.pgyer.com/O4Pf) 81 | 82 | 二维码下载: 83 | ![下载地址](https://www.pgyer.com/app/qrcode/O4Pf) 84 | -------------------------------------------------------------------------------- /apk/kaiyan-1.1.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/apk/kaiyan-1.1.apk -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/kaiyan.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/kaiyan.jks -------------------------------------------------------------------------------- /app/src/androidTest/java/com/moment/eyepetizer/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.moment.eyepetizer", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/assets/fonts/FZLanTingHeiS-DB1-GB-Regular.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/assets/fonts/FZLanTingHeiS-DB1-GB-Regular.TTF -------------------------------------------------------------------------------- /app/src/main/assets/fonts/FZLanTingHeiS-L-GB-Regular.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/assets/fonts/FZLanTingHeiS-L-GB-Regular.TTF -------------------------------------------------------------------------------- /app/src/main/assets/fonts/Lobster-1.4.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/assets/fonts/Lobster-1.4.otf -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/MainActivitys.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.widget.Toast; 7 | 8 | 9 | import com.moment.eyepetizer.adapters.ItemClickListener; 10 | import com.moment.eyepetizer.adapters.Section; 11 | import com.moment.eyepetizer.adapters.SectionedExpandableLayoutHelper; 12 | import com.moment.eyepetizer.models.Item; 13 | 14 | import java.util.ArrayList; 15 | 16 | 17 | public class MainActivitys extends AppCompatActivity implements ItemClickListener { 18 | 19 | RecyclerView mRecyclerView; 20 | 21 | @Override 22 | protected void onCreate(Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.activity_mains); 25 | 26 | //setting the recycler view 27 | mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 28 | SectionedExpandableLayoutHelper sectionedExpandableLayoutHelper = new SectionedExpandableLayoutHelper(this, 29 | mRecyclerView, this, 3); 30 | 31 | //random data 32 | ArrayList arrayList = new ArrayList<>(); 33 | arrayList.add(new Item("iPhone", 0)); 34 | arrayList.add(new Item("iPad", 1)); 35 | arrayList.add(new Item("iPod", 2)); 36 | arrayList.add(new Item("iMac", 3)); 37 | sectionedExpandableLayoutHelper.addSection("Apple Products", arrayList); 38 | arrayList = new ArrayList<>(); 39 | arrayList.add(new Item("LG", 0)); 40 | arrayList.add(new Item("Apple", 1)); 41 | arrayList.add(new Item("Samsung", 2)); 42 | arrayList.add(new Item("Motorola", 3)); 43 | arrayList.add(new Item("Sony", 4)); 44 | arrayList.add(new Item("Nokia", 5)); 45 | sectionedExpandableLayoutHelper.addSection("Companies", arrayList); 46 | arrayList = new ArrayList<>(); 47 | arrayList.add(new Item("Chocolate", 0)); 48 | arrayList.add(new Item("Strawberry", 1)); 49 | arrayList.add(new Item("Vanilla", 2)); 50 | arrayList.add(new Item("Butterscotch", 3)); 51 | arrayList.add(new Item("Grape", 4)); 52 | sectionedExpandableLayoutHelper.addSection("Ice cream", arrayList); 53 | 54 | sectionedExpandableLayoutHelper.notifyDataSetChanged(); 55 | 56 | //checking if adding single item works 57 | sectionedExpandableLayoutHelper.addItem("Ice cream", new Item("Tutti frutti", 5)); 58 | sectionedExpandableLayoutHelper.notifyDataSetChanged(); 59 | } 60 | 61 | @Override 62 | public void itemClicked(Item item) { 63 | Toast.makeText(this, "Item: " + item.getName() + " clicked", Toast.LENGTH_SHORT).show(); 64 | } 65 | 66 | @Override 67 | public void itemClicked(Section section) { 68 | Toast.makeText(this, "Section: " + section.getName() + " clicked", Toast.LENGTH_SHORT).show(); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/MyApplication.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer 2 | 3 | import android.app.Activity 4 | import android.app.Application 5 | import android.content.Context 6 | import android.os.Handler 7 | import android.os.Looper 8 | import android.view.WindowManager 9 | import android.widget.Toast 10 | import com.example.sdkmanager.SdCardManager 11 | import io.reactivex.functions.Consumer 12 | 13 | 14 | /** 15 | * Created by moment on 2018/2/2. 16 | */ 17 | 18 | class MyApplication : Application() { 19 | // private var myApplication: MyApplication? = null 20 | private val handler = Handler() // 主线程消息处理 21 | 22 | companion object { 23 | // private var instance by lazy { MyApplication() } 24 | } 25 | 26 | fun getInstance(): MyApplication? { 27 | return null 28 | // return instance 29 | } 30 | 31 | 32 | fun getScreenWidth(context: Context): Int { 33 | val wm = context 34 | .getSystemService(Context.WINDOW_SERVICE) as WindowManager 35 | return wm.defaultDisplay.width 36 | } 37 | 38 | fun getScreenHeigh(context: Context): Int { 39 | val wm = context 40 | .getSystemService(Context.WINDOW_SERVICE) as WindowManager 41 | return wm.defaultDisplay.height 42 | } 43 | 44 | override fun onCreate() { 45 | super.onCreate() 46 | SdCardManager.getInstance() 47 | .init(this, packageName) 48 | } 49 | 50 | /** 51 | * 支持非ui线程Toast,可避免多个Toast队列等待 52 | * 53 | * @param resId 54 | */ 55 | fun showToast(resId: Int) = showToast(resources.getString(resId)) 56 | 57 | /** 58 | * 支持非ui线程Toast,可避免多个Toast队列等待 59 | * 60 | * @param text 61 | */ 62 | private fun showToast(text: CharSequence) { 63 | if (Looper.myLooper() != Looper.getMainLooper()) { 64 | handler.post(Runnable { Toast.makeText(MyApplication().getInstance(), text, Toast.LENGTH_SHORT) }) 65 | } else { 66 | Toast.makeText(MyApplication().getInstance(), text, Toast.LENGTH_SHORT) 67 | } 68 | } 69 | 70 | /** 71 | * 显示测试时的提示信息 72 | * 73 | * @param text 74 | */ 75 | fun showTestToast(text: CharSequence) { 76 | if (!BuildConfig.DEBUG) { 77 | return 78 | } 79 | showToastCenter(text, Toast.LENGTH_LONG) 80 | } 81 | 82 | /** 83 | * 支持非ui线程Toast,可避免多个Toast队列等待 84 | * 85 | * @param text 86 | */ 87 | fun showToastCenter(text: CharSequence) = showToastCenter(text, Toast.LENGTH_SHORT) 88 | 89 | private fun showToastCenter(text: CharSequence, duration: Int) { 90 | if (Looper.myLooper() != Looper.getMainLooper()) { 91 | handler.post(Runnable { Toast.makeText(MyApplication().getInstance(), text, Toast.LENGTH_LONG) }) 92 | } else { 93 | Toast.makeText(MyApplication().getInstance(), text, Toast.LENGTH_LONG) 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/TabSwitchActivity.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer 2 | 3 | import android.support.v7.widget.LinearLayoutManager 4 | import com.moment.eyepetizer.base.BaseActivity 5 | import com.moment.eyepetizer.home.mvp.CategoriesContract 6 | import com.moment.eyepetizer.home.mvp.CategoriesPresenter 7 | import com.moment.eyepetizer.net.entity.Categories 8 | import android.support.v7.widget.helper.ItemTouchHelper 9 | import com.moment.eyepetizer.utils.ItemTouchHelperCallback 10 | import com.moment.eyepetizer.utils.TabSwitchAdapter 11 | import kotlinx.android.synthetic.main.tab_switch_activity.* 12 | import java.util.* 13 | 14 | 15 | /** 16 | * Created by moment on 2018/3/7. 17 | */ 18 | 19 | class TabSwitchActivity : BaseActivity(), CategoriesContract.CategoriesView { 20 | private var presenter: CategoriesContract.CategoriesPresenter? = null 21 | var adapter: TabSwitchAdapter? = null 22 | 23 | override fun getLayoutId(): Int = R.layout.tab_switch_activity 24 | 25 | override fun initView() { 26 | back.setOnClickListener { 27 | finish() 28 | } 29 | val list = ArrayList() 30 | val layoutManager = LinearLayoutManager(this.applicationContext) 31 | recyclerview.layoutManager = layoutManager 32 | adapter = TabSwitchAdapter(list) 33 | recyclerview.adapter = adapter 34 | var itemTouchHelperCallback = ItemTouchHelperCallback(adapter!!) 35 | var itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback) 36 | itemTouchHelper.attachToRecyclerView(recyclerview) 37 | } 38 | 39 | override fun initData() { 40 | presenter?.categories() 41 | } 42 | 43 | override fun initPresenter() { 44 | CategoriesPresenter(this) 45 | } 46 | 47 | override fun setPresenter(presenter: CategoriesContract.CategoriesPresenter) { 48 | this.presenter = presenter 49 | } 50 | 51 | override fun onCategoriesSucc(result: List) { 52 | adapter?.clearAll() 53 | adapter?.addAll(result as ArrayList) 54 | adapter?.notifyDataSetChanged() 55 | } 56 | 57 | override fun onCategoriesFail(error: Throwable?) { 58 | 59 | } 60 | 61 | 62 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/Test.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer 2 | 3 | 4 | class Test { 5 | fun breakDemo() { 6 | println("----- breakDemo " + "-------") 7 | outer@ for (outer in 1..5) { 8 | for (inner in 1..10) { 9 | println("inner = $inner") 10 | println("outer = $outer") 11 | if (inner % 2 == 0) { 12 | break@outer 13 | } 14 | } 15 | } 16 | } 17 | 18 | fun main(args: Array) { 19 | breakDemo() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/ad/AdActivity.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.ad 2 | 3 | import android.content.Intent 4 | import android.graphics.Typeface 5 | import android.view.animation.Animation 6 | import android.view.animation.AnimationSet 7 | import android.view.animation.ScaleAnimation 8 | import com.moment.eyepetizer.MainActivity 9 | import com.moment.eyepetizer.R 10 | import com.moment.eyepetizer.base.BaseActivity 11 | import kotlinx.android.synthetic.main.ad_activity.* 12 | 13 | /** 14 | * Created by moment on 2018/2/2. 15 | */ 16 | 17 | class AdActivity : BaseActivity() { 18 | 19 | override fun getLayoutId(): Int = R.layout.ad_activity 20 | 21 | override fun initView() { 22 | val font: Typeface = Typeface.createFromAsset(this.assets, "fonts/Lobster-1.4.otf") 23 | tv_english_intro!!.typeface = font 24 | } 25 | 26 | override fun initData() { 27 | val scaleAnimation = ScaleAnimation(1.0f, 1.2f, 1.0f, 1.2f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f) 28 | scaleAnimation.duration = 2000 29 | val animationSet = AnimationSet(true) 30 | animationSet.addAnimation(scaleAnimation) 31 | animationSet.duration = 2000 32 | bg!!.startAnimation(animationSet) 33 | animationSet.setAnimationListener(object : Animation.AnimationListener { 34 | override fun onAnimationRepeat(animation: Animation?) = Unit 35 | 36 | override fun onAnimationStart(animation: Animation?) = Unit 37 | 38 | override fun onAnimationEnd(animation: Animation?) { 39 | val intent = Intent(this@AdActivity, MainActivity::class.java) 40 | startActivity(intent) 41 | finish() 42 | } 43 | }) 44 | 45 | 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/adapters/ItemClickListener.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.adapters; 2 | 3 | 4 | import com.moment.eyepetizer.models.Item; 5 | 6 | /** 7 | * Created by lenovo on 2/23/2016. 8 | */ 9 | public interface ItemClickListener { 10 | void itemClicked(Item item); 11 | void itemClicked(Section section); 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/adapters/Section.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.adapters; 2 | 3 | /** 4 | * Created by bpncool on 2/23/2016. 5 | */ 6 | public class Section { 7 | 8 | private final String name; 9 | 10 | public boolean isExpanded; 11 | 12 | public Section(String name) { 13 | this.name = name; 14 | isExpanded = true; 15 | } 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/adapters/SectionStateChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.adapters; 2 | 3 | /** 4 | * Created by bpncool on 2/24/2016. 5 | */ 6 | /** 7 | * interface to listen changes in state of sections 8 | */ 9 | public interface SectionStateChangeListener { 10 | void onSectionStateChanged(Section section, boolean isOpen); 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/base/BaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.base 2 | 3 | import android.os.Bundle 4 | import android.support.v7.app.AppCompatActivity 5 | 6 | /** 7 | * Created by moment on 2018/2/2. 8 | */ 9 | 10 | abstract class BaseActivity : AppCompatActivity() { 11 | 12 | override fun onCreate(savedInstanceState: Bundle?) { 13 | super.onCreate(savedInstanceState) 14 | setContentView(getLayoutId()) 15 | initPresenter() 16 | initEvent() 17 | initView() 18 | initData() 19 | } 20 | 21 | 22 | abstract fun getLayoutId(): Int 23 | abstract fun initView() 24 | 25 | abstract fun initData() 26 | 27 | internal open fun initEvent() = Unit 28 | 29 | internal open fun initPresenter() = Unit 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/base/BaseFragment.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.base 2 | 3 | import android.os.Bundle 4 | import android.support.v4.app.Fragment 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | 9 | /** 10 | * Created by moment on 2018/2/2. 11 | */ 12 | abstract class BaseFragment : Fragment() { 13 | 14 | 15 | override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 16 | var view: View = inflater!!.inflate(getLayoutId(), null, false) 17 | return view 18 | } 19 | 20 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 21 | super.onViewCreated(view, savedInstanceState) 22 | initPresenter() 23 | initEvent() 24 | initView() 25 | initData() 26 | } 27 | 28 | abstract fun getLayoutId(): Int 29 | 30 | abstract fun initView() 31 | 32 | abstract fun initData() 33 | 34 | internal open fun initEvent() = Unit 35 | 36 | internal open fun initPresenter() = Unit 37 | 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/base/BasePresenter.kt: -------------------------------------------------------------------------------- 1 | package com.cn.maimeng.news.base 2 | 3 | /** 4 | * Created by moment on 2017/11/23. 5 | */ 6 | 7 | interface BasePresenter { 8 | // 规定Presenter必须要实现start方法。 9 | fun start() 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/base/BaseView.kt: -------------------------------------------------------------------------------- 1 | package com.cn.maimeng.news.base 2 | 3 | /** 4 | * Created by moment on 2017/11/23. 5 | */ 6 | 7 | interface BaseView { 8 | // 规定View必须要实现setPresenter方法,则View中保持对Presenter的引用。 9 | fun setPresenter(presenter: T) 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/event/RxBus.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.event 2 | 3 | import com.jakewharton.rxrelay2.PublishRelay 4 | import com.jakewharton.rxrelay2.Relay 5 | 6 | import io.reactivex.Observable 7 | 8 | /** 9 | * Created by moment on 2017/12/18. 10 | */ 11 | 12 | class RxBus { 13 | private val mBus: Relay = PublishRelay.create().toSerialized() 14 | 15 | fun post(obj: Any) = mBus.accept(obj) 16 | 17 | fun toObservable(tClass: Class): Observable = mBus.ofType(tClass) 18 | 19 | fun toObservable(): Observable = mBus 20 | 21 | fun hasObservers(): Boolean = mBus.hasObservers() 22 | 23 | 24 | companion object { 25 | private val BUS = RxBus() 26 | @Volatile private var instance: RxBus? = null 27 | 28 | val default: RxBus? 29 | get() { 30 | if (instance == null) { 31 | synchronized(RxBus::class.java) { 32 | if (instance == null) { 33 | instance = BUS 34 | } 35 | } 36 | } 37 | return instance 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/event/entity/ChangeTabEvent.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.event.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/6. 5 | */ 6 | 7 | class ChangeTabEvent(tagIndex: Int) { 8 | var tagIndex: Int = 0 9 | 10 | init { 11 | this.tagIndex = tagIndex 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/event/entity/CurrentTagEvent.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.event.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/6. 5 | */ 6 | 7 | class CurrentTagEvent(tag: String, forceRefresh: Boolean) { 8 | var tag: String? = null 9 | var isForceRefresh: Boolean = false 10 | 11 | init { 12 | this.tag = tag 13 | this.isForceRefresh = forceRefresh 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/event/entity/RefreshEvent.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.event.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/5. 5 | */ 6 | 7 | class RefreshEvent 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/follow/mvp/FollowContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.follow.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | interface FollowContract { 13 | interface FollowPresenter : BasePresenter { 14 | fun follow(start: Int, num: Int, follow: Boolean, startId: Int): Disposable 15 | } 16 | 17 | interface FollowView : BaseView { 18 | fun onFollowSucc(result: Result) 19 | fun onError(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/follow/mvp/FollowPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.follow.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | class FollowPresenter(var followView: FollowContract.FollowView) : FollowContract.FollowPresenter { 13 | 14 | init { 15 | followView.setPresenter(this) 16 | } 17 | 18 | override fun follow(start: Int, num: Int, follow: Boolean, startId: Int): Disposable = 19 | GetDataList.follow(start, num, follow, startId, object : CallBack { 20 | override fun onCompleted() = Unit 21 | 22 | override fun onError(e: Throwable?) = followView.onError(e) 23 | 24 | override fun onNext(t: Result) = followView.onFollowSucc(t) 25 | 26 | }) 27 | 28 | override fun start() = Unit 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/adapter/GalleryAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.adapter 2 | 3 | import android.content.Context 4 | import android.view.ViewGroup 5 | import android.support.v7.widget.RecyclerView 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.WindowManager 9 | import android.widget.ImageView 10 | import com.moment.eyepetizer.R 11 | import com.moment.eyepetizer.utils.DensityUtil 12 | import com.moment.eyepetizer.utils.ImageLoad 13 | import java.lang.ref.WeakReference 14 | 15 | 16 | /** 17 | * Created by moment on 2018/2/5. 18 | */ 19 | class GalleryAdapter(context: Context, private val mDatas: List) : RecyclerView.Adapter() { 20 | private val mInflater: LayoutInflater = LayoutInflater.from(context) 21 | private var mContext: Context = context 22 | 23 | inner class ViewHolder(arg0: View) : RecyclerView.ViewHolder(arg0) { 24 | 25 | internal var mImg: ImageView? = null 26 | } 27 | 28 | override fun getItemCount(): Int = mDatas.size 29 | 30 | /** 31 | * 创建ViewHolder 32 | */ 33 | override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { 34 | val view = mInflater.inflate(R.layout.activity_recycler_item, 35 | viewGroup, false) 36 | val viewHolder = ViewHolder(view) 37 | 38 | viewHolder.mImg = view 39 | .findViewById(R.id.id_index_gallery_item_image) 40 | return viewHolder 41 | } 42 | 43 | /** 44 | * 设置值 45 | */ 46 | override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { 47 | var width = getScreenWidth(mContext) - DensityUtil.dip2px(mContext, 25f) 48 | var height = width * 0.6 49 | ImageLoad().load(mDatas.get(i), viewHolder.mImg, width.toDouble().toInt(), height.toDouble().toInt(), 5) 50 | } 51 | 52 | private fun getScreenWidth(context: Context): Int { 53 | val wm = context 54 | .getSystemService(Context.WINDOW_SERVICE) as WindowManager 55 | return wm.defaultDisplay.width 56 | } 57 | 58 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/adapter/ItemDivider.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.adapter; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.Rect; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.View; 7 | 8 | /** 9 | * Created by moment on 2018/2/12. 10 | */ 11 | 12 | public class ItemDivider extends RecyclerView.ItemDecoration { 13 | // 构造方法,可以在这里做一些初始化,比如指定画笔颜色什么的 14 | public ItemDivider() { 15 | } 16 | 17 | /** 18 | * 指定item之间的间距(就是指定分割线的宽度) 回调顺序 1 19 | * 20 | * @param outRect Rect to receive the output. 21 | * @param view The child view to decorate 22 | * @param parent RecyclerView this ItemDecoration is decorating 23 | * @param state The current state of RecyclerView. 24 | */ 25 | @Override 26 | public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 27 | super.getItemOffsets(outRect, view, parent, state); 28 | } 29 | 30 | /** 31 | * 在item 绘制之前调用(就是绘制在 item 的底层) 回调顺序 2 32 | * 一般分割线在这里绘制 33 | * 看到canvas,对自定义控件有一定了解的话,就能想到为什么说给RecyclerView设置分割线更灵活了 34 | * 35 | * @param c Canvas to draw into 36 | * @param parent RecyclerView this ItemDecoration is drawing into 37 | * @param state The current state of RecyclerView 38 | */ 39 | @Override 40 | public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 41 | super.onDraw(c, parent, state); 42 | } 43 | 44 | /** 45 | * 在item 绘制之后调用(就是绘制在 item 的上层) 回调顺序 3 46 | * 也可以在这里绘制分割线,和上面的方法 二选一 47 | * 48 | * @param c Canvas to draw into 49 | * @param parent RecyclerView this ItemDecoration is drawing into 50 | * @param state The current state of RecyclerView 51 | */ 52 | @Override 53 | public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 54 | super.onDrawOver(c, parent, state); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/adapter/MyMultiTypeAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.adapter 2 | 3 | import android.content.Context 4 | import android.support.v7.widget.RecyclerView 5 | 6 | 7 | import com.moment.eyepetizer.net.entity.Result 8 | import android.view.* 9 | import com.moment.eyepetizer.utils.getMultiType 10 | import kotlin.collections.ArrayList 11 | 12 | /** 13 | * Created by moment on 2017/12/11. 14 | */ 15 | 16 | class MyMultiTypeAdapter(datas: ArrayList, var context: Context) : RecyclerView.Adapter() { 17 | private var datas: ArrayList = datas 18 | private var mContext: Context = context 19 | 20 | enum class ITEM_TYPE(val type: String) { 21 | ITEM_TEXTCARD("textCard"), 22 | ITEM_BRIEFCARD("briefCard"), 23 | ITEM_DYNAMIC_INFOCARD("DynamicInfoCard"), 24 | ITEM_HORICONTAL_SCROLLCARD("horizontalScrollCard"), 25 | ITEM_FOLLOWCARD("followCard"), 26 | ITEM_VIDEOSMALLCARD("videoSmallCard"), 27 | ITEM_SQUARECARD_COLLECTION("squareCardCollection"), 28 | ITEM_VIDEOCOLLECTION_WITHBRIEF("videoCollectionWithBrief"), 29 | ITEM_BANNER("banner"), 30 | ITEM_BANNER2("banner2"), 31 | ITEM_VIDEO("video"), 32 | ITEM_VIDEOCOLLECTION_OFHORISCROLLCARD("videoCollectionOfHorizontalScrollCard"), 33 | ITEM_TEXTHEADER("textHeader"), 34 | ITEM_TEXTFOOTER("textFooter") 35 | } 36 | 37 | 38 | fun clearAll() = this.datas.clear() 39 | 40 | fun addAll(data: ArrayList?) { 41 | if (data == null) { 42 | return 43 | } 44 | this.datas.addAll(data) 45 | } 46 | 47 | //创建新View,被LayoutManager所调用 48 | override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder? = 49 | createMyViewHolder(viewGroup, viewType) 50 | 51 | 52 | //将数据与界面进行绑定的操作 53 | override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) = 54 | bindViewHolder(mContext, datas, viewHolder, position) 55 | 56 | override fun getItemViewType(position: Int): Int = getMultiType(position, datas) 57 | 58 | //获取数据的数量 59 | override fun getItemCount(): Int = datas.size 60 | 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/adapter/VideoCollectionAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.adapter 2 | 3 | import android.content.Context 4 | import android.view.ViewGroup 5 | import android.widget.TextView 6 | import android.support.v7.widget.RecyclerView 7 | import android.view.LayoutInflater 8 | import android.view.View 9 | import android.view.WindowManager 10 | import android.widget.ImageView 11 | import com.moment.eyepetizer.R 12 | import com.moment.eyepetizer.utils.DensityUtil 13 | import com.moment.eyepetizer.utils.ImageLoad 14 | import com.moment.eyepetizer.utils.TimeUtils 15 | import java.lang.ref.WeakReference 16 | 17 | 18 | /** 19 | * Created by moment on 2018/2/5. 20 | */ 21 | class VideoCollectionAdapter(context: Context, private val mDatas: List) : RecyclerView.Adapter() { 22 | private val mInflater: LayoutInflater = LayoutInflater.from(context) 23 | private var mContext: Context = context 24 | 25 | class VideoCollection { 26 | var icon: String? = null 27 | var title: String? = null 28 | var category: String? = null 29 | var duration: Long? = null 30 | } 31 | 32 | inner class ViewHolder(arg0: View) : RecyclerView.ViewHolder(arg0) { 33 | 34 | internal var mImg: ImageView? = null 35 | internal var tv_title: TextView? = null 36 | internal var tv_content: TextView? = null 37 | internal var tv_time: TextView? = null 38 | } 39 | 40 | override fun getItemCount(): Int = mDatas.size 41 | 42 | /** 43 | * 创建ViewHolder 44 | */ 45 | override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { 46 | val view = mInflater.inflate(R.layout.video_collection_recycler_item, 47 | viewGroup, false) 48 | val viewHolder = ViewHolder(view) 49 | 50 | viewHolder.mImg = view 51 | .findViewById(R.id.id_index_gallery_item_image) 52 | viewHolder.tv_title = view.findViewById(R.id.tv_title) 53 | 54 | viewHolder.tv_content = view.findViewById(R.id.tv_content) 55 | viewHolder.tv_time = view.findViewById(R.id.tv_time) 56 | return viewHolder 57 | } 58 | 59 | /** 60 | * 设置值 61 | */ 62 | override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { 63 | var width = getScreenWidth(mContext) - DensityUtil.dip2px(mContext, 25f) 64 | var height = width * 0.6 65 | ImageLoad().load(mDatas.get(i).icon.toString(), viewHolder.mImg, width.toDouble().toInt(), height.toDouble().toInt(), 5) 66 | viewHolder.tv_title!!.text = mDatas.get(i).title 67 | viewHolder.tv_content!!.text = "#" + mDatas.get(i).category 68 | viewHolder.tv_time!!.text = TimeUtils.secToTime(mDatas.get(i).duration!!.toInt()) 69 | 70 | } 71 | 72 | private fun getScreenWidth(context: Context): Int { 73 | val wm = context 74 | .getSystemService(Context.WINDOW_SERVICE) as WindowManager 75 | return wm.defaultDisplay.width 76 | } 77 | 78 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoriesAllContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/12. 10 | */ 11 | 12 | interface CategoriesAllContract { 13 | 14 | interface CategoriesAllPresenter : BasePresenter { 15 | fun categoriesAll(): Disposable 16 | } 17 | 18 | interface CategoriesAllView : BaseView { 19 | fun onCategoriesAllSucc(result: Result) 20 | fun onCategoriesAllFail(error: Throwable?) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoriesAllPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/12. 10 | */ 11 | 12 | class CategoriesAllPresenter(val categoriesAllView: CategoriesAllContract.CategoriesAllView) : CategoriesAllContract.CategoriesAllPresenter { 13 | 14 | init { 15 | categoriesAllView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun categoriesAll(): Disposable = GetDataList.categoriesAll(object : CallBack { 21 | override fun onCompleted() = Unit 22 | 23 | override fun onError(e: Throwable?) = categoriesAllView.onCategoriesAllFail(e) 24 | 25 | override fun onNext(t: Result) = categoriesAllView.onCategoriesAllSucc(t) 26 | 27 | }) 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoriesContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Categories 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | interface CategoriesContract { 13 | interface CategoriesPresenter : BasePresenter { 14 | fun categories(): Disposable 15 | } 16 | 17 | interface CategoriesView : BaseView { 18 | fun onCategoriesSucc(result: List) 19 | fun onCategoriesFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoriesDetailContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.CategoryInfo 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/11. 10 | */ 11 | 12 | interface CategoriesDetailContract { 13 | interface CategoriesDetailPresenter : BasePresenter { 14 | fun categoriesDetail(id: Int): Disposable 15 | } 16 | 17 | interface CategoriesDetailView : BaseView { 18 | fun onCategoriesDetailSucc(result: CategoryInfo) 19 | fun onCategoriesDetailFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoriesDetailPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.CategoryInfo 6 | import io.reactivex.disposables.Disposable 7 | 8 | 9 | /** 10 | * Created by moment on 2018/2/11. 11 | */ 12 | 13 | class CategoriesDetailPresenter(var categoriesTagListView: CategoriesDetailContract.CategoriesDetailView) : CategoriesDetailContract.CategoriesDetailPresenter { 14 | 15 | init { 16 | categoriesTagListView.setPresenter(this) 17 | } 18 | 19 | override fun start() = Unit 20 | 21 | override fun categoriesDetail(id: Int): Disposable = 22 | GetDataList.categoriesDetail(id, object : CallBack { 23 | override fun onCompleted() = Unit 24 | 25 | override fun onError(e: Throwable?) = categoriesTagListView.onCategoriesDetailFail(e) 26 | 27 | override fun onNext(t: CategoryInfo) = categoriesTagListView.onCategoriesDetailSucc(t) 28 | 29 | }) 30 | 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoriesPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Categories 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | class CategoriesPresenter(var categoriesView: CategoriesContract.CategoriesView) : CategoriesContract.CategoriesPresenter { 13 | 14 | init { 15 | categoriesView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun categories(): Disposable = GetDataList.categories(object : CallBack> { 21 | override fun onCompleted() = Unit 22 | 23 | override fun onError(e: Throwable?) = categoriesView.onCategoriesFail(e) 24 | 25 | override fun onNext(t: List) = categoriesView.onCategoriesSucc(t) 26 | 27 | }) 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoryContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | interface CategoryContract { 13 | interface CategoryPresenter : BasePresenter { 14 | fun category(id: Int, start: Int, num: Int): Disposable 15 | } 16 | 17 | interface CategoryView : BaseView { 18 | fun onCategorySucc(result: Result) 19 | fun onCategoryFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoryPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | class CategoryPresenter(var categoryView: CategoryContract.CategoryView) : CategoryContract.CategoryPresenter { 13 | 14 | init { 15 | categoryView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun category(id: Int, start: Int, num: Int): Disposable = 21 | GetDataList.category(id, start, num, object : CallBack { 22 | override fun onCompleted() = Unit 23 | 24 | override fun onError(e: Throwable?) = categoryView.onCategoryFail(e) 25 | 26 | override fun onNext(t: Result) = categoryView.onCategorySucc(t) 27 | 28 | }) 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoryTabListContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/11. 10 | */ 11 | 12 | interface CategoryTabListContract { 13 | interface CategoriesTagListPresenter : BasePresenter { 14 | fun categoriesTagList(path: String, map: HashMap): Disposable 15 | } 16 | 17 | interface CategoriesTagListView : BaseView { 18 | fun onCategoriesTagSucc(result: Result) 19 | fun onCategoriesTagFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/CategoryTabListPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/11. 10 | */ 11 | 12 | class CategoryTabListPresenter(var categoryTagListView: CategoryTabListContract.CategoriesTagListView) : 13 | CategoryTabListContract.CategoriesTagListPresenter { 14 | 15 | init { 16 | categoryTagListView.setPresenter(this) 17 | } 18 | 19 | override fun start() = Unit 20 | 21 | override fun categoriesTagList(path: String, map: HashMap): Disposable = 22 | GetDataList.categoriesTagList(path, map, object : CallBack { 23 | override fun onCompleted() = Unit 24 | 25 | override fun onError(e: Throwable?) = categoryTagListView.onCategoriesTagFail(e) 26 | 27 | override fun onNext(t: Result) = categoryTagListView.onCategoriesTagSucc(t) 28 | }) 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/DiscoveryContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | interface DiscoveryContract { 13 | interface DiscoveryPresenter : BasePresenter { 14 | fun discovery(): Disposable 15 | } 16 | 17 | interface DiscoveryView : BaseView { 18 | fun onDiscoverySucc(result: Result) 19 | fun onDiscoveryFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/DiscoveryPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | class DiscoveryPresenter(var discoveryView: DiscoveryContract.DiscoveryView) : DiscoveryContract.DiscoveryPresenter { 13 | 14 | init { 15 | discoveryView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | 21 | override fun discovery(): Disposable = GetDataList.discovery(object : CallBack { 22 | override fun onCompleted() = Unit 23 | 24 | override fun onError(e: Throwable?) = discoveryView.onDiscoveryFail(e) 25 | 26 | override fun onNext(t: Result) = discoveryView.onDiscoverySucc(t) 27 | 28 | }) 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/DiscussListContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/13. 10 | */ 11 | 12 | interface DiscussListContract { 13 | 14 | interface DiscussListPresenter : BasePresenter { 15 | fun getDiscussList(path: String, map: HashMap): Disposable 16 | } 17 | 18 | interface DiscussListView : BaseView { 19 | fun onDiscussListSucc(result: Result) 20 | fun onDiscussListFail(throwable: Throwable?) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/DiscussListPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/13. 10 | */ 11 | 12 | class DiscussListPresenter(var discussListView: DiscussListContract.DiscussListView) : DiscussListContract.DiscussListPresenter { 13 | 14 | init { 15 | discussListView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun getDiscussList(path: String, map: HashMap): Disposable = 21 | GetDataList.getDiscussList(path, map, object : CallBack { 22 | override fun onCompleted() = Unit 23 | 24 | override fun onError(e: Throwable?) = discussListView.onDiscussListFail(e) 25 | 26 | override fun onNext(t: Result) = discussListView.onDiscussListSucc(t) 27 | 28 | }) 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/FeedContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | interface FeedContract { 13 | interface FeedPresenter : BasePresenter { 14 | fun feed(date: Long): Disposable 15 | } 16 | 17 | interface FeedView : BaseView { 18 | fun onFeedSucc(result: Result) 19 | fun onFeedFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/FeedPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | class FeedPresenter(var feedView: FeedContract.FeedView) : FeedContract.FeedPresenter { 12 | 13 | init { 14 | feedView.setPresenter(this) 15 | } 16 | 17 | override fun start() = Unit 18 | 19 | override fun feed(date: Long): Disposable = GetDataList.feed(date, object : CallBack { 20 | override fun onCompleted() = Unit 21 | 22 | override fun onError(e: Throwable?) = feedView.onFeedFail(e) 23 | 24 | override fun onNext(t: Result) = feedView.onFeedSucc(t) 25 | 26 | }) 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/RankListContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.RankList 6 | import com.moment.eyepetizer.net.entity.Result 7 | import io.reactivex.disposables.Disposable 8 | 9 | /** 10 | * Created by moment on 2018/2/11. 11 | */ 12 | 13 | interface RankListContract { 14 | interface RankListPresenter : BasePresenter { 15 | fun rankList(): Disposable 16 | } 17 | 18 | interface RankListView : BaseView { 19 | fun onRankListSucc(result: RankList) 20 | fun onRankListFail(error: Throwable?) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/RankListDetailContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/11. 10 | */ 11 | 12 | interface RankListDetailContract { 13 | interface RankListPresenter : BasePresenter { 14 | fun rankListVideo(path: String, map: HashMap): Disposable 15 | } 16 | 17 | interface RankListView : BaseView { 18 | fun onRankListSucc(result: Result) 19 | fun onRankListFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/RankListDetailPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/12. 10 | */ 11 | 12 | class RankListDetailPresenter(var rankListDetailView: RankListDetailContract.RankListView) : RankListDetailContract.RankListPresenter { 13 | 14 | init { 15 | rankListDetailView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun rankListVideo(path: String, map: HashMap): Disposable 21 | = GetDataList.rankListVideo(path, map, object : CallBack { 22 | override fun onCompleted() = Unit 23 | 24 | override fun onError(e: Throwable?) = rankListDetailView.onRankListFail(e) 25 | 26 | override fun onNext(t: Result) = rankListDetailView.onRankListSucc(t) 27 | 28 | }) 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/RankListPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.RankList 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/12. 10 | */ 11 | 12 | class RankListPresenter(var rankListDetailView: RankListContract.RankListView) : RankListContract.RankListPresenter { 13 | 14 | init { 15 | rankListDetailView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun rankList(): Disposable = GetDataList.rankList(object : CallBack { 21 | override fun onCompleted() = Unit 22 | 23 | override fun onError(e: Throwable?) = rankListDetailView.onRankListFail(e) 24 | 25 | override fun onNext(t: RankList) = rankListDetailView.onRankListSucc(t) 26 | 27 | }) 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/RecommendContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | 12 | interface RecommendContract { 13 | interface RecommendPresenter : BasePresenter { 14 | fun allRec(page: Int): Disposable 15 | } 16 | 17 | interface RecommendView : BaseView { 18 | fun onRecommendSucc(result: Result) 19 | fun onRecommendFail(error: Throwable?) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/RecommendPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/7. 10 | */ 11 | class RecommendPresenter(var recommendView: RecommendContract.RecommendView) : RecommendContract.RecommendPresenter { 12 | 13 | init { 14 | recommendView.setPresenter(this) 15 | } 16 | 17 | override fun start() = Unit 18 | 19 | override fun allRec(page: Int): Disposable = GetDataList.allRec(page, object : CallBack { 20 | override fun onCompleted() = Unit 21 | 22 | override fun onError(e: Throwable?) = recommendView.onRecommendFail(e) 23 | 24 | override fun onNext(t: Result) = recommendView.onRecommendSucc(t) 25 | 26 | }) 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/SpecialTopicsContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/12. 10 | */ 11 | 12 | interface SpecialTopicsContract { 13 | 14 | interface SpecialTopicsPresenter : BasePresenter { 15 | fun specialTopics(start: Int, num: Int): Disposable 16 | } 17 | 18 | interface SpecialTopicsView : BaseView { 19 | fun onSpecialTopicsSucc(result: Result) 20 | fun onSpecialTopicsFail(throwable: Throwable?) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/SpecialTopicsPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/12. 10 | */ 11 | 12 | class SpecialTopicsPresenter(var specialTopicsView: SpecialTopicsContract.SpecialTopicsView) : SpecialTopicsContract.SpecialTopicsPresenter { 13 | 14 | init { 15 | specialTopicsView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun specialTopics(start: Int, num: Int): Disposable 21 | = GetDataList.specialTopics(start, num, object : CallBack { 22 | override fun onCompleted() = Unit 23 | 24 | override fun onError(e: Throwable?) = specialTopicsView.onSpecialTopicsFail(e) 25 | 26 | override fun onNext(t: Result) = specialTopicsView.onSpecialTopicsSucc(t) 27 | 28 | }) 29 | 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/TagIndexContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.TagIndex 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/13. 10 | */ 11 | 12 | interface TagIndexContract { 13 | 14 | interface TagIndexPresenter : BasePresenter { 15 | fun tagIndex(id: Int): Disposable 16 | } 17 | 18 | interface TagIndexView : BaseView { 19 | fun onTagIndexSucc(tagIndex: TagIndex) 20 | fun onTagIndexFail(throwable: Throwable?) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/home/mvp/TagIndexPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.home.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.TagIndex 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/13. 10 | */ 11 | 12 | class TagIndexPresenter(var tagIndexView: TagIndexContract.TagIndexView) : TagIndexContract.TagIndexPresenter { 13 | 14 | init { 15 | tagIndexView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun tagIndex(id: Int): Disposable = GetDataList.tagIndex(id, object : CallBack { 21 | override fun onCompleted() = Unit 22 | 23 | override fun onError(e: Throwable?) = tagIndexView.onTagIndexFail(e) 24 | 25 | override fun onNext(t: TagIndex) = tagIndexView.onTagIndexSucc(t) 26 | 27 | }) 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/mine/MineFragment.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.mine 2 | 3 | import android.widget.Toast 4 | import com.example.sdkmanager.PathDialog 5 | import com.example.sdkmanager.SdCardManager 6 | import com.moment.eyepetizer.R 7 | import com.moment.eyepetizer.base.BaseFragment 8 | import com.tbruyelle.rxpermissions2.RxPermissions 9 | import kotlinx.android.synthetic.main.mine_fragment.* 10 | 11 | /** 12 | * Created by moment on 2018/2/2. 13 | */ 14 | class MineFragment : BaseFragment() { 15 | override fun getLayoutId(): Int = R.layout.mine_fragment 16 | 17 | override fun initView() { 18 | ll_download.setOnClickListener { 19 | showPathDialog() 20 | } 21 | } 22 | 23 | override fun initData() = Unit 24 | 25 | private fun showPathDialog() { 26 | RxPermissions(activity) 27 | .request(android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 28 | .subscribe({ aBoolean -> 29 | if (aBoolean!!) { 30 | val dialog = PathDialog(activity) 31 | dialog.setOnPathChangeListener { 32 | getDownloadPath() 33 | dialog.dismiss() 34 | } 35 | dialog.show() 36 | dialog.setCanceledOnTouchOutside(true) 37 | } else { 38 | Toast.makeText(activity, "无此权限,无法打开此功能!", Toast.LENGTH_SHORT).show() 39 | } 40 | }) { } 41 | } 42 | 43 | private fun getDownloadPath() { 44 | if (SdCardManager.getInstance().isDiskNow) { 45 | val builder = StringBuilder(activity.getString(R.string.download_path_dialog_sdcard) + ":") 46 | builder.append(SdCardManager.getInstance().diskDownloadDir + "") 47 | tv_download.text = builder.toString() 48 | } else { 49 | val builder = StringBuilder(activity.getString(R.string.download_path_dialog_phone) + ":") 50 | builder.append(SdCardManager.getInstance().cacheDownloadDir + "") 51 | tv_download.text = builder.toString() 52 | } 53 | } 54 | 55 | override fun onResume() { 56 | super.onResume() 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/models/Item.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.models; 2 | 3 | /** 4 | * Created by bpncool on 2/23/2016. 5 | */ 6 | public class Item { 7 | 8 | private final String name; 9 | private final int id; 10 | 11 | public Item(String name, int id) { 12 | this.name = name; 13 | this.id = id; 14 | } 15 | 16 | public int getId() { 17 | return id; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/CallBack.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net 2 | 3 | /** 4 | * Created by moment on 16/5/24. 5 | */ 6 | 7 | interface CallBack { 8 | fun onCompleted() 9 | 10 | fun onError(e: Throwable?) 11 | 12 | fun onNext(t: T) 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/Banner.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | import java.util.* 4 | 5 | /** 6 | * Created by moment on 2018/2/2. 7 | */ 8 | 9 | class Banner { 10 | var dataType: String? = null 11 | var id: Int = 0 12 | var title: String? = null 13 | var description: String? = null 14 | var image: String? = null 15 | var actionUrl: String? = null 16 | var adTrack: String? = null 17 | var shade: String? = null 18 | var label: String? = null 19 | var labelList: Object? = null 20 | var header: String? = null 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/BriefCard.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/1. 5 | */ 6 | class BriefCard { 7 | var dataType: String? = null 8 | var id: Int = 0 9 | var icon: String? = null 10 | var iconType: String? = null 11 | var title: String? = null 12 | var subTitle: String? = null 13 | var description: String? = null 14 | var actionUrl: String? = null 15 | var adTrack: String? = null 16 | var ifPgc: Boolean = false 17 | var follow: Follow? = null 18 | 19 | class Follow { 20 | var itemType: String? = null 21 | var itemId: Int = 0 22 | var followed: Boolean = false 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/Categories.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/2. 5 | */ 6 | 7 | class Categories { 8 | var id: Long = 0 9 | var name: String? = null 10 | var alias: String? = null 11 | var description: String? = null 12 | var bgPicture: String? = null 13 | var bgColor: String? = null 14 | var headerImage: String? = null 15 | var defaultAuthorId: String? = null 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/CategoryInfo.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/11. 5 | */ 6 | 7 | class CategoryInfo { 8 | 9 | var categoryInfo: CategoryInfo? = null 10 | var tabInfo: TabInfo? = null 11 | 12 | class CategoryInfo { 13 | var dataType: String? = null 14 | var id: Long? = null 15 | var name: String? = null 16 | var description: String? = null 17 | var headerImage: String? = null 18 | var actionUrl: String? = null 19 | var follow: Follow? = null 20 | 21 | } 22 | 23 | class Follow { 24 | var itemType: String? = null 25 | var itemId: Int? = null 26 | var followed: Boolean = false 27 | } 28 | 29 | class TabInfo { 30 | var defaultIdx: Int? = 0 31 | var tabList: List? = null 32 | 33 | } 34 | 35 | class TabList { 36 | var id: Int = 0 37 | var name: String? = null 38 | var apiUrl: String? = null 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/DynamicInfoCard.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | import android.util.Log 4 | 5 | /** 6 | * Created by moment on 2018/2/1. 7 | */ 8 | 9 | class DynamicInfoCard { 10 | var dataType: String? = null 11 | var dynamicType: String? = null 12 | var text: String? = null 13 | var actionUrl: String? = null 14 | var user: User? = null 15 | var createDate: Long = 0 16 | var simpleVideo: SimpleVideo? = null 17 | var reply: Reply? = null 18 | 19 | class Reply { 20 | var id: Long = 0 21 | var videoId: Long = 0 22 | var videoTitle: String? = null 23 | var message: String? = null 24 | var likeCount: Long = 0 25 | var showConversationButton: Boolean = false 26 | var parentReplyId: Int = 0 27 | var rootReplyId: Long = 0 28 | } 29 | 30 | class SimpleVideo { 31 | var id: Long = 0 32 | var title: String? = null 33 | var description: String? = null 34 | var cover: FollowCard.Cover? = null 35 | var category: String? = null 36 | var playUrl: String? = null 37 | var duration: Long = 0 38 | var releaseTime: Long = 0 39 | } 40 | 41 | class User { 42 | var uid: Long = 0 43 | var nickname: String? = null 44 | var avatar: String? = null 45 | var userType: String? = null 46 | var ifPgc: Boolean = false 47 | var description: String? = null 48 | var area: String? = null 49 | var gender: String? = null 50 | var registDate: Long = 0 51 | var cover: String? = null 52 | var actionUrl: String? = null 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/HorizontalScrollCard.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/1. 5 | */ 6 | class HorizontalScrollCard { 7 | var dataType: String? = null 8 | var count: Int = 0 9 | var itemList: ItemList? = null 10 | 11 | 12 | class ItemList { 13 | var type: String? = null 14 | var tag: String? = null 15 | var id: Int = 0 16 | var adIndex: Int = 0 17 | var data: Data? = null 18 | } 19 | 20 | class Data { 21 | var dataType: String? = null 22 | var id: Int = 0 23 | var title: String? = null 24 | var description: String? = null 25 | var image: String? = null 26 | var actionUrl: String? = null 27 | var adTrack: String? = null 28 | var shade: Boolean = false 29 | var labelList: List? = null 30 | var label: Label? = null 31 | var header: Header? = null 32 | } 33 | 34 | class Label { 35 | var text: String? = null 36 | var card: String? = null 37 | var detail: String? = null 38 | } 39 | 40 | class Header { 41 | var id: Int = 0 42 | var title: String? = null 43 | var font: String? = null 44 | var subTitle: String? = null 45 | var subTitleFont: String? = null 46 | var textAlign: String? = null 47 | var cover: String? = null 48 | var label: String? = null 49 | var actionUrl: String? = null 50 | var labelList: String? = null 51 | var icon: String? = null 52 | var description: String? = null 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/RankList.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/12. 5 | */ 6 | 7 | class RankList { 8 | 9 | var tabInfo: TabInfo? = null 10 | 11 | class TabInfo { 12 | var defaultIdx: Int = 0 13 | var tabList: List? = null 14 | } 15 | 16 | class TabList { 17 | var id: Int = 0 18 | var name: String? = null 19 | var apiUrl: String? = null 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/Result.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | import org.json.JSONObject 4 | import java.util.* 5 | 6 | /** 7 | * Created by moment on 2018/2/1. 8 | */ 9 | 10 | class Result { 11 | var itemList: List? = null 12 | var count: Int = 0 13 | var total: Int = 0 14 | var nextPageUrl: String? = null 15 | var adExist: Boolean = false 16 | var updateTime: Object? = null 17 | var refreshCount: Int? = 0 18 | var lastStartId: Int? = 0 19 | 20 | class ItemList { 21 | var type: String? = null 22 | var tag: String? = null 23 | var id: Int = 0 24 | var adIndex: Int = 0 25 | /** 26 | * horizontalScrollCard、textCard、briefCard、followCard、 27 | * videoSmallCard、squareCardCollection、videoCollectionWithBrief、DynamicInfoCard、 28 | * banner 29 | */ 30 | var data: Any? = null 31 | 32 | override fun toString(): String { 33 | return "ItemList(type=$type, tag=$tag, id=$id, adIndex=$adIndex, data=$data)" 34 | } 35 | 36 | 37 | } 38 | 39 | override fun toString(): String { 40 | return "Discovery(itemList=${itemList.toString()}, count=$count, total=$total, nextPageUrl=$nextPageUrl, adExist=$adExist)" 41 | } 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/SquareCardCollection.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/1. 5 | */ 6 | 7 | class SquareCardCollection { 8 | var dataType: String? = null 9 | var header: FollowCard.Header? = null 10 | var itemList: List? = null 11 | var count: Int = 0 12 | var adTrack: String? = null 13 | 14 | class ItemList { 15 | var type: String? = null 16 | var tag: String? = null 17 | var id: Int = 0 18 | var adIndex: Int = 0 19 | var data: Data? = null 20 | } 21 | 22 | class Data { 23 | var dataType: String? = null 24 | var id: Int = 0 25 | var title: String? = null 26 | var description: String? = null 27 | var image: String? = null 28 | var actionUrl: String? = null 29 | var adTrack: String? = null 30 | var shade: Boolean = false 31 | var header: String? = null 32 | var label: Label? = null 33 | var labelList: List? = null 34 | } 35 | 36 | class Label { 37 | var text: String? = null 38 | var card: String? = null 39 | var detail: String? = null 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/TagIndex.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/13. 5 | */ 6 | 7 | class TagIndex { 8 | 9 | var tabInfo: TabInfo? = null 10 | var tagInfo: TagInfo? = null 11 | 12 | class TabInfo { 13 | var defaultIdx: Int = 0 14 | var tabList: List? = null 15 | } 16 | 17 | class TabList { 18 | var id: Int = 0 19 | var name: String? = null 20 | var apiUrl: String? = null 21 | } 22 | 23 | class TagInfo { 24 | var dataType: String? = null 25 | var id: Int = 0 26 | var name: String? = null 27 | var description: String? = null 28 | var headerImage: String? = null 29 | var bgPicture: String? = null 30 | var actionUrl: String? = null 31 | var recType: Int = 0 32 | var tagFollowCount: Int = 0 33 | var tagVideoCount: Int = 0 34 | var tagDynamicCount: Int = 0 35 | var follow: Follow? = null 36 | } 37 | 38 | class Follow { 39 | var itemType: String? = null 40 | var itemId: Int = 0 41 | var followed: Boolean = false 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/TextCard.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/1. 5 | */ 6 | class TextCard { 7 | var dataType: String? = null 8 | var id: Int = 0 9 | var type: String? = null 10 | var text: String? = null 11 | var subTitle: String? = null 12 | var actionUrl: String? = null 13 | var adTrack: String? = null 14 | var follow: String? = null 15 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/VideoCollectionWithBrief.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/1. 5 | */ 6 | 7 | class VideoCollectionWithBrief { 8 | var dataType: String? = null 9 | var header: Header? = null 10 | var itemList: List? = null 11 | var count: Int = 0 12 | var adTrack: String? = null 13 | 14 | 15 | class ItemList { 16 | var type: String? = null 17 | var tag: String? = null 18 | var id: Int = 0 19 | var adIndex: Int = 0 20 | var data: FollowCard.Data? = null 21 | } 22 | 23 | class Header { 24 | var id: Int = 0 25 | var icon: String? = null 26 | var iconType: String? = null 27 | var title: String? = null 28 | var subTitle: String? = null 29 | var description: String? = null 30 | var actionUrl: String? = null 31 | var adTrack: String? = null 32 | var follow: Follow? = null 33 | var ifPgc: Boolean = false 34 | 35 | } 36 | 37 | class Follow { 38 | var itemType: String? = null 39 | var itemId: Int = 0 40 | var followed: Int = 0 41 | } 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/net/entity/VideoSmallCard.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.net.entity 2 | 3 | /** 4 | * Created by moment on 2018/2/1. 5 | */ 6 | 7 | class VideoSmallCard { 8 | 9 | var dataType: String? = null 10 | var id: Long = 0 11 | var title: String? = null 12 | var slogan: String? = null 13 | var description: String? = null 14 | var provider: Provider? = null 15 | var category: String? = null 16 | var cover: FollowCard.Cover? = null 17 | var playUrl: String? = null 18 | var thumbPlayUrl: String? = null 19 | var duration: Long = 0 20 | var webUrl: WebUrl? = null 21 | var releaseTime: Long = 0 22 | var library: String? = null 23 | var playInfo: List? = null 24 | var consumption: FollowCard.Consumption? = null 25 | var campaign: String? = null 26 | var waterMarks: String? = null 27 | var adTrack: String? = null 28 | var tags: List? = null 29 | var type: String? = null 30 | var titlePgc: String? = null 31 | var descriptionPgc: String? = null 32 | var remark: String? = null 33 | var idx: Int = 0 34 | var shareAdTrack: String? = null 35 | var favoriteAdTrack: String? = null 36 | var webAdTrack: String? = null 37 | var date: Long = 0 38 | var promotion: String? = null 39 | var label: String? = null 40 | var labelList: List? = null 41 | var descriptionEditor: String? = null 42 | var collected: Boolean = false 43 | var played: Boolean = false 44 | var subtitles: List? = null 45 | var lastViewTime: String? = null 46 | var playlists: String? = null 47 | var src: String? = null 48 | 49 | 50 | class WebUrl { 51 | var raw: String? = null 52 | var forWeibo: String? = null 53 | } 54 | 55 | class Author { 56 | var id: Int = 0 57 | var icon: String? = null 58 | var name: String? = null 59 | var description: String? = null 60 | var link: String? = null 61 | var latestReleaseTime: Long = 0 62 | var videoNum: Int = 0 63 | var adTrack: String? = null 64 | var follow: FollowCard.Follow? = null 65 | var shield: FollowCard.Shield? = null 66 | var approvedNotReadyVideoCount: Int = 0 67 | var ifPgc: Boolean = false 68 | } 69 | 70 | class Provider { 71 | var name: String? = null 72 | var alias: String? = null 73 | var icon: String? = null 74 | } 75 | 76 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/notification/NotificationFragment.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.notification 2 | 3 | import android.content.Intent 4 | import android.graphics.Typeface 5 | import com.moment.eyepetizer.R 6 | import com.moment.eyepetizer.base.BaseFragment 7 | import com.moment.eyepetizer.search.SearchActivity 8 | import kotlinx.android.synthetic.main.notification_fragment.* 9 | 10 | /** 11 | * Created by moment on 2018/2/2. 12 | */ 13 | class NotificationFragment : BaseFragment() { 14 | override fun getLayoutId(): Int = R.layout.notification_fragment 15 | 16 | override fun initView() { 17 | tv_bar_title.typeface = Typeface.createFromAsset(activity.assets, "fonts/Lobster-1.4.otf") 18 | } 19 | 20 | override fun initData() = iv_search.setOnClickListener { 21 | var intent = Intent(activity, SearchActivity::class.java) 22 | startActivity(intent) 23 | activity.overridePendingTransition(R.anim.slide_in_bottom, R.anim.slide_in_top) 24 | } 25 | 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/search/mvp/SearchContract.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.search.mvp 2 | 3 | import com.cn.maimeng.news.base.BasePresenter 4 | import com.cn.maimeng.news.base.BaseView 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/8. 10 | */ 11 | 12 | interface SearchContract { 13 | 14 | interface SearchPresenter : BasePresenter { 15 | fun search(start: Int, num: Int, search: String): Disposable 16 | } 17 | 18 | interface SearchView : BaseView { 19 | fun onSearchSucc(result: Result) 20 | } 21 | 22 | interface SearchHotPresenter : BasePresenter { 23 | fun hot(): Disposable 24 | } 25 | 26 | interface SearchHotView : BaseView { 27 | fun onHotSucc(tags: List) 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/search/mvp/SearchHotPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.search.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import io.reactivex.disposables.Disposable 6 | 7 | /** 8 | * Created by moment on 2018/2/8. 9 | */ 10 | 11 | class SearchHotPresenter(var searchView: SearchContract.SearchHotView) : SearchContract.SearchHotPresenter { 12 | 13 | init { 14 | searchView.setPresenter(this) 15 | } 16 | 17 | override fun start() = Unit 18 | 19 | override fun hot(): Disposable = GetDataList.hot(object : CallBack> { 20 | override fun onCompleted() = Unit 21 | 22 | override fun onError(e: Throwable?) = Unit 23 | 24 | override fun onNext(t: List) = searchView.onHotSucc(t) 25 | 26 | }) 27 | 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/search/mvp/SearchPresenter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.search.mvp 2 | 3 | import com.moment.eyepetizer.net.CallBack 4 | import com.moment.eyepetizer.net.GetDataList 5 | import com.moment.eyepetizer.net.entity.Result 6 | import io.reactivex.disposables.Disposable 7 | 8 | /** 9 | * Created by moment on 2018/2/8. 10 | */ 11 | 12 | class SearchPresenter(var searchView: SearchContract.SearchView) : SearchContract.SearchPresenter { 13 | 14 | init { 15 | searchView.setPresenter(this) 16 | } 17 | 18 | override fun start() = Unit 19 | 20 | override fun search(start: Int, num: Int, search: String): Disposable = GetDataList.search(start, num, search, object : CallBack { 21 | override fun onCompleted() = Unit 22 | 23 | override fun onError(e: Throwable?) = Unit 24 | 25 | override fun onNext(t: Result) = searchView.onSearchSucc(t) 26 | 27 | }) 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/AppBarStateChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils; 2 | 3 | import android.support.design.widget.AppBarLayout; 4 | 5 | /** 6 | * Created by moment on 2018/2/11. 7 | */ 8 | 9 | public abstract class AppBarStateChangeListener implements AppBarLayout.OnOffsetChangedListener { 10 | 11 | public enum State { 12 | EXPANDED, 13 | COLLAPSED, 14 | IDLE 15 | } 16 | 17 | private State mCurrentState = State.IDLE; 18 | 19 | @Override 20 | public final void onOffsetChanged(AppBarLayout appBarLayout, int i) { 21 | if (i == 0) { 22 | if (mCurrentState != State.EXPANDED) { 23 | onStateChanged(appBarLayout, State.EXPANDED); 24 | } 25 | mCurrentState = State.EXPANDED; 26 | } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) { 27 | if (mCurrentState != State.COLLAPSED) { 28 | onStateChanged(appBarLayout, State.COLLAPSED); 29 | } 30 | mCurrentState = State.COLLAPSED; 31 | } else { 32 | if (mCurrentState != State.IDLE) { 33 | onStateChanged(appBarLayout, State.IDLE); 34 | } 35 | mCurrentState = State.IDLE; 36 | } 37 | } 38 | 39 | public abstract void onStateChanged(AppBarLayout appBarLayout, State state); 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/CommonTools.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | import android.content.Context 4 | import android.util.Base64 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import android.view.WindowManager 8 | import android.widget.AdapterView 9 | import com.moment.eyepetizer.net.entity.Result 10 | import java.io.UnsupportedEncodingException 11 | 12 | /** 13 | * Created by moment on 2018/2/9. 14 | */ 15 | fun getScreenWidth(context: Context): Int { 16 | val wm = context 17 | .getSystemService(Context.WINDOW_SERVICE) as WindowManager 18 | return wm.defaultDisplay.width 19 | } 20 | 21 | fun getScreenHeight(context: Context): Int { 22 | val wm = context 23 | .getSystemService(Context.WINDOW_SERVICE) as WindowManager 24 | return wm.defaultDisplay.height 25 | } 26 | 27 | fun getMultiType(position: Int, datas: ArrayList): Int { 28 | var type: String = datas!![position].type!! 29 | return type.hashCode() 30 | } 31 | 32 | fun unbindDrawables(view: View) { 33 | if (view.getBackground() != null) { 34 | view.getBackground().setCallback(null) 35 | } 36 | if (view is ViewGroup && view !is AdapterView<*>) { 37 | for (i in 0 until (view as ViewGroup).childCount) { 38 | unbindDrawables((view as ViewGroup).getChildAt(i)) 39 | } 40 | (view as ViewGroup).removeAllViews() 41 | } 42 | } 43 | 44 | val UTF_8 = "utf-8" 45 | 46 | /** 47 | * 编码字符串 48 | * 49 | * @param data 待编码字符串 50 | * @return 结果字符串 51 | */ 52 | fun encodeToString(data: String?): String? { 53 | try { 54 | if (data != null) { 55 | return encodeToString(data.toByteArray(charset(UTF_8))) 56 | } 57 | } catch (e: UnsupportedEncodingException) { 58 | //never in 59 | e.printStackTrace() 60 | } 61 | 62 | return null 63 | } 64 | 65 | /** 66 | * 编码数据 67 | * 68 | * @param data 字节数组 69 | * @return 结果字符串 70 | */ 71 | fun encodeToString(data: ByteArray): String { 72 | return Base64.encodeToString(data, Base64.URL_SAFE or Base64.NO_WRAP) 73 | } 74 | 75 | /** 76 | * 解码数据 77 | * 78 | * @param data 编码过的字符串 79 | * @return 原始数据 80 | */ 81 | fun decode(data: String?): ByteArray { 82 | return Base64.decode(data, Base64.URL_SAFE or Base64.NO_WRAP) 83 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/Constant.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | /** 4 | * Created by moment on 2018/2/1. 5 | */ 6 | 7 | object Constant { 8 | val BASE_URL = "http://baobab.kaiyanapp.com/" 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/DensityUtil.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | import android.content.Context 4 | 5 | /** 6 | * Created by moment on 16/5/26. 7 | */ 8 | class DensityUtil { 9 | companion object { 10 | 11 | fun dip2px(context: Context, dpValue: Float): Int { 12 | val scale = context.resources.displayMetrics.density 13 | return (dpValue * scale + 0.5f).toInt() 14 | } 15 | 16 | fun px2dip(context: Context, pxValue: Float): Int { 17 | val scale = context.resources.displayMetrics.density 18 | return (pxValue / scale + 0.5f).toInt() 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/DiskCacheMoudle.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | import android.content.Context 4 | import com.bumptech.glide.GlideBuilder 5 | import com.bumptech.glide.annotation.GlideModule 6 | import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool 7 | import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory 8 | import com.bumptech.glide.load.engine.cache.LruResourceCache 9 | import com.bumptech.glide.load.engine.cache.MemorySizeCalculator 10 | import com.bumptech.glide.module.AppGlideModule 11 | 12 | 13 | /** 14 | * Created by moment on 2018/2/7. 15 | */ 16 | @GlideModule 17 | class DiskCacheModule : AppGlideModule() { 18 | override fun applyOptions(context: Context, builder: GlideBuilder) { 19 | var calculator = MemorySizeCalculator.Builder(context.applicationContext) 20 | .setMemoryCacheScreens(2f) 21 | .build() 22 | val calculatorBitmap = MemorySizeCalculator.Builder(context) 23 | .setBitmapPoolScreens(3f) 24 | .build() 25 | val diskCacheSizeBytes = 1024 * 1024 * 100 // 100 MB 26 | builder.setDiskCache(InternalCacheDiskCacheFactory(context.applicationContext, "glideImageCache", diskCacheSizeBytes.toLong())) 27 | .setMemoryCache(LruResourceCache(calculator.memoryCacheSize.toLong())) 28 | .setBitmapPool(LruBitmapPool(calculatorBitmap.bitmapPoolSize.toLong())) 29 | } 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/ItemTouchHelperAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | /** 4 | * Created by moment on 2018/3/7. 5 | */ 6 | 7 | interface ItemTouchHelperAdapter { 8 | fun onItemMove(fromPosition: Int, toPosition: Int): Boolean 9 | fun onItemDismiss(position: Int) 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/ItemTouchHelperViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | /** 4 | * Created by moment on 2018/3/7. 5 | */ 6 | 7 | interface ItemTouchHelperViewHolder { 8 | fun onItemSelected() 9 | fun onItemClear() 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/MyGlideModule.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | import android.content.Context 4 | import com.bumptech.glide.Glide 5 | import com.bumptech.glide.Registry 6 | import com.bumptech.glide.annotation.GlideModule 7 | import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader 8 | import com.bumptech.glide.load.model.GlideUrl 9 | import com.bumptech.glide.module.LibraryGlideModule 10 | import java.io.InputStream 11 | 12 | /** 13 | * Created by moment on 2018/2/7. 14 | */ 15 | 16 | @GlideModule 17 | class MyGlideModule : LibraryGlideModule() { 18 | override fun registerComponents(context: Context, glide: Glide, registry: Registry) { 19 | registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory()) 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/moment/eyepetizer/utils/TabSwitchAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer.utils 2 | 3 | import android.support.v7.widget.RecyclerView 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import android.widget.ImageView 7 | import android.widget.TextView 8 | import kotlinx.android.synthetic.main.tab_switch_item.view.* 9 | import android.view.LayoutInflater 10 | import com.moment.eyepetizer.R 11 | import com.moment.eyepetizer.net.entity.Categories 12 | import java.util.* 13 | 14 | 15 | /** 16 | * Created by moment on 2018/3/7. 17 | */ 18 | class TabSwitchAdapter(var data: ArrayList) : RecyclerView.Adapter(), ItemTouchHelperAdapter { 19 | override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean { 20 | Collections.swap(datas, fromPosition, toPosition) 21 | notifyItemMoved(fromPosition, toPosition) 22 | return true 23 | } 24 | 25 | override fun onItemDismiss(position: Int) { 26 | datas.removeAt(position) 27 | notifyItemRemoved(position) 28 | } 29 | 30 | private var datas: ArrayList = data 31 | 32 | fun clearAll() = this.datas.clear() 33 | 34 | fun addAll(data: ArrayList?) { 35 | if (data == null) { 36 | return 37 | } 38 | this.datas.addAll(data) 39 | } 40 | 41 | override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { 42 | val view = LayoutInflater.from(parent!!.context).inflate(R.layout.tab_switch_item, parent, false) 43 | return ItemTabSwitchHolder(view) 44 | } 45 | 46 | 47 | override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder?, position: Int) { 48 | var categorie = datas[position] 49 | var holder = viewHolder as ItemTabSwitchHolder 50 | holder.tv_tab_title!!.text = "#" + categorie.name 51 | holder.tv_tab_des!!.text = categorie.description 52 | ImageLoad().loadRound(categorie.headerImage!!, holder.iv_tab_switch_icon, 2) 53 | } 54 | 55 | override fun getItemCount(): Int { 56 | return datas.size 57 | } 58 | 59 | 60 | class ItemTabSwitchHolder(itemView: View) : RecyclerView.ViewHolder(itemView), ItemTouchHelperViewHolder { 61 | override fun onItemSelected() { 62 | 63 | } 64 | 65 | override fun onItemClear() { 66 | } 67 | 68 | var iv_tab_switch_icon: ImageView? = itemView.iv_tab_switch_icon 69 | var tv_tab_title: TextView? = itemView.tv_tab_title 70 | var tv_tab_des: TextView? = itemView.tv_tab_des 71 | } 72 | 73 | 74 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/color/default_text_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/color/theme_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/action_download_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/action_download_cut.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/btn_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/btn_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/default_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/default_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/ic_action_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_back_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/ic_action_back_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/ic_action_focus.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_search_no_padding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/ic_action_search_no_padding.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_grey_heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/ic_grey_heart.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_menu_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/ic_menu_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/icon_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/icon_close.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/icon_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/icon_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/menu_download_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-hdpi/menu_download_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/action_download_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/action_download_cut.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/btn_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/btn_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/ic_action_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_back_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/ic_action_back_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/ic_action_focus.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_search_no_padding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/ic_action_search_no_padding.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_grey_heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/ic_grey_heart.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_menu_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/ic_menu_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/icon_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/icon_close.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/icon_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/icon_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/menu_download_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-mdpi/menu_download_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/action_download_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/action_download_cut.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/btn_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/btn_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_action_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_back_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_action_back_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_action_focus.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_search_no_padding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_action_search_no_padding.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_grey_heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_grey_heart.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_down_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_down_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_up_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_up_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_menu_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/ic_menu_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/icon_close.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/icon_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/menu_download_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xhdpi/menu_download_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/action_download_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/action_download_cut.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/all_category_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/all_category_img.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/blur.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/blur.jpeg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/btn_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/btn_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/default_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/default_banner.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/drag_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/drag_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/goto_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/goto_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_account_login_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_account_login_header.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_action_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_back_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_action_back_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_action_focus.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_focus_white_no_margin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_action_focus_white_no_margin.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_search_no_padding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_action_search_no_padding.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_grey_heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_grey_heart.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_menu_more.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_menu_more.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_category.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_category.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_category_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_category_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_feed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_feed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_feed_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_feed_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_follow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_follow.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_follow_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_follow_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_profile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_profile_selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/ic_tab_strip_icon_profile_selected.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/icon_close.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/icon_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/landing_background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/landing_background.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/menu_download_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/menu_download_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/no_account_tip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/drawable-xxhdpi/no_account_tip.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_auto_shap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_banner2_shap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_search_shap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_shap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_shap_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_shap_time.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_shap_txt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tab_strip_icon_category_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tab_strip_icon_feed_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tab_strip_icon_follow_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tab_strip_icon_profile_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/image_circle_shap.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 11 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_section_toggle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/theme_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 13 | 21 | 22 | 33 | 34 | 45 | 46 | 57 | 58 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_mains.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_recycler_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/ad_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 19 | 20 | 27 | 28 | 37 | 38 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/res/layout/banner2_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/banner_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/categories_all_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 19 | 20 | 26 | 27 | 37 | 38 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/category_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/category_taglist_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/discovery_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/discuss_list_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 19 | 20 | 26 | 27 | 37 | 38 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/empty_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/feed_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/follow_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 19 | 20 | 30 | 31 | 40 | 41 | 42 | 50 | 51 | 56 | 57 | 58 | 59 | 60 | 64 | 65 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /app/src/main/res/layout/followcard_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 13 | 14 | 18 | 19 | 31 | 32 | 33 | 38 | 39 | 45 | 46 | 51 | 52 | 60 | 61 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /app/src/main/res/layout/horizontal_scrollcard_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_section.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 27 | 28 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/ranklist_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 22 | 23 | 31 | 32 | 33 | 34 | 49 | 50 | 56 | 57 | 58 | 63 | 64 | -------------------------------------------------------------------------------- /app/src/main/res/layout/ranklist_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/recommend_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/rectangle_card_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | 13 | 19 | 20 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/search_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 16 | 17 | 18 | 26 | 27 | 36 | 37 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/special_topics_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 19 | 20 | 26 | 27 | 37 | 38 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/square_card_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 19 | 20 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/squarecard_collection_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 24 | 25 | 33 | 34 | 40 | 41 | 42 | 43 | 49 | 50 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/layout/tab_switch_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 22 | 23 | 34 | 35 | 41 | 42 | 48 | -------------------------------------------------------------------------------- /app/src/main/res/layout/tab_switch_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 26 | 27 | 34 | 35 | 41 | 42 | 43 | 44 | 53 | 54 | 61 | 62 | -------------------------------------------------------------------------------- /app/src/main/res/layout/tagindex_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/text_card_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 16 | 17 | 24 | 25 | 33 | 34 | 35 | 43 | 44 | 53 | 54 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /app/src/main/res/layout/text_footer_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 24 | 25 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/text_header_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/video_collection_recycler_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 23 | 24 | 36 | 37 | 38 | 48 | 49 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/video_smallcard_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | 22 | 23 | 35 | 36 | 37 | 44 | 45 | 52 | 53 | 61 | 62 | 63 | 64 | 65 | 72 | 73 | -------------------------------------------------------------------------------- /app/src/main/res/layout/videocollection_ofhoriscroll_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 24 | 25 | 33 | 34 | 35 | 36 | 42 | 43 | 44 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/web_profile_webview.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 22 | 23 | 34 | 35 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/daily_label.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xxhdpi/daily_label.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_action_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xxhdpi/ic_action_back.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 100dp 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | 7dp 7 | 20sp 8 | 100dp 9 | 3dp 10 | 11 | 15dp 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Eyepetizer 3 | 暂不支持的类型 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 15 | 16 | 17 | 25 | 26 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/test/java/com/moment/eyepetizer/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.moment.eyepetizer; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.2.20' 5 | repositories { 6 | maven { url 'https://maven.google.com' } 7 | jcenter() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.0.1' 11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | maven { url "https://jitpack.io" } 21 | maven { url 'https://maven.google.com' } 22 | jcenter() 23 | } 24 | } 25 | 26 | task clean(type: Delete) { 27 | delete rootProject.buildDir 28 | } 29 | -------------------------------------------------------------------------------- /compiler/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /compiler/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'java' 2 | 3 | dependencies { 4 | implementation fileTree(include: ['*.jar'], dir: 'libs') 5 | compile 'com.squareup:javapoet:1.8.0' 6 | compile 'com.google.auto.service:auto-service:1.0-rc3' 7 | implementation project(':annotatiom') 8 | } 9 | 10 | sourceCompatibility = "1.7" 11 | targetCompatibility = "1.7" 12 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 27 16:28:55 CST 2018 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /img/download_dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/download_dialog.png -------------------------------------------------------------------------------- /img/download_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/download_path.png -------------------------------------------------------------------------------- /img/guanzhu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/guanzhu.png -------------------------------------------------------------------------------- /img/meitu_detai_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/meitu_detai_1.png -------------------------------------------------------------------------------- /img/meitu_detail_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/meitu_detail_0.png -------------------------------------------------------------------------------- /img/meitu_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/meitu_list.png -------------------------------------------------------------------------------- /img/meitu_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/meitu_preview.png -------------------------------------------------------------------------------- /img/shouye-faxian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/shouye-faxian.png -------------------------------------------------------------------------------- /img/shouye-guanggao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/shouye-guanggao.png -------------------------------------------------------------------------------- /img/shouye-tuijian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/shouye-tuijian.png -------------------------------------------------------------------------------- /img/sousuo-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/sousuo-error.png -------------------------------------------------------------------------------- /img/sousuo-succ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/sousuo-succ.png -------------------------------------------------------------------------------- /img/sousuo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/sousuo.png -------------------------------------------------------------------------------- /img/tab_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/tab_1.png -------------------------------------------------------------------------------- /img/tab_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/tab_2.png -------------------------------------------------------------------------------- /img/tongzhi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/tongzhi.png -------------------------------------------------------------------------------- /img/wode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jeff-liu14/Eyepetizer/bc26c764ef05e99efd33a6f9754566709af2b3e7/img/wode.png -------------------------------------------------------------------------------- /release_kaiyan.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | 4 | #### 测试渠道 5 | pack_debug_fun() { 6 | ./gradlew assembleDebug 7 | } 8 | 9 | ### 预发布渠道 10 | pack_uat_fun() { 11 | adb install app/build/outputs/apk/release/kaiyan-1.0.apk 12 | adb shell am start -n com.moment.eyepetizer/com.moment.eyepetizer.ad.AdActivity 13 | } 14 | 15 | ### 正式渠道 16 | pack_release_fun() { 17 | ./gradlew assembleRelease 18 | } 19 | 20 | #### 帮助 21 | if [[ "$1" == "-h" ]] || [[ "$1" == "-help" ]] 22 | then 23 | echo "-d,-debug : 打正式测试渠道包" 24 | echo "-u,-uat : 打正式预发布渠道包" 25 | echo "-r,-release : 打正式渠道包" 26 | echo "如果打当前渠道使用命令 : ./gradlew assembleRelease" 27 | exit 0 28 | fi 29 | 30 | #### 打测试debug渠道包 31 | if [[ "$1" == "-d" ]] || [[ "$1" == "-debug" ]] 32 | then 33 | pack_debug_fun 34 | exit 0 35 | fi 36 | 37 | #### 打测试uat渠道包 38 | if [[ "$1" == "-i" ]] || [[ "$1" == "-uat" ]] 39 | then 40 | pack_uat_fun 41 | exit 0 42 | fi 43 | 44 | #### 设置制定正式渠道 45 | if [[ "$1" == "-r" ]] || [[ "$1" == "-release" ]] 46 | then 47 | pack_release_fun 48 | exit 0 49 | fi 50 | 51 | echo "参数不存在" -------------------------------------------------------------------------------- /sdkmanager/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /sdkmanager/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 26 5 | 6 | 7 | 8 | defaultConfig { 9 | minSdkVersion 15 10 | targetSdkVersion 26 11 | versionCode 1 12 | versionName "1.0" 13 | 14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 15 | 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | 25 | } 26 | 27 | dependencies { 28 | implementation fileTree(dir: 'libs', include: ['*.jar']) 29 | 30 | implementation 'com.android.support:appcompat-v7:26.1.0' 31 | testImplementation 'junit:junit:4.12' 32 | androidTestImplementation 'com.android.support.test:runner:1.0.1' 33 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 34 | } 35 | -------------------------------------------------------------------------------- /sdkmanager/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /sdkmanager/src/androidTest/java/com/example/sdkmanager/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.sdkmanager; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.example.sdkmanager.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /sdkmanager/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /sdkmanager/src/main/java/com/example/sdkmanager/StorageUtils.java: -------------------------------------------------------------------------------- 1 | package com.example.sdkmanager; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | import android.os.Build; 6 | import android.text.TextUtils; 7 | 8 | import java.io.File; 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | import static android.os.Environment.getExternalStorageDirectory; 13 | 14 | /** 15 | * @author moment 16 | * @date 2018/3/22. 17 | */ 18 | 19 | public class StorageUtils { 20 | 21 | public static List getStorageInfos(Application application) { 22 | List list = StorageVolumeUtil.getVolumeList(application); 23 | List mountedList = new ArrayList<>(); 24 | if (list != null && !list.isEmpty()) { 25 | for (int i = 0; i < list.size(); i++) { 26 | if (list.get(i).isMounted(application)) { 27 | if (!TextUtils.isEmpty(list.get(i).mPath)) { 28 | mountedList.add(list.get(i)); 29 | } 30 | } 31 | } 32 | } 33 | return mountedList; 34 | } 35 | 36 | public static void createDir(Application application) { 37 | File[] files; 38 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 39 | files = application.getExternalFilesDirs("download"); 40 | for (File file : files) { 41 | if (!file.exists()) { 42 | file.mkdirs(); 43 | } 44 | } 45 | } 46 | File file = getExternalStorageDirectory(); 47 | if (!file.exists()) { 48 | file.mkdirs(); 49 | } 50 | 51 | File file1 = application.getExternalFilesDir("download"); 52 | if (!file1.exists()) { 53 | file1.mkdirs(); 54 | } 55 | 56 | File sdcard = new File(SdCardManager.getInstance().getDiskDownloadDir()); 57 | if (!sdcard.exists()) { 58 | sdcard.mkdirs(); 59 | } 60 | File cache = new File(SdCardManager.getInstance().getCacheDownloadDir()); 61 | if (!cache.exists()) { 62 | cache.mkdirs(); 63 | } 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /sdkmanager/src/main/java/com/example/sdkmanager/annotation/ViewById.java: -------------------------------------------------------------------------------- 1 | package com.example.sdkmanager.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Created by moment on 2018/7/3. 10 | */ 11 | 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Target(ElementType.FIELD) 14 | public @interface ViewById { 15 | int value(); 16 | } 17 | -------------------------------------------------------------------------------- /sdkmanager/src/main/java/com/example/sdkmanager/annotation/ViewUtils.java: -------------------------------------------------------------------------------- 1 | //package com.example.sdkmanager.annotation; 2 | // 3 | //import android.app.Activity; 4 | //import android.view.View; 5 | // 6 | //import java.lang.reflect.Field; 7 | // 8 | ///** 9 | // * Created by moment on 2018/7/3. 10 | // */ 11 | // 12 | //public class ViewUtils { 13 | // public static void inject(Activity activity) { 14 | // inject(new ViewFinder(activity), activity); 15 | // } 16 | // 17 | // // 兼容View 18 | // public static void inject(View view) { 19 | // inject(new ViewFinder(view), view); 20 | // } 21 | // 22 | // // 兼容Fragment 23 | // public static void inject(View view, Object object) { 24 | // inject(new ViewFinder(view), object); 25 | // } 26 | // 27 | // private static void inject(ViewFinder viewFinder, Object object) { 28 | // injectFiled(viewFinder, object); 29 | // injectEvent(viewFinder, object); 30 | // } 31 | // 32 | // // 注入事件 33 | // private static void injectEvent(ViewFinder viewFinder, Object object) { 34 | // 35 | // } 36 | // 37 | // /** 38 | // * 注入属性 39 | // */ 40 | // private static void injectFiled(ViewFinder viewFinder, Object object) { 41 | // // object --> activity or fragment or view 是反射的类 42 | // // viewFinder --> 只是一个view的findViewById的辅助类 43 | // 44 | // // 1. 获取所有的属性 45 | // Class clazz = object.getClass(); 46 | // // 获取所有属性包括私有和公有 47 | // Field[] fields = clazz.getDeclaredFields(); 48 | // 49 | // for (Field field : fields) { 50 | // // 2. 获取属性上面ViewById的值 51 | // ViewById viewById = field.getAnnotation(ViewById.class); 52 | // 53 | // if (viewById != null) { 54 | // // 获取ViewById属性上的viewId值 55 | // int viewId = viewById.value(); 56 | // // 3. 通过findViewById获取View 57 | // View view = viewFinder.findViewById(viewId); 58 | // 59 | // if (view != null) { 60 | // // 4. 反射注入View属性 61 | // // 设置所有属性都能注入包括私有和公有 62 | // field.setAccessible(true); 63 | // try { 64 | // field.set(object, view); 65 | // } catch (IllegalAccessException e) { 66 | // e.printStackTrace(); 67 | // } 68 | // } else { 69 | // throw new RuntimeException("Invalid @ViewInject for " 70 | // + clazz.getSimpleName() + "." + field.getName()); 71 | // } 72 | // } 73 | // } 74 | // } 75 | //} 76 | -------------------------------------------------------------------------------- /sdkmanager/src/main/res/drawable/path_dialog_shap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /sdkmanager/src/main/res/drawable/switch_path.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /sdkmanager/src/main/res/drawable/switch_path_off.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /sdkmanager/src/main/res/drawable/switch_path_on.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /sdkmanager/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | SDKManager 3 | 下载存储位置设置 4 | 手机内存 5 | 外置SD卡 6 | 7 | -------------------------------------------------------------------------------- /sdkmanager/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | -------------------------------------------------------------------------------- /sdkmanager/src/test/java/com/example/sdkmanager/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.example.sdkmanager; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':sdkmanager' 2 | --------------------------------------------------------------------------------