├── .gitignore
├── Common
├── .gitignore
├── build.gradle
├── libs
│ └── tbs_sdk_thirdapp_v4.3.0.jar
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── gfd
│ │ └── common
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── common
│ │ │ ├── common
│ │ │ ├── AppManager.kt
│ │ │ ├── BaseApplication.kt
│ │ │ └── BaseConstant.kt
│ │ │ ├── dsl
│ │ │ └── EditorActionDSL.kt
│ │ │ ├── ext
│ │ │ ├── Common.kt
│ │ │ └── ViewExt.kt
│ │ │ ├── impl
│ │ │ └── DegradeServiceImpl.kt
│ │ │ ├── injection
│ │ │ ├── component
│ │ │ │ ├── ActivityComponent.kt
│ │ │ │ └── AppComponent.kt
│ │ │ ├── module
│ │ │ │ ├── ActivityMoudle.kt
│ │ │ │ └── AppMoudle.kt
│ │ │ └── scope
│ │ │ │ ├── ActivityScope.kt
│ │ │ │ └── PerComponentScope.kt
│ │ │ ├── mvp
│ │ │ ├── presenter
│ │ │ │ └── BasePresenter.kt
│ │ │ └── view
│ │ │ │ └── BaseView.kt
│ │ │ ├── ui
│ │ │ ├── activity
│ │ │ │ ├── BaseActivity.kt
│ │ │ │ └── BaseMvpActivity.kt
│ │ │ ├── adapter
│ │ │ │ ├── BaseAdapter.kt
│ │ │ │ ├── BaseMultiAdapter.kt
│ │ │ │ ├── BaseViewHolder.kt
│ │ │ │ └── MultiItemEntity.kt
│ │ │ └── fragment
│ │ │ │ ├── BaseFragment.kt
│ │ │ │ └── BaseMvpFragment.kt
│ │ │ ├── utils
│ │ │ ├── AppPrefsUtils.kt
│ │ │ ├── CodeUtils.kt
│ │ │ ├── FixedSpeedScroller.kt
│ │ │ ├── FormatUtil.kt
│ │ │ ├── GlideImageLoader.kt
│ │ │ ├── ImageLoader.kt
│ │ │ ├── MD5Utils.kt
│ │ │ ├── NetUtils.kt
│ │ │ ├── SoftKeyboardUtils.kt
│ │ │ └── ToastUtils.kt
│ │ │ └── widgets
│ │ │ ├── ProgressLoading.kt
│ │ │ ├── SpacesItemDecoration.kt
│ │ │ ├── SpanLookup.kt
│ │ │ ├── SpanLookupFactory.kt
│ │ │ └── StateView.kt
│ ├── jniLibs
│ │ └── armeabi
│ │ │ └── liblbs.so
│ └── res
│ │ ├── drawable-xxhdpi
│ │ ├── base_ic_net.webp
│ │ ├── common_ic_player_center_start.png
│ │ ├── ic_net_error.png
│ │ ├── ic_player_default.png
│ │ ├── icon_default.png
│ │ ├── light_progress_loading1.png
│ │ ├── light_progress_loading10.png
│ │ ├── light_progress_loading11.png
│ │ ├── light_progress_loading2.png
│ │ ├── light_progress_loading3.png
│ │ ├── light_progress_loading4.png
│ │ ├── light_progress_loading5.png
│ │ ├── light_progress_loading6.png
│ │ ├── light_progress_loading7.png
│ │ ├── light_progress_loading8.png
│ │ └── light_progress_loading9.png
│ │ ├── drawable
│ │ ├── progress_dialog_anim.xml
│ │ ├── progress_dialog_bg.xml
│ │ ├── sp_indicator_select.xml
│ │ └── sp_title_left.xml
│ │ ├── layout
│ │ ├── base_empty.xml
│ │ ├── base_loading.xml
│ │ ├── base_retry.xml
│ │ ├── layout_status_layout_manager_empty.xml
│ │ ├── layout_status_layout_manager_error.xml
│ │ ├── layout_status_layout_manager_loading.xml
│ │ └── progress_dialog.xml
│ │ ├── transition
│ │ └── explode.xml
│ │ ├── values-sw1024dp
│ │ └── dimens.xml
│ │ ├── values-sw1280dp
│ │ └── dimens.xml
│ │ ├── values-sw1365dp
│ │ └── dimens.xml
│ │ ├── values-sw384dp
│ │ └── dimens.xml
│ │ ├── values-sw392dp
│ │ └── dimens.xml
│ │ ├── values-sw400dp
│ │ └── dimens.xml
│ │ ├── values-sw410dp
│ │ └── dimens.xml
│ │ ├── values-sw411dp
│ │ └── dimens.xml
│ │ ├── values-sw432dp
│ │ └── dimens.xml
│ │ ├── values-sw480dp
│ │ └── dimens.xml
│ │ ├── values-sw533dp
│ │ └── dimens.xml
│ │ ├── values-sw592dp
│ │ └── dimens.xml
│ │ ├── values-sw600dp
│ │ └── dimens.xml
│ │ ├── values-sw640dp
│ │ └── dimens.xml
│ │ ├── values-sw662dp
│ │ └── dimens.xml
│ │ ├── values-sw720dp
│ │ └── dimens.xml
│ │ ├── values-sw768dp
│ │ └── dimens.xml
│ │ ├── values-sw800dp
│ │ └── dimens.xml
│ │ ├── values-sw811dp
│ │ └── dimens.xml
│ │ ├── values-sw820dp
│ │ └── dimens.xml
│ │ ├── values-sw960dp
│ │ └── dimens.xml
│ │ ├── values-sw961dp
│ │ └── dimens.xml
│ │ ├── values-v19
│ │ └── dimens.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── ids.xml
│ │ ├── strings.xml
│ │ ├── styles.xml
│ │ └── styles_base.xml
│ └── test
│ └── java
│ └── com
│ └── gfd
│ └── common
│ └── ExampleUnitTest.java
├── Crosstalk
├── .gitignore
├── build.gradle
├── gradle.properties
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── gfd
│ │ └── crosstalk
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ └── test.js
│ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── crosstalk
│ │ │ ├── adapter
│ │ │ └── VideoAdapter.kt
│ │ │ ├── component
│ │ │ ├── CrosstalkApplicationLike.kt
│ │ │ └── CrosstalkServiceImpl.kt
│ │ │ ├── entity
│ │ │ ├── CrosstalkVideoData.kt
│ │ │ └── Video.kt
│ │ │ ├── injection
│ │ │ ├── component
│ │ │ │ └── CrosstalkComponent.kt
│ │ │ └── moudle
│ │ │ │ └── CrosstalkModule.kt
│ │ │ ├── mvp
│ │ │ ├── contract
│ │ │ │ └── CrosstalkContract.kt
│ │ │ ├── presenter
│ │ │ │ └── CrosstalkPresenter.kt
│ │ │ └── service
│ │ │ │ ├── CrosstalkService.kt
│ │ │ │ └── impl
│ │ │ │ └── CrosstalkServiceImpl.kt
│ │ │ └── ui
│ │ │ ├── activity
│ │ │ ├── TextActivity.kt
│ │ │ └── WebViewActivity.kt
│ │ │ └── fragment
│ │ │ └── CrosstalkFragment.kt
│ └── res
│ │ ├── layout
│ │ ├── crosstalk_fragment_crosstalk.xml
│ │ ├── crosstalk_item_video.xml
│ │ ├── crosstalk_layout_player_control.xml
│ │ └── crosstalk_webview.xml
│ │ └── values
│ │ └── strings.xml
│ └── test
│ └── java
│ └── com
│ └── gfd
│ └── crosstalk
│ └── ExampleUnitTest.java
├── Home
├── .gitignore
├── build.gradle
├── gradle.properties
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── gfd
│ │ └── home
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── home
│ │ │ ├── adapter
│ │ │ ├── CategoryPagerAdapter.kt
│ │ │ ├── CategoryVideoAdapter.kt
│ │ │ ├── HistoryAdapter.kt
│ │ │ ├── MovieListAdapter.kt
│ │ │ ├── SearchDataAdapter.kt
│ │ │ └── VideoListAdapter.kt
│ │ │ ├── api
│ │ │ └── Api.kt
│ │ │ ├── common
│ │ │ └── Constant.kt
│ │ │ ├── component
│ │ │ ├── HomeApplicationLike.kt
│ │ │ └── HomeServiceImpl.kt
│ │ │ ├── db
│ │ │ ├── DatabaseOpenHelper.kt
│ │ │ ├── Tables.kt
│ │ │ └── ext
│ │ │ │ └── ContextExtensions.kt
│ │ │ ├── entity
│ │ │ ├── BannerData.kt
│ │ │ ├── MovieData.kt
│ │ │ ├── MovieEntity.java
│ │ │ ├── SearchItemData.kt
│ │ │ ├── VideoData.kt
│ │ │ ├── VideoItemData.kt
│ │ │ └── VideoListData.kt
│ │ │ ├── injection
│ │ │ ├── component
│ │ │ │ ├── CategoryComponent.kt
│ │ │ │ ├── MovieListComponent.kt
│ │ │ │ ├── SearchComponent.kt
│ │ │ │ └── VideoComponent.kt
│ │ │ └── module
│ │ │ │ ├── CategoryModule.kt
│ │ │ │ ├── MovieListModule.kt
│ │ │ │ ├── SearchModule.kt
│ │ │ │ └── VideoModule.kt
│ │ │ ├── mvp
│ │ │ ├── CategoryContract.kt
│ │ │ ├── MovieDetailContract.kt
│ │ │ ├── MovieListContract.kt
│ │ │ ├── SearchContract.kt
│ │ │ ├── VideoListContract.kt
│ │ │ └── presenter
│ │ │ │ ├── CategoryPresenter.kt
│ │ │ │ ├── MovieDetailPresenter.kt
│ │ │ │ ├── MovieListPresenter.kt
│ │ │ │ ├── SearchPresenter.kt
│ │ │ │ └── VideoPresenter.kt
│ │ │ ├── service
│ │ │ ├── CategoryService.kt
│ │ │ ├── MovieDetailService.kt
│ │ │ ├── MovieListService.kt
│ │ │ ├── SearchService.kt
│ │ │ ├── VideoService.kt
│ │ │ └── impl
│ │ │ │ ├── CateGoryServiceImpl.kt
│ │ │ │ ├── MovieListServiceImpl.kt
│ │ │ │ ├── SearchServiceImpl.kt
│ │ │ │ └── VideoServiceImpl.kt
│ │ │ └── ui
│ │ │ ├── activity
│ │ │ ├── CategoryActivity.kt
│ │ │ ├── MovieDetailActivity.kt
│ │ │ ├── MovieListActivity.kt
│ │ │ └── SearchActivity.kt
│ │ │ └── fragment
│ │ │ ├── CategoryFragment.kt
│ │ │ └── HomeFragment.kt
│ ├── res
│ │ ├── drawable-xxhdpi
│ │ │ ├── home_ic_arrow_down.png
│ │ │ ├── home_ic_delete.png
│ │ │ ├── home_ic_head_category01.webp
│ │ │ ├── home_ic_head_category02.webp
│ │ │ ├── home_ic_head_category03.webp
│ │ │ ├── home_ic_head_category04.webp
│ │ │ └── home_ic_search.png
│ │ ├── drawable
│ │ │ ├── home_sp_edit_search_bg.xml
│ │ │ ├── home_sp_indicator_select.xml
│ │ │ ├── home_sp_item_history_bg.xml
│ │ │ └── home_sp_item_search_btn.xml
│ │ ├── layout
│ │ │ ├── home_activity_category.xml
│ │ │ ├── home_activity_movie_detail.xml
│ │ │ ├── home_activity_movie_list.xml
│ │ │ ├── home_activity_serach.xml
│ │ │ ├── home_fragment_category.xml
│ │ │ ├── home_fragment_home.xml
│ │ │ ├── home_head_banner.xml
│ │ │ ├── home_item_home_video_list_img.xml
│ │ │ ├── home_item_home_video_list_title.xml
│ │ │ ├── home_item_movie_list.xml
│ │ │ ├── home_item_search.xml
│ │ │ ├── home_item_search_history.xml
│ │ │ ├── home_layout_search_empty.xml
│ │ │ ├── home_layout_serach_history.xml
│ │ │ └── home_layout_tab_home.xml
│ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ └── runalone
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── home
│ │ │ ├── TestActivity.kt
│ │ │ └── app
│ │ │ └── HomeApplication.kt
│ │ └── res
│ │ └── layout
│ │ └── home_activity_test.xml
│ └── test
│ └── java
│ └── com
│ └── gfd
│ └── home
│ └── ExampleUnitTest.java
├── Music
├── .gitignore
├── build.gradle
├── gradle.properties
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── gfd
│ │ └── music
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── aidl
│ │ └── com
│ │ │ └── gfd
│ │ │ └── music
│ │ │ └── IMusicService.aidl
│ ├── assets
│ │ └── radio.json
│ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── music
│ │ │ ├── adapter
│ │ │ ├── HistoryAdapter.kt
│ │ │ ├── HotSearchAdapter.kt
│ │ │ ├── MusicPagerAdapter.kt
│ │ │ ├── MvCommentAdapter.kt
│ │ │ ├── MvListAdapter.kt
│ │ │ ├── MvTagAdapter.kt
│ │ │ ├── RadioAdapter.kt
│ │ │ ├── RecommendAdapter.kt
│ │ │ ├── SearchAdapter.kt
│ │ │ ├── SimilarMvAdapter.kt
│ │ │ └── SongListAdapter.kt
│ │ │ ├── api
│ │ │ └── Api.kt
│ │ │ ├── common
│ │ │ └── Constant.kt
│ │ │ ├── component
│ │ │ ├── MusicApplicationLike.kt
│ │ │ └── MusicServiceImpl.kt
│ │ │ ├── db
│ │ │ ├── DatabaseOpenHelper.kt
│ │ │ ├── Tables.kt
│ │ │ └── ext
│ │ │ │ └── ContextExtensions.kt
│ │ │ ├── entity
│ │ │ ├── Banner.kt
│ │ │ ├── BannerData.kt
│ │ │ ├── CommentData.kt
│ │ │ ├── HotSearch.kt
│ │ │ ├── MvComment.kt
│ │ │ ├── MvData.kt
│ │ │ ├── MvDetail.kt
│ │ │ ├── MvDetailData.kt
│ │ │ ├── MvDto.kt
│ │ │ ├── Radio.kt
│ │ │ ├── RadioData.kt
│ │ │ ├── SearchData.kt
│ │ │ ├── SimiMv.kt
│ │ │ ├── Song.kt
│ │ │ ├── SongData.kt
│ │ │ ├── SongItemBean.kt
│ │ │ ├── SongItemData.kt
│ │ │ ├── SongSearch.kt
│ │ │ └── SongTitleData.kt
│ │ │ ├── injection
│ │ │ ├── component
│ │ │ │ ├── MusicComponent.kt
│ │ │ │ ├── MvDetailComponent.kt
│ │ │ │ ├── RadioComponent.kt
│ │ │ │ ├── SearchComponent.kt
│ │ │ │ ├── ShortFilmComponent.kt
│ │ │ │ └── SongListDetailComponent.kt
│ │ │ └── module
│ │ │ │ ├── MusicModule.kt
│ │ │ │ ├── MvDetailMaude.kt
│ │ │ │ ├── SearchModule.kt
│ │ │ │ ├── ShortFilmModule.kt
│ │ │ │ └── SongListDetailModule.kt
│ │ │ ├── mvp
│ │ │ ├── contract
│ │ │ │ ├── MvDetailContract.kt
│ │ │ │ ├── RadioContract.kt
│ │ │ │ ├── RecommendContract.kt
│ │ │ │ ├── SearchContract.kt
│ │ │ │ ├── ShortFilmContract.kt
│ │ │ │ └── SongListContract.kt
│ │ │ ├── preesnter
│ │ │ │ ├── MvDetailPresenter.kt
│ │ │ │ ├── RadioPresenter.kt
│ │ │ │ ├── RecommendPresenter.kt
│ │ │ │ ├── SearchPresenter.kt
│ │ │ │ ├── ShortFilmPresenter.kt
│ │ │ │ └── SongListDetailPresenter.kt
│ │ │ └── service
│ │ │ │ ├── MvDetailService.kt
│ │ │ │ ├── RecommendService.kt
│ │ │ │ ├── SearchService.kt
│ │ │ │ ├── ShortFilmService.kt
│ │ │ │ ├── SongListService.kt
│ │ │ │ └── impl
│ │ │ │ ├── MvDetailServiceImpl.kt
│ │ │ │ ├── RecommendServiceImpl.kt
│ │ │ │ ├── SearchServiceImpl.kt
│ │ │ │ ├── ShortFilmServiceImpl.kt
│ │ │ │ └── SongListServiceImpl.kt
│ │ │ ├── service
│ │ │ ├── MusicPlayService.kt
│ │ │ ├── MusicPlayerEngine.kt
│ │ │ └── MusicServiceStub.kt
│ │ │ └── ui
│ │ │ ├── activity
│ │ │ ├── MvDetailActivity.kt
│ │ │ ├── SearchActivity.kt
│ │ │ └── SongListDetailActivity.kt
│ │ │ └── fragment
│ │ │ ├── MusicFragment.kt
│ │ │ ├── RadioFragment.kt
│ │ │ ├── RecommendFragment.kt
│ │ │ └── ShortFilmFragment.kt
│ ├── res
│ │ ├── drawable-xxhdpi
│ │ │ ├── ic_avatar.png
│ │ │ ├── ic_back.png
│ │ │ ├── ic_category_01.png
│ │ │ ├── ic_category_02.png
│ │ │ ├── ic_category_03.png
│ │ │ ├── ic_category_04.png
│ │ │ ├── ic_category_05.png
│ │ │ ├── ic_category_06.png
│ │ │ ├── ic_commint.png
│ │ │ ├── ic_corners_bg.png
│ │ │ ├── ic_download.png
│ │ │ ├── ic_men_sy_white.png
│ │ │ ├── ic_menu.png
│ │ │ ├── ic_meun_sy.png
│ │ │ ├── ic_mulit_select.png
│ │ │ ├── ic_music.png
│ │ │ ├── ic_music_item_ej.png
│ │ │ ├── ic_mv_collent.png
│ │ │ ├── ic_mv_comment.png
│ │ │ ├── ic_mv_good_normal.png
│ │ │ ├── ic_mv_goog_select.png
│ │ │ ├── ic_mv_share.png
│ │ │ ├── ic_my_pic.png
│ │ │ ├── ic_nav_head_bg.jpg
│ │ │ ├── ic_play.png
│ │ │ ├── ic_play_menu.png
│ │ │ ├── ic_play_music.png
│ │ │ ├── ic_player_center_start.png
│ │ │ ├── ic_radio_play.png
│ │ │ ├── ic_radio_top.png
│ │ │ ├── ic_radio_type.png
│ │ │ ├── ic_radio_xb.png
│ │ │ ├── ic_raido_di.jpg
│ │ │ ├── ic_re_bill.png
│ │ │ ├── ic_re_fm.png
│ │ │ ├── ic_re_rank.png
│ │ │ ├── ic_re_songlist.png
│ │ │ ├── ic_recommend_head_itembg.png
│ │ │ ├── ic_search_delete.png
│ │ │ ├── ic_search_go.png
│ │ │ ├── ic_search_history.png
│ │ │ ├── ic_search_song.png
│ │ │ ├── ic_share.png
│ │ │ ├── ic_songlist_error.png
│ │ │ ├── ic_songlist_type.png
│ │ │ ├── ic_tag_bg.png
│ │ │ ├── ic_top_disvocer.png
│ │ │ ├── ic_top_music.png
│ │ │ ├── ic_top_search.png
│ │ │ └── ic_top_video.png
│ │ ├── drawable
│ │ │ ├── music_ic_launcher_background.xml
│ │ │ ├── music_ic_right.xml
│ │ │ ├── music_select_mvdetail_good.xml
│ │ │ ├── music_sp_cursor.xml
│ │ │ ├── music_sp_item_bg.xml
│ │ │ ├── music_sp_item_history_bg.xml
│ │ │ ├── music_sp_item_mvtag_bg.xml
│ │ │ ├── music_sp_mvdetail_gz_bg.xml
│ │ │ └── music_sp_search_ed_bg.xml
│ │ ├── layout
│ │ │ ├── music_activity_mv_detail.xml
│ │ │ ├── music_activity_search.xml
│ │ │ ├── music_activity_song_list.xml
│ │ │ ├── music_fragment_music.xml
│ │ │ ├── music_fragment_radio.xml
│ │ │ ├── music_fragment_recommend.xml
│ │ │ ├── music_fragment_short_film.xml
│ │ │ ├── music_head_songlist_top.xml
│ │ │ ├── music_item_music_radio_list.xml
│ │ │ ├── music_item_music_song_img.xml
│ │ │ ├── music_item_music_song_title.xml
│ │ │ ├── music_item_mv_comment.xml
│ │ │ ├── music_item_mv_music.xml
│ │ │ ├── music_item_mvdetail_simi.xml
│ │ │ ├── music_item_mvdetail_tag.xml
│ │ │ ├── music_item_search_hot.xml
│ │ │ ├── music_item_songlist.xml
│ │ │ ├── music_layout_mv_detail_top.xml
│ │ │ ├── music_layout_play_contral.xml
│ │ │ ├── music_layout_recommend_footer_radio.xml
│ │ │ ├── music_layout_recommend_head.xml
│ │ │ ├── music_layout_recommend_head_radio.xml
│ │ │ ├── music_layout_tab.xml
│ │ │ ├── music_navigation_drawer_header.xml
│ │ │ ├── musis_item_history_search.xml
│ │ │ └── musis_item_search_result.xml
│ │ ├── menu
│ │ │ └── music_menu_navigation_drawer.xml
│ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ └── runalone
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── music
│ │ │ ├── TestActivity.kt
│ │ │ └── app
│ │ │ └── MusicApplication.kt
│ │ └── res
│ │ └── layout
│ │ └── music_activity_test.xml
│ └── test
│ └── java
│ └── com
│ └── gfd
│ └── music
│ └── ExampleUnitTest.kt
├── Player
├── .gitignore
├── build.gradle
├── gradle.properties
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── gfd
│ │ └── player
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ └── live.txt
│ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── player
│ │ │ ├── adapter
│ │ │ ├── EpisodeAdapter.kt
│ │ │ └── ProgramAdapter.kt
│ │ │ ├── common
│ │ │ └── Conant.kt
│ │ │ ├── component
│ │ │ ├── PlayerApplicationLike.kt
│ │ │ └── PlayerServiceImpl.kt
│ │ │ ├── entity
│ │ │ ├── LiveDataDto.kt
│ │ │ ├── TimeTableData.kt
│ │ │ └── VideoItemData.kt
│ │ │ ├── ext
│ │ │ └── Ext.kt
│ │ │ ├── injection
│ │ │ ├── component
│ │ │ │ ├── LiveComponent.kt
│ │ │ │ └── PlayComponent.kt
│ │ │ └── moudle
│ │ │ │ ├── LiveModule.kt
│ │ │ │ └── PlayModule.kt
│ │ │ ├── mvp
│ │ │ ├── contract
│ │ │ │ ├── LiveContract.kt
│ │ │ │ └── PlayContract.kt
│ │ │ └── presenter
│ │ │ │ ├── LivePresenter.kt
│ │ │ │ └── PlayPresenter.kt
│ │ │ ├── service
│ │ │ ├── LiveApiService.kt
│ │ │ ├── PlayService.kt
│ │ │ └── impl
│ │ │ │ ├── LiveApiServiceImpl.kt
│ │ │ │ └── PlayServiceImpl.kt
│ │ │ ├── ui
│ │ │ ├── activity
│ │ │ │ ├── PlayMvActivity.kt
│ │ │ │ ├── PlayWebActivity.kt
│ │ │ │ └── PlayerActivity.kt
│ │ │ └── fragment
│ │ │ │ └── LiveFragment.kt
│ │ │ └── widgets
│ │ │ └── VideoPlayer.java
│ └── res
│ │ ├── drawable
│ │ ├── player_ic_launcher_background.xml
│ │ ├── player_select_item_episode_text.xml
│ │ ├── player_sp_item_normal.xml
│ │ ├── player_sp_item_player_bg.xml
│ │ ├── player_sp_item_select.xml
│ │ └── player_sp_list_scollbar.xml
│ │ ├── layout
│ │ ├── player_activity_play_webview.xml
│ │ ├── player_activity_player.xml
│ │ ├── player_fragment_live.xml
│ │ ├── player_head_playweb.xml
│ │ ├── player_item_episode.xml
│ │ ├── player_item_program_live.xml
│ │ ├── player_item_program_live_title.xml
│ │ ├── player_item_tiems.xml
│ │ └── player_layout_player_control.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── gfd
│ └── player
│ └── ExampleUnitTest.kt
├── PluginSwitch
├── .gitignore
├── build.gradle
└── src
│ └── main
│ ├── groovy
│ └── com
│ │ └── gfd
│ │ └── plugin
│ │ ├── CompileCodeTransform.groovy
│ │ ├── CompileSwitch.groovy
│ │ └── ConvertUtils.groovy
│ └── resources
│ └── META-INF
│ └── gradle-plugins
│ └── com.gfd.comswitch.properties
├── Provider
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── provider
│ │ │ └── router
│ │ │ ├── RouterPath.kt
│ │ │ ├── component
│ │ │ ├── IApplicationLoad.kt
│ │ │ └── Router.kt
│ │ │ └── service
│ │ │ ├── CrosstalkService.kt
│ │ │ ├── HomeService.kt
│ │ │ ├── LiveService.kt
│ │ │ └── MusicService.kt
│ └── res
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── gfd
│ └── provider
│ └── ExampleUnitTest.kt
├── README.md
├── and_res_guard.gradle
├── app
├── .gitignore
├── build.gradle
├── gradle.properties
├── proguard-rules.pro
├── releasesInfo.xml
├── sign.jks
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── gfd
│ │ └── video
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── ic_launcher-web.png
│ ├── java
│ │ └── com
│ │ │ └── gfd
│ │ │ └── video
│ │ │ ├── app
│ │ │ └── MainApplication.kt
│ │ │ ├── common
│ │ │ ├── Api.kt
│ │ │ └── UpdateManager.kt
│ │ │ ├── entity
│ │ │ └── VersionData.kt
│ │ │ └── ui
│ │ │ ├── MainActivity.kt
│ │ │ └── SplashActivity.kt
│ └── res
│ │ ├── drawable-xhdpi
│ │ └── app_ic_splash.png
│ │ ├── drawable-xxhdpi
│ │ ├── app_home_normal.png
│ │ ├── app_home_select.png
│ │ ├── app_ic_launcher_foreground.png
│ │ ├── app_mine_normal.png
│ │ ├── app_mine_select.png
│ │ ├── app_music_normal.png
│ │ ├── app_music_select.png
│ │ ├── app_play_normal.png
│ │ └── app_play_select.png
│ │ ├── drawable
│ │ ├── app_bitmap_splash_bg.xml
│ │ ├── app_ic_launcher_background.xml
│ │ ├── app_select_main_home.xml
│ │ ├── app_select_main_mine.xml
│ │ ├── app_select_main_music.xml
│ │ └── app_select_main_play.xml
│ │ ├── layout
│ │ ├── app_activity_main.xml
│ │ └── app_activity_splash.xml
│ │ ├── mipmap-anydpi-v26
│ │ └── app_logo.xml
│ │ ├── mipmap-xxhdpi
│ │ └── app_logo.png
│ │ ├── values-v21
│ │ └── styles.xml
│ │ ├── values
│ │ ├── app_ic_launcher_background.xml
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ │ └── xml
│ │ └── app_bottombar_tasb.xml
│ └── test
│ └── java
│ └── com
│ └── gfd
│ └── video
│ └── ExampleUnitTest.kt
├── build.gradle
├── common.gradle
├── componentrelease
└── Home-release.aar
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── libbase.gradle
├── nicevideoplayer
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── xiao
│ │ └── nicevideoplayer
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── xiao
│ │ │ └── nicevideoplayer
│ │ │ ├── ChangeClarityDialog.java
│ │ │ ├── Clarity.java
│ │ │ ├── INiceVideoPlayer.java
│ │ │ ├── LogUtil.java
│ │ │ ├── NiceTextureView.java
│ │ │ ├── NiceUtil.java
│ │ │ ├── NiceVideoPlayer.java
│ │ │ ├── NiceVideoPlayerController.java
│ │ │ ├── NiceVideoPlayerManager.java
│ │ │ └── TxVideoPlayerController.java
│ └── res
│ │ ├── color
│ │ └── select_change_clarity_color.xml
│ │ ├── drawable-xhdpi
│ │ ├── battery_10.png
│ │ ├── battery_100.png
│ │ ├── battery_20.png
│ │ ├── battery_50.png
│ │ ├── battery_80.png
│ │ ├── battery_charging.png
│ │ ├── battery_full.png
│ │ ├── ic_palyer_brightness.png
│ │ ├── ic_palyer_share.png
│ │ ├── ic_palyer_volume.png
│ │ ├── ic_player_back.png
│ │ ├── ic_player_center_start.png
│ │ ├── ic_player_default.png
│ │ ├── ic_player_enlarge.png
│ │ ├── ic_player_pause.png
│ │ ├── ic_player_replay.png
│ │ ├── ic_player_shrink.png
│ │ ├── ic_player_start.png
│ │ ├── img_default.png
│ │ ├── loading00.png
│ │ ├── loading01.png
│ │ ├── loading02.png
│ │ ├── loading03.png
│ │ ├── loading04.png
│ │ ├── loading05.png
│ │ ├── loading06.png
│ │ ├── loading07.png
│ │ ├── loading08.png
│ │ ├── loading09.png
│ │ ├── loading10.png
│ │ ├── loading11.png
│ │ ├── loading12.png
│ │ ├── loading13.png
│ │ ├── loading14.png
│ │ ├── loading15.png
│ │ ├── loading16.png
│ │ ├── loading17.png
│ │ ├── loading18.png
│ │ ├── loading19.png
│ │ ├── loading20.png
│ │ ├── loading21.png
│ │ ├── loading22.png
│ │ ├── loading23.png
│ │ ├── loading24.png
│ │ ├── loading25.png
│ │ ├── loading26.png
│ │ ├── loading27.png
│ │ ├── loading28.png
│ │ ├── loading29.png
│ │ ├── player_mask_bottom.png
│ │ └── player_mask_top.png
│ │ ├── drawable
│ │ ├── bg_change_clarity_checked.xml
│ │ ├── bg_change_clarity_normal.xml
│ │ ├── bg_radius_4.xml
│ │ ├── bg_retry.xml
│ │ ├── loading.xml
│ │ ├── pb_change.xml
│ │ ├── seek_progress.xml
│ │ ├── seek_thumb.xml
│ │ ├── seek_thumb_normal.xml
│ │ ├── seek_thumb_pressed.xml
│ │ └── select_change_clarity.xml
│ │ ├── layout
│ │ ├── item_change_clarity.xml
│ │ └── tx_video_palyer_controller.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── xiao
│ └── nicevideoplayer
│ └── ExampleUnitTest.java
├── releaseinfo.gradle
├── repo
└── com
│ └── gfd
│ └── plugin
│ └── PluginSwitch
│ ├── 1.0.0
│ ├── PluginSwitch-1.0.0.jar
│ ├── PluginSwitch-1.0.0.jar.md5
│ ├── PluginSwitch-1.0.0.jar.sha1
│ ├── PluginSwitch-1.0.0.pom
│ ├── PluginSwitch-1.0.0.pom.md5
│ └── PluginSwitch-1.0.0.pom.sha1
│ ├── maven-metadata.xml
│ ├── maven-metadata.xml.md5
│ └── maven-metadata.xml.sha1
├── screenMatch.properties
├── screenMatch_example_dimens.xml
├── screenshot
├── alone.png
├── app-release.apk
├── crosstalk01.png
├── home.png
├── module_run.gif
├── music1.png
├── music2.png
├── music3.png
├── music4.png
├── music5.png
├── music_search1.png
├── music_search2.png
├── play01.png
├── player.png
├── qcode.jpg
├── search1.png
├── search2.png
└── 模块化.png
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | # Generated files
2 | bin/
3 | gen/
4 | out/
5 | # Gradle files
6 | .gradle/
7 | build/
8 | # Local configuration file (sdk path, etc)
9 | local.properties
10 | *.iml
11 | .idea/
12 |
13 |
--------------------------------------------------------------------------------
/Common/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/Common/libs/tbs_sdk_thirdapp_v4.3.0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/libs/tbs_sdk_thirdapp_v4.3.0.jar
--------------------------------------------------------------------------------
/Common/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 |
--------------------------------------------------------------------------------
/Common/src/androidTest/java/com/gfd/common/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.gfd.common;
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() {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.gfd.common.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Common/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
12 |
13 |
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/dsl/EditorActionDSL.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.dsl
2 |
3 | /**
4 | * @Author :郭富东
5 | * @Date:2019/8/6:14:59
6 | * @Email:878749089@qq.com
7 | * @description:键盘行为DSL
8 | */
9 | class EditorActionDSL {
10 |
11 | /** 搜索按键*/
12 | internal var onSearch: ((text: String) -> Unit)? = null
13 | private set
14 |
15 | /**
16 | * 设置搜索回调
17 | * @param block (text: String) -> Unit
18 | */
19 | fun onSearch(block: (text: String) -> Unit) {
20 | this.onSearch = block
21 | }
22 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/impl/DegradeServiceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.impl
2 |
3 | import android.content.Context
4 | import com.alibaba.android.arouter.facade.Postcard
5 | import com.alibaba.android.arouter.facade.annotation.Route
6 | import com.alibaba.android.arouter.facade.service.DegradeService
7 | import com.gfd.common.utils.ToastUtils
8 |
9 | /**
10 | * @Author :郭富东
11 | * @Date:2019/3/1:14:47
12 | * @Email:878749089@qq.com
13 | * @descriptio:全局降级处理
14 | */
15 | @Route(path = "/xxx/xxx")
16 | class DegradeServiceImpl : DegradeService {
17 | override fun onLost(context: Context?, postcard: Postcard?) {
18 | ToastUtils.instance.showToast("页面走丢了。")
19 | }
20 | override fun init(context: Context?) {
21 | }
22 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/injection/component/ActivityComponent.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.injection.component
2 |
3 | import android.app.Activity
4 | import android.content.Context
5 | import com.gfd.common.injection.module.ActivityMoudle
6 | import com.gfd.common.injection.scope.ActivityScope
7 | import dagger.Component
8 |
9 | /**
10 | * @Author : 郭富东
11 | * @Date :2018/8/2 - 10:00
12 | * @Email:878749089@qq.com
13 | * @descriptio:
14 | */
15 | @ActivityScope
16 | @Component(dependencies = [AppComponent::class],
17 | modules = [ActivityMoudle::class])
18 | interface ActivityComponent {
19 |
20 | fun context(): Context
21 | fun activity(): Activity
22 |
23 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/injection/component/AppComponent.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.injection.component
2 |
3 | import android.content.Context
4 | import com.gfd.common.injection.module.AppMoudle
5 | import dagger.Component
6 | import javax.inject.Singleton
7 |
8 | /**
9 | * @Author : 郭富东
10 | * @Date :2018/8/2 - 9:50
11 | * @Email:878749089@qq.com
12 | * @descriptio:
13 | */
14 | @Singleton
15 | @Component(modules = [AppMoudle::class])
16 | interface AppComponent{
17 |
18 | fun context():Context
19 |
20 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/injection/module/ActivityMoudle.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.injection.module
2 |
3 | import android.app.Activity
4 | import android.support.v4.app.FragmentActivity
5 | import com.gfd.common.injection.scope.ActivityScope
6 | import dagger.Module
7 | import dagger.Provides
8 |
9 | /**
10 | * @Author : 郭富东
11 | * @Date :2018/8/2 - 9:55
12 | * @Email:878749089@qq.com
13 | * @descriptio:
14 | */
15 | @Module
16 | class ActivityMoudle(private val activity: Activity) {
17 |
18 | @ActivityScope
19 | @Provides
20 | fun provideActivity(): Activity {
21 | return this.activity
22 | }
23 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/injection/module/AppMoudle.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.injection.module
2 |
3 | import android.content.Context
4 | import com.gfd.common.common.BaseApplication
5 | import dagger.Module
6 | import dagger.Provides
7 | import javax.inject.Singleton
8 |
9 | /**
10 | * @Author : 郭富东
11 | * @Date :2018/8/2 - 9:47
12 | * @Email:878749089@qq.com
13 | * @descriptio:
14 | */
15 | @Module
16 | class AppMoudle(private val context:BaseApplication){
17 |
18 | @Singleton
19 | @Provides
20 | fun provideContext(): Context {
21 | return this.context
22 | }
23 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/injection/scope/ActivityScope.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.injection.scope
2 |
3 | import javax.inject.Scope
4 | import kotlin.annotation.MustBeDocumented
5 | import kotlin.annotation.Retention
6 |
7 | /**
8 | * @Author : 郭富东
9 | * @Date :2018/8/2 - 9:57
10 | * @Email:878749089@qq.com
11 | * @description:Activity级别的作用域
12 | */
13 | @Scope
14 | @MustBeDocumented
15 | @Retention(AnnotationRetention.RUNTIME)
16 | annotation class ActivityScope
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/injection/scope/PerComponentScope.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.injection.scope
2 |
3 | import javax.inject.Scope
4 |
5 | /**
6 | * @Author : 郭富东
7 | * @Date :2018/8/3 - 10:49
8 | * @Email:878749089@qq.com
9 | * @descriptio:组件级别作用域
10 | */
11 | @Scope
12 | @MustBeDocumented
13 | @Retention(AnnotationRetention.RUNTIME)
14 | annotation class PerComponentScope
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/mvp/presenter/BasePresenter.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.mvp.presenter
2 |
3 |
4 | /**
5 | * @Author : 郭富东
6 | * @Date :2018/8/1 - 16:15
7 | * @Email:878749089@qq.com
8 | * @descriptio:
9 | */
10 | interface BasePresenter
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/mvp/view/BaseView.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.mvp.view
2 |
3 |
4 | /**
5 | * @Author : 郭富东
6 | * @Date :2018/8/1 - 16:19
7 | * @Email:878749089@qq.com
8 | * @description:
9 | */
10 | interface BaseView {
11 |
12 | /**
13 | * 显示Loading
14 | */
15 | fun showLoading()
16 |
17 | /**
18 | * 隐藏Loading
19 | */
20 | fun showContent()
21 |
22 | /**
23 | * 访问错误
24 | */
25 | fun error(){}
26 |
27 | /**
28 | * 空数据
29 | */
30 | fun empty(){}
31 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/ui/adapter/MultiItemEntity.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.ui.adapter
2 |
3 | /**
4 | * @Author : 郭富东
5 | * @Date :2018/8/4 - 10:34
6 | * @Email:878749089@qq.com
7 | * @descriptio:多类型的列表数据实体类要实现的接口
8 | */
9 | interface MultiItemEntity {
10 |
11 | fun getItemType(): Int
12 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/utils/CodeUtils.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.utils
2 |
3 | import java.util.regex.Pattern
4 | /**
5 | * @Author : 郭富东
6 | * @Date :2018/9/15 - 14:37
7 | * @Email:878749089@qq.com
8 | * @descriptio:
9 | */
10 | object CodeUtils{
11 | /**
12 | * unicode转中文
13 | * @param codeStr
14 | * @return
15 | */
16 | fun unicodeToString(codeStr: String): String {
17 | var str = codeStr
18 | val pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))")
19 | val matcher = pattern.matcher(str)
20 | var ch: Char
21 | while (matcher.find()) {
22 | ch = Integer.parseInt(matcher.group(2), 16).toChar()
23 | str = str.replace(matcher.group(1), ch + "")
24 | }
25 | return str
26 | }
27 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/utils/FixedSpeedScroller.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.utils
2 |
3 | import android.content.Context
4 | import android.widget.Scroller
5 |
6 | /**
7 | * @Author : 郭富东
8 | * @Date :2018/8/9 - 10:48
9 | * @Email:878749089@qq.com
10 | * @descriptio:
11 | */
12 | class FixedSpeedScroller(context: Context) : Scroller(context) {
13 |
14 | private val mDuration = 100
15 |
16 | override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
17 | super.startScroll(startX, startY, dx, dy, mDuration)
18 | }
19 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/utils/GlideImageLoader.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.utils
2 |
3 | import android.content.Context
4 | import android.widget.ImageView
5 | import com.youth.banner.loader.ImageLoader
6 |
7 | /**
8 | * @Author : 郭富东
9 | * @Date :2018/8/3 - 17:36
10 | * @Email:878749089@qq.com
11 | * @description:
12 | */
13 | class GlideImageLoader : ImageLoader() {
14 | override fun displayImage(context: Context?, path: Any?, imageView: ImageView?) {
15 | imageView?.let { context?.let { it1 -> (ImageLoader).loadUrlImage(it1, path as String, it) } }
16 | }
17 |
18 | //提供createImageView 方法,如果不用可以不重写这个方法,主要是方便自定义ImageView的创建
19 | override fun createImageView(context: Context): ImageView {
20 | val imageView = ImageView(context)
21 | imageView.scaleType = ImageView.ScaleType.CENTER_INSIDE
22 | return imageView
23 | }
24 |
25 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/utils/NetUtils.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.utils
2 |
3 | import android.content.Context
4 | import android.net.ConnectivityManager
5 | import com.gfd.common.common.BaseApplication.Companion.context
6 |
7 | /**
8 | * @Author : 郭富东
9 | * @Date :2018/9/25 - 14:32
10 | * @Email:878749089@qq.com
11 | * @descriptio:网络工具类
12 | */
13 | class NetUtils {
14 |
15 |
16 | companion object {
17 | /**
18 | * 当前网络是否可用
19 | */
20 | val NETWORK_ENABLE: Boolean
21 | get() {
22 | val connManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
23 | val info = connManager.activeNetworkInfo ?: return false
24 | return info.isConnected
25 | }
26 | }
27 |
28 |
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/utils/SoftKeyboardUtils.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.utils
2 |
3 | import android.app.Activity
4 | import android.content.Context
5 | import android.view.inputmethod.InputMethodManager
6 |
7 |
8 | /**
9 | * @Author :郭富东
10 | * @Date:2019/8/6:14:52
11 | * @Email:878749089@qq.com
12 | * @description:软键盘工具类
13 | */
14 | object SoftKeyboardUtils {
15 |
16 | /**
17 | * 隐藏软键盘
18 | * @param activity Activity
19 | */
20 | fun closeInoutDecorView(activity: Activity) {
21 | val view = activity.window.peekDecorView()
22 | val inputMethodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
23 | inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
24 | }
25 | }
--------------------------------------------------------------------------------
/Common/src/main/java/com/gfd/common/widgets/SpanLookup.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.common.widgets
2 |
3 | /**
4 | * @Author : 郭富东
5 | * @Date :2018/8/4 - 15:20
6 | * @Email:878749089@qq.com
7 | * @descriptio:
8 | */
9 | interface SpanLookup {
10 |
11 | /**
12 | * @return number of spans in a row
13 | */
14 | val spanCount: Int
15 |
16 | /**
17 | * @param itemPosition
18 | * @return start span for the item at the given adapter position
19 | */
20 | fun getSpanIndex(itemPosition: Int): Int
21 |
22 | /**
23 | * @param itemPosition
24 | * @return number of spans the item at the given adapter position occupies
25 | */
26 | fun getSpanSize(itemPosition: Int): Int
27 |
28 | }
--------------------------------------------------------------------------------
/Common/src/main/jniLibs/armeabi/liblbs.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/jniLibs/armeabi/liblbs.so
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/base_ic_net.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/base_ic_net.webp
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/common_ic_player_center_start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/common_ic_player_center_start.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/ic_net_error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/ic_net_error.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/ic_player_default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/ic_player_default.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/icon_default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/icon_default.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading1.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading10.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading11.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading2.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading3.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading4.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading5.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading6.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading7.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading8.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable-xxhdpi/light_progress_loading9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guofudong/KotlinAndroid/68261953e11064b27cbbe3809588e182de8189ca/Common/src/main/res/drawable-xxhdpi/light_progress_loading9.png
--------------------------------------------------------------------------------
/Common/src/main/res/drawable/progress_dialog_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/Common/src/main/res/drawable/sp_indicator_select.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Common/src/main/res/drawable/sp_title_left.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 | -
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/Common/src/main/res/layout/base_empty.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
15 |
--------------------------------------------------------------------------------
/Common/src/main/res/layout/base_loading.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
17 |
18 |
--------------------------------------------------------------------------------
/Common/src/main/res/layout/progress_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Common/src/main/res/transition/explode.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Common/src/main/res/values-v19/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 25dp
4 |
--------------------------------------------------------------------------------
/Common/src/main/res/values/ids.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Common/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Common
3 |
4 | 敬请期待!
5 | 连接异常
6 | 连接超时
7 | 网络问题
8 | 解析异常
9 | 未知错误
10 | 响应返回状态不为1,并且错误信息为空
11 |
12 | 加载中...
13 | 还没有内容
14 | 连接后请点击刷新
15 | 重新加载
16 |
17 |
--------------------------------------------------------------------------------
/Common/src/test/java/com/gfd/common/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.gfd.common;
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() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/Crosstalk/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/Crosstalk/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.gfd.comswitch'
2 | apply from:rootProject.file('libbase.gradle')
3 |
4 | kapt {
5 | arguments {
6 | arg(arouter_module_name, project.getName())
7 | }
8 | }
9 |
10 | android {
11 |
12 | //规定资源命名前缀为crosstalk_
13 | resourcePrefix "crosstalk_"
14 |
15 | }
16 |
17 | dependencies {
18 | implementation project(':Provider')
19 | kapt "com.google.dagger:dagger-compiler:$dagger_version"
20 | implementation project(':nicevideoplayer')
21 | implementation rootProject.ext.dependence.libQSVideoPlayer
22 | }
--------------------------------------------------------------------------------
/Crosstalk/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx1536m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | isRunAlone=false
15 | #debugComponent=sharecomponent
16 | #compileComponent=com.mrzhang.share:sharecomponent
17 |
--------------------------------------------------------------------------------
/Crosstalk/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 |
--------------------------------------------------------------------------------
/Crosstalk/src/androidTest/java/com/gfd/crosstalk/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.gfd.crosstalk;
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() {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.gfd.crosstalk.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Crosstalk/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/Crosstalk/src/main/java/com/gfd/crosstalk/component/CrosstalkApplicationLike.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.crosstalk.component
2 |
3 | import com.gfd.provider.router.component.IApplicationLike
4 | import com.gfd.provider.router.component.Router
5 | import com.gfd.provider.router.service.CrosstalkService
6 |
7 | class CrosstalkApplicationLike : IApplicationLike {
8 |
9 | var router = Router.instance
10 |
11 | override fun registered() {
12 | router.addService(CrosstalkService::class.java.simpleName, CrosstalkServiceImpl())
13 | }
14 |
15 | override fun unregistered() {
16 | router.removeService(CrosstalkService::class.java.simpleName)
17 | }
18 |
19 | }
--------------------------------------------------------------------------------
/Crosstalk/src/main/java/com/gfd/crosstalk/component/CrosstalkServiceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.crosstalk.component
2 |
3 | import com.gfd.common.ui.fragment.BaseFragment
4 | import com.gfd.crosstalk.ui.fragment.CrosstalkFragment
5 | import com.gfd.provider.router.service.CrosstalkService
6 |
7 | /**
8 | * Crosstalk模块提供服务的具体实现者
9 | */
10 | class CrosstalkServiceImpl : CrosstalkService {
11 |
12 | override fun getCrosstalkFragment(): BaseFragment {
13 | return CrosstalkFragment()
14 | }
15 |
16 | }
--------------------------------------------------------------------------------
/Crosstalk/src/main/java/com/gfd/crosstalk/entity/Video.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.crosstalk.entity
2 |
3 | /**
4 | * @Author : 郭富东
5 | * @Date :2018/9/15 - 11:21
6 | * @Email:878749089@qq.com
7 | * @description:
8 | */
9 | data class Video(var name: String, var create_time: String, var datetime: String, var video_duration: Int, var comment_count: Int, var middle_image_url: String, var large_image_url: String, var source_url: String, var video_duration_str: String, var cookie: String)
--------------------------------------------------------------------------------
/Crosstalk/src/main/java/com/gfd/crosstalk/injection/component/CrosstalkComponent.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.crosstalk.injection.component
2 |
3 | import com.gfd.common.injection.component.ActivityComponent
4 | import com.gfd.common.injection.scope.PerComponentScope
5 | import com.gfd.crosstalk.ui.fragment.CrosstalkFragment
6 | import com.gfd.crosstalk.injection.moudle.CrosstalkModule
7 | import dagger.Component
8 |
9 | /**
10 | * @Author : 郭富东
11 | * @Date :2018/9/15 - 11:42
12 | * @Email:878749089@qq.com
13 | * @description:
14 | */
15 | @PerComponentScope
16 | @Component(dependencies = [(ActivityComponent::class)],modules = [(CrosstalkModule::class)])
17 | interface CrosstalkComponent {
18 | fun inject(fragment: CrosstalkFragment)
19 | }
--------------------------------------------------------------------------------
/Crosstalk/src/main/java/com/gfd/crosstalk/injection/moudle/CrosstalkModule.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.crosstalk.injection.moudle
2 |
3 | import com.gfd.crosstalk.mvp.contract.CrosstalkContract
4 | import com.gfd.crosstalk.mvp.service.CrosstalkService
5 | import com.gfd.crosstalk.mvp.service.impl.CrosstalkServiceImpl
6 | import dagger.Module
7 | import dagger.Provides
8 |
9 | /**
10 | * @Author : 郭富东
11 | * @Date :2018/9/15 - 11:38
12 | * @Email:878749089@qq.com
13 | * @description:
14 | */
15 | @Module
16 | class CrosstalkModule(val view :CrosstalkContract.View){
17 |
18 | @Provides
19 | fun provideView():CrosstalkContract.View{
20 | return view
21 | }
22 |
23 | @Provides
24 | fun provideService():CrosstalkService{
25 | return CrosstalkServiceImpl()
26 | }
27 | }
--------------------------------------------------------------------------------
/Crosstalk/src/main/java/com/gfd/crosstalk/mvp/contract/CrosstalkContract.kt:
--------------------------------------------------------------------------------
1 | package com.gfd.crosstalk.mvp.contract
2 |
3 | import com.gfd.common.mvp.presenter.BasePresenter
4 | import com.gfd.common.mvp.view.BaseView
5 | import com.gfd.crosstalk.entity.Video
6 |
7 | /**
8 | * @Author : 郭富东
9 | * @Date :2018/9/15 - 11:01
10 | * @Email:878749089@qq.com
11 | * @description:
12 | */
13 | interface CrosstalkContract {
14 |
15 | interface View : BaseView {
16 | fun showVideoList(data:List