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