├── .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 | 
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 |
--------------------------------------------------------------------------------