├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── android │ │ └── player │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── test.mp4 │ │ ├── tiktok │ │ └── videos │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── player │ │ │ ├── App.java │ │ │ ├── base │ │ │ ├── BaseActivity.java │ │ │ ├── BaseContract.java │ │ │ ├── BaseFragment.java │ │ │ ├── BasePresenter.java │ │ │ └── adapter │ │ │ │ ├── BaseAdapter.java │ │ │ │ ├── BaseMultiItemAdapter.java │ │ │ │ ├── BaseNoimalAdapter.java │ │ │ │ ├── interfaces │ │ │ │ ├── MultiItemEntity.java │ │ │ │ ├── OnItemChildClickListener.java │ │ │ │ ├── OnItemClickListener.java │ │ │ │ └── OnLoadMorePresenter.java │ │ │ │ └── widget │ │ │ │ ├── BaseViewHolder.java │ │ │ │ └── OnLoadMoreListener.java │ │ │ ├── bean │ │ │ ├── Menu.java │ │ │ ├── Params.java │ │ │ └── Version.java │ │ │ ├── controller │ │ │ ├── DanmuWidgetView.java │ │ │ └── LiveControllerControl.java │ │ │ ├── danmu │ │ │ ├── DanmuParser.java │ │ │ └── DanmuPaserView.java │ │ │ ├── manager │ │ │ └── PlayerManager.java │ │ │ ├── net │ │ │ ├── BaseEngin.java │ │ │ ├── OkHttpUtils.java │ │ │ ├── OnDownloadListener.java │ │ │ └── OnResultCallBack.java │ │ │ ├── pager │ │ │ ├── activity │ │ │ │ └── PagerPlayerActivity.java │ │ │ ├── adapter │ │ │ │ ├── PagerPlayerAdapter.java │ │ │ │ └── VideoListAdapter.java │ │ │ ├── base │ │ │ │ └── BaseViewPager.java │ │ │ ├── bean │ │ │ │ └── VideoBean.java │ │ │ ├── controller │ │ │ │ └── ShortControllerControl.java │ │ │ ├── fragment │ │ │ │ ├── PagerPlayerFragment.java │ │ │ │ └── VideoListFragment.java │ │ │ ├── interfaces │ │ │ │ ├── IViewPager.java │ │ │ │ └── OnViewPagerListener.java │ │ │ └── widget │ │ │ │ ├── ControlLiveView.java │ │ │ │ ├── MarqueeTextView.java │ │ │ │ ├── MusicDiscView.java │ │ │ │ ├── PagerVideoController.java │ │ │ │ └── ViewPagerLayoutManager.java │ │ │ ├── render │ │ │ └── CoustomSurfaceView.java │ │ │ ├── ui │ │ │ ├── activity │ │ │ │ ├── AssetsPlayerActivity.java │ │ │ │ ├── DanmuPlayerActivity.java │ │ │ │ ├── LivePlayerActivity.java │ │ │ │ ├── MainActivity.java │ │ │ │ ├── PadActivity.java │ │ │ │ ├── PerviewPlayerActivity.java │ │ │ │ ├── PiPPlayerActivity.java │ │ │ │ ├── VideoCacheActivity.java │ │ │ │ ├── VideoListPlayerActivity.java │ │ │ │ ├── VideoPlayerActivity.java │ │ │ │ ├── VideosPlayerActivity.java │ │ │ │ ├── WindowGlobalPlayerActivity.java │ │ │ │ ├── WindowPermissionActivity.java │ │ │ │ └── WindowPlayerActivity.java │ │ │ ├── adapter │ │ │ │ └── MainMenuAdapter.java │ │ │ └── widget │ │ │ │ ├── BoldTextView.java │ │ │ │ ├── CorePlayerView.java │ │ │ │ ├── GlideCircleTransform.java │ │ │ │ ├── ListPlayerHolder.java │ │ │ │ ├── LoadingView.java │ │ │ │ ├── ProjectDialog.java │ │ │ │ └── TitleView.java │ │ │ ├── utils │ │ │ ├── DataFactory.java │ │ │ ├── DateParseUtil.java │ │ │ ├── GlideModel.java │ │ │ ├── Logger.java │ │ │ ├── ScreenUtils.java │ │ │ ├── SharedPreferencesUtil.java │ │ │ ├── StatusUtils.java │ │ │ └── WindowPermission.java │ │ │ └── video │ │ │ ├── adapter │ │ │ ├── ListDetailsAdapter.java │ │ │ └── ListPlayerAdapter.java │ │ │ ├── bean │ │ │ ├── OpenEyesAuthor.java │ │ │ ├── OpenEyesContent.java │ │ │ ├── OpenEyesIndexInfo.java │ │ │ ├── OpenEyesIndexItemBean.java │ │ │ └── VideoParams.java │ │ │ ├── contract │ │ │ └── VideoListContract.java │ │ │ ├── listener │ │ │ └── OnMenuActionListener.java │ │ │ ├── model │ │ │ └── IndexVideoEngin.java │ │ │ ├── presenter │ │ │ └── VideoListPersenter.java │ │ │ └── ui │ │ │ ├── activity │ │ │ ├── PagerListActivity.java │ │ │ └── VideoDetailsActivity.java │ │ │ ├── fragment │ │ │ ├── ListAutoPlayerChangeFragment.java │ │ │ ├── ListPlayerChangedFragment.java │ │ │ └── ListPlayerFragment.java │ │ │ └── widget │ │ │ ├── ControPerviewView.java │ │ │ ├── PlayerMenuDialog.java │ │ │ ├── PlayerMenuView.java │ │ │ ├── PlayerNewbieView.java │ │ │ ├── RoundCornerImageView.java │ │ │ └── SdkDefaultFuncation.java │ └── res │ │ ├── anim │ │ ├── bottom_menu_enter.xml │ │ └── bottom_menu_exit.xml │ │ ├── color │ │ ├── menu_live_text_selector.xml │ │ └── menu_text_selector.xml │ │ ├── drawable │ │ ├── bg_add_player.xml │ │ ├── bg_avatar.xml │ │ ├── bg_btn_continue_play.xml │ │ ├── bg_buy.xml │ │ ├── bg_controller.xml │ │ ├── bg_item_avatar.xml │ │ ├── bg_item_duration.xml │ │ ├── bg_item_follow.xml │ │ ├── bg_item_video_player_bottom.xml │ │ ├── bg_live_play.xml │ │ ├── bg_main_item_buttom.xml │ │ ├── bg_main_item_center.xml │ │ ├── bg_main_item_dot.xml │ │ ├── bg_main_item_full.xml │ │ ├── bg_main_item_top.xml │ │ ├── bg_menu_center.xml │ │ ├── bg_menu_center2.xml │ │ ├── bg_menu_center_live.xml │ │ ├── bg_menu_left.xml │ │ ├── bg_menu_left_live.xml │ │ ├── bg_menu_right.xml │ │ ├── bg_menu_right_live.xml │ │ ├── bg_play.xml │ │ ├── bg_player_bottom.xml │ │ ├── bg_shape_draw_bottom_bg.xml │ │ ├── bg_shape_draw_top_bg.xml │ │ ├── bg_shiyong.xml │ │ ├── bg_shiyong_bord.xml │ │ ├── bg_shiyong_bord_tr.xml │ │ ├── bg_shiyong_tr.xml │ │ ├── fg_video_info.xml │ │ ├── ic_launcher_background.xml │ │ ├── input_bg.xml │ │ ├── input_bg2.xml │ │ ├── item_bg_player_bottom.xml │ │ ├── pb_bottom_progress.xml │ │ ├── pb_video_progress.xml │ │ ├── progressbar_drawable.xml │ │ ├── sb_thumb.xml │ │ ├── sb_video_progress.xml │ │ └── tab_indicator.xml │ │ ├── layout │ │ ├── activity_live.xml │ │ ├── activity_main.xml │ │ ├── activity_pad.xml │ │ ├── activity_pager_simple.xml │ │ ├── activity_pip_player.xml │ │ ├── activity_player_list.xml │ │ ├── activity_video_assets_player.xml │ │ ├── activity_video_cache.xml │ │ ├── activity_video_details.xml │ │ ├── activity_video_global_window_player.xml │ │ ├── activity_video_perview.xml │ │ ├── activity_video_player.xml │ │ ├── activity_video_window_player.xml │ │ ├── activity_videos_player.xml │ │ ├── controller_live.xml │ │ ├── controller_perview.xml │ │ ├── controller_short_video.xml │ │ ├── dialog_menu.xml │ │ ├── dialog_project_menu.xml │ │ ├── fragment_list_player.xml │ │ ├── fragment_video_list.xml │ │ ├── fragment_video_pager_player.xml │ │ ├── item_details_header.xml │ │ ├── item_details_video_list.xml │ │ ├── item_main_menu.xml │ │ ├── item_main_menu2.xml │ │ ├── item_pager_player.xml │ │ ├── item_unkonwn.xml │ │ ├── item_video_list.xml │ │ ├── item_video_list_player.xml │ │ ├── item_video_list_title.xml │ │ ├── video_menu_view.xml │ │ ├── video_pager_layout.xml │ │ ├── view_controller_danmu.xml │ │ ├── view_danmu_paser_layout.xml │ │ ├── view_loading_view.xml │ │ ├── view_music_disc_layout.xml │ │ ├── view_pager_player_controller.xml │ │ ├── view_player_core.xml │ │ ├── view_player_newbie.xml │ │ ├── view_sdk_funcation.xml │ │ └── view_title_view.xml │ │ ├── mipmap-xxhdpi │ │ ├── ic_add_player.png │ │ ├── ic_back_gray.png │ │ ├── ic_category.png │ │ ├── ic_default_circle.png │ │ ├── ic_default_cover.jpg │ │ ├── ic_dialog_bg.png │ │ ├── ic_face.png │ │ ├── ic_gitee.png │ │ ├── ic_github.png │ │ ├── ic_input.png │ │ ├── ic_item_collection.png │ │ ├── ic_item_comment.png │ │ ├── ic_item_give.png │ │ ├── ic_item_player_menu.png │ │ ├── ic_item_share.png │ │ ├── ic_launcher.png │ │ ├── ic_list_empty.png │ │ ├── ic_list_error.png │ │ ├── ic_live_back.png │ │ ├── ic_live_fullscreen.png │ │ ├── ic_live_mute_false.png │ │ ├── ic_live_mute_true.png │ │ ├── ic_media_play.png │ │ ├── ic_more.png │ │ ├── ic_more_dow.png │ │ ├── ic_music_disc.png │ │ ├── ic_pager_comment.png │ │ ├── ic_pager_like.png │ │ ├── ic_pager_note.png │ │ ├── ic_pager_play.png │ │ ├── ic_pager_share.png │ │ ├── ic_pegasus_progress_guide.png │ │ ├── ic_player_cover.webp │ │ ├── ic_player_window.webp │ │ ├── ic_title_bg.png │ │ ├── ic_video_eye.png │ │ ├── ic_video_loading.png │ │ └── ic_video_play_back.png │ │ ├── raw │ │ └── test.mp4 │ │ ├── values-v26 │ │ └── styles.xml │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── android │ └── player │ └── ExampleUnitTest.java ├── build.gradle ├── cache ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ ├── android │ └── iplayer │ │ └── video │ │ └── cache │ │ ├── VideoCache.java │ │ └── task │ │ └── PreloadTask.java │ └── danikula │ └── videocache │ ├── ByteArrayCache.java │ ├── ByteArraySource.java │ ├── Cache.java │ ├── CacheListener.java │ ├── CacheLog.java │ ├── Config.java │ ├── GetRequest.java │ ├── HttpProxyCache.java │ ├── HttpProxyCacheServer.java │ ├── HttpProxyCacheServerClients.java │ ├── HttpUrlSource.java │ ├── IgnoreHostProxySelector.java │ ├── InterruptedProxyCacheException.java │ ├── Pinger.java │ ├── Preconditions.java │ ├── ProxyCache.java │ ├── ProxyCacheException.java │ ├── ProxyCacheUtils.java │ ├── Source.java │ ├── SourceInfo.java │ ├── StorageUtils.java │ ├── file │ ├── DiskUsage.java │ ├── FileCache.java │ ├── FileNameGenerator.java │ ├── Files.java │ ├── LruDiskUsage.java │ ├── Md5FileNameGenerator.java │ ├── TotalCountLruDiskUsage.java │ ├── TotalSizeLruDiskUsage.java │ └── UnlimitedDiskUsage.java │ ├── headers │ ├── EmptyHeadersInjector.java │ └── HeaderInjector.java │ └── sourcestorage │ ├── DatabaseSourceInfoStorage.java │ ├── NoSourceInfoStorage.java │ ├── SourceInfoStorage.java │ └── SourceInfoStorageFactory.java ├── config.gradle ├── doc ├── apk │ └── iPlayer-2.1.26.apk ├── screenshot │ ├── doc1.jpg │ ├── doc2.jpg │ ├── doc3.jpg │ ├── doc4.jpg │ ├── doc5.jpg │ ├── doc6.jpg │ ├── doc7.jpg │ └── doc8.jpg └── update │ ├── updateLog.md │ └── wiki.md ├── exo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── android │ └── iplayer │ └── media │ ├── ExoMediaSourceHelper.java │ └── core │ ├── ExoMediaPlayer.java │ └── ExoPlayerFactory.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── ijk ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ ├── com │ │ └── android │ │ │ └── iplayer │ │ │ └── media │ │ │ ├── RawDataSourceProvider.java │ │ │ └── core │ │ │ ├── IJkMediaPlayer.java │ │ │ └── IjkPlayerFactory.java │ └── tv │ │ └── danmaku │ │ └── ijk │ │ └── media │ │ └── player │ │ ├── AbstractMediaPlayer.java │ │ ├── AndroidMediaPlayer.java │ │ ├── IMediaPlayer.java │ │ ├── ISurfaceTextureHolder.java │ │ ├── ISurfaceTextureHost.java │ │ ├── IjkLibLoader.java │ │ ├── IjkMediaCodecInfo.java │ │ ├── IjkMediaMeta.java │ │ ├── IjkMediaPlayer.java │ │ ├── IjkTimedText.java │ │ ├── MediaInfo.java │ │ ├── MediaPlayerProxy.java │ │ ├── TextureMediaPlayer.java │ │ ├── annotations │ │ ├── AccessedByNative.java │ │ └── CalledByNative.java │ │ ├── exceptions │ │ └── IjkMediaException.java │ │ ├── ffmpeg │ │ └── FFmpegApi.java │ │ ├── misc │ │ ├── AndroidMediaFormat.java │ │ ├── AndroidTrackInfo.java │ │ ├── IAndroidIO.java │ │ ├── IMediaDataSource.java │ │ ├── IMediaFormat.java │ │ ├── ITrackInfo.java │ │ ├── IjkMediaFormat.java │ │ └── IjkTrackInfo.java │ │ └── pragma │ │ ├── DebugLog.java │ │ └── Pragma.java │ └── jniLibs │ ├── arm64-v8a │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ ├── armeabi-v7a │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ ├── armeabi │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ ├── x86 │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ └── x86_64 │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so ├── iplayer ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── android │ │ └── iplayer │ │ ├── base │ │ ├── AbstractMediaPlayer.java │ │ ├── BaseControlWidget.java │ │ ├── BaseController.java │ │ └── BasePlayer.java │ │ ├── controller │ │ ├── ControlWrapper.java │ │ ├── GestureController.java │ │ └── VideoController.java │ │ ├── interfaces │ │ ├── IBasePlayer.java │ │ ├── IControllerView.java │ │ ├── IGestureControl.java │ │ ├── IPlayerControl.java │ │ ├── IRenderView.java │ │ └── IVideoController.java │ │ ├── listener │ │ ├── OnMediaEventListener.java │ │ ├── OnPlayerEventListener.java │ │ └── OnWindowActionListener.java │ │ ├── manager │ │ ├── IVideoManager.java │ │ └── IWindowManager.java │ │ ├── media │ │ ├── IMediaPlayer.java │ │ ├── IVideoPlayer.java │ │ ├── MediaFactory.java │ │ └── core │ │ │ ├── MediaPlayer.java │ │ │ └── MediaPlayerFactory.java │ │ ├── model │ │ └── PlayerState.java │ │ ├── utils │ │ ├── AnimationUtils.java │ │ ├── AudioFocus.java │ │ ├── ILogger.java │ │ ├── PlayerUtils.java │ │ └── ThreadPool.java │ │ └── widget │ │ ├── VideoPlayer.java │ │ └── view │ │ ├── LayoutProvider.java │ │ ├── MediaTextureView.java │ │ ├── ScreenOrientationRotate.java │ │ └── WindowPlayerFloatView.java │ └── res │ ├── anim │ ├── window_in.xml │ └── window_out.xml │ ├── drawable │ └── player_locker_bg.xml │ ├── layout │ ├── player_base_video.xml │ ├── player_video_controller.xml │ └── player_window_float.xml │ ├── mipmap-xxhdpi │ ├── ic_player_locker_false.png │ ├── ic_player_locker_true.png │ └── ic_player_window_close.png │ ├── values-zh-rCN │ └── strings.xml │ └── values │ ├── ids.xml │ ├── strings.xml │ └── styles.xml ├── settings.gradle └── widget ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src ├── androidTest └── java │ └── com │ └── android │ └── iplayer │ └── ExampleInstrumentedTest.java ├── main ├── AndroidManifest.xml ├── java │ └── com │ │ └── android │ │ └── iplayer │ │ └── widget │ │ ├── WidgetFactory.java │ │ ├── controls │ │ ├── ControWindowView.java │ │ ├── ControlCompletionView.java │ │ ├── ControlFunctionBarView.java │ │ ├── ControlGestureView.java │ │ ├── ControlListView.java │ │ ├── ControlLoadingView.java │ │ ├── ControlStatusView.java │ │ └── ControlToolBarView.java │ │ └── view │ │ └── BatteryView.java └── res │ ├── drawable │ ├── player_battery_bg.xml │ ├── player_battery_line.xml │ ├── player_bg_bottom_controller.xml │ ├── player_bg_bottom_list_controller.xml │ ├── player_bg_btn_continue_play.xml │ ├── player_bottom_progress.xml │ ├── player_gesture_content_bg.xml │ ├── player_gesture_content_portrait_bg.xml │ ├── player_gesture_regulate_progress.xml │ ├── player_progress_loading.xml │ ├── player_seek_progress.xml │ ├── player_seek_thumb.xml │ └── player_surplus_time_bg.xml │ ├── layout │ ├── player_base_video.xml │ ├── player_battery_view.xml │ ├── player_control_completion.xml │ ├── player_control_functionbar.xml │ ├── player_control_gesture.xml │ ├── player_control_loading.xml │ ├── player_control_status.xml │ ├── player_control_toolar.xml │ ├── player_control_window.xml │ ├── player_list_view.xml │ ├── player_video_controller.xml │ └── player_window_float.xml │ ├── mipmap-xxhdpi │ ├── ic_player_back.png │ ├── ic_player_battery_in.png │ ├── ic_player_brightness.png │ ├── ic_player_full_scrrent.png │ ├── ic_player_gesture_last.png │ ├── ic_player_gesture_next.png │ ├── ic_player_locker.png │ ├── ic_player_menu.png │ ├── ic_player_menu_dlna.png │ ├── ic_player_menu_window.png │ ├── ic_player_mute_false.png │ ├── ic_player_mute_true.png │ ├── ic_player_pause.png │ ├── ic_player_play.png │ ├── ic_player_replay.png │ ├── ic_player_shadow_bottom.png │ ├── ic_player_shadow_top.png │ ├── ic_player_sound.png │ ├── ic_player_sound_off.png │ ├── ic_player_start.png │ ├── ic_player_window_full.png │ ├── ic_player_window_pause.png │ ├── ic_player_window_play.png │ └── ic_player_window_replay.png │ ├── values-zh-rCN │ └── strings.xml │ └── values │ ├── color.xml │ ├── dimens.xml │ └── strings.xml └── test └── java └── com └── android └── iplayer └── ExampleUnitTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | .idea 4 | /.idea 5 | /local.properties 6 | /.idea/caches 7 | /.idea/libraries 8 | /.idea/modules.xml 9 | /.idea/workspace.xml 10 | /.idea/navEditor.xml 11 | /.idea/assetWizardSettings.xml 12 | .DS_Store 13 | /build 14 | /captures 15 | .externalNativeBuild 16 | .cxx 17 | /assets -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release 3 | *.keystore 4 | *.txt -------------------------------------------------------------------------------- /app/src/androidTest/java/com/android/player/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.android.player; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("com.android.videoplayer", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/assets/test.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hty527/iPlayer/8d81703b36670d7f3c4f17c95e2d604b62f9c676/app/src/main/assets/test.mp4 -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/BaseContract.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base; 2 | 3 | /** 4 | * hty_Yuye@Outlook.com 5 | * 2019/5/6 6 | * MVP Base V 7 | */ 8 | 9 | public interface BaseContract { 10 | /** 11 | * presenter 12 | * @param view 13 | */ 14 | interface BasePresenter{ 15 | void attachView(V view); 16 | void detachView(); 17 | } 18 | 19 | /** 20 | * View 21 | */ 22 | interface BaseView{ 23 | 24 | /** 25 | * 开始加载中 26 | */ 27 | void showLoading(); 28 | 29 | /** 30 | * 错误、为空回调 31 | * @param code 0:为空 -1:失败 32 | * @param errorMsg 描述信息 33 | */ 34 | void showError(int code, String errorMsg); 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/adapter/BaseMultiItemAdapter.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base.adapter; 2 | 3 | import android.util.SparseIntArray; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import androidx.annotation.LayoutRes; 8 | import androidx.annotation.NonNull; 9 | import com.android.player.base.adapter.interfaces.MultiItemEntity; 10 | import com.android.player.base.adapter.widget.BaseViewHolder; 11 | import java.util.List; 12 | 13 | /** 14 | * created by hty 15 | * 2022/7/7 16 | * Desc:这是一个支持多布局类型的扩展,多条目布局类型适配器请继承此类,无比在构造方法里调用addItemType()添加你的布局类型和布局ID 17 | */ 18 | public abstract class BaseMultiItemAdapter extends BaseAdapter { 19 | 20 | private SparseIntArray layouts = new SparseIntArray();//存储多条目类型和布局 21 | 22 | public BaseMultiItemAdapter(List data) { 23 | super(data); 24 | } 25 | 26 | @Override 27 | protected View getItemTypeView(@NonNull ViewGroup viewGroup, int itemType) { 28 | return LayoutInflater.from(viewGroup.getContext()).inflate(layouts.get(itemType), viewGroup, false); 29 | } 30 | 31 | @Override 32 | public int getItemViewType(int position) { 33 | if(null!=getData()&&getData().size()>position){ 34 | T data = (T) getData().get(position); 35 | if(null!=data) { 36 | return data.getItemType(); 37 | } 38 | } 39 | return 0; 40 | } 41 | 42 | /** 43 | * 子适配器调用此方法添加自己的不同条目View ID 44 | * @param itemType 45 | * @param layoutResId 46 | */ 47 | protected void addItemType(int itemType, @LayoutRes int layoutResId){ 48 | layouts.put(itemType,layoutResId); 49 | } 50 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/adapter/BaseNoimalAdapter.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base.adapter; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import androidx.annotation.LayoutRes; 7 | import androidx.annotation.NonNull; 8 | import com.android.player.base.adapter.widget.BaseViewHolder; 9 | import java.util.List; 10 | 11 | /** 12 | * created by hty 13 | * 2022/7/7 14 | * Desc:这是一个单条目布局类型的适配器基类,单条目布局类型适配器请继承此类 15 | */ 16 | public abstract class BaseNoimalAdapter extends BaseAdapter { 17 | 18 | private int mRLayoutRes;//布局ID 19 | 20 | public BaseNoimalAdapter(@LayoutRes int resource){ 21 | this(resource,null); 22 | } 23 | 24 | public BaseNoimalAdapter(List data){ 25 | this(0,data); 26 | } 27 | 28 | public BaseNoimalAdapter(@LayoutRes int resource, List data){ 29 | super(data); 30 | super.mData=data; 31 | this.mRLayoutRes=resource; 32 | } 33 | 34 | @Override 35 | protected View getItemTypeView(@NonNull ViewGroup viewGroup, int itemType) { 36 | return LayoutInflater.from(viewGroup.getContext()).inflate(mRLayoutRes, viewGroup, false); 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/adapter/interfaces/MultiItemEntity.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base.adapter.interfaces; 2 | 3 | /** 4 | * created by hty 5 | * 2022/7/7 6 | * Desc:多类型布局的实体类必须继承实现此接口 7 | */ 8 | public interface MultiItemEntity { 9 | 10 | int getItemType(); 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/adapter/interfaces/OnItemChildClickListener.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base.adapter.interfaces; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * created by hty 7 | * 2022/7/1 8 | * Desc: 9 | */ 10 | public interface OnItemChildClickListener { 11 | void onItemClick(View view, int position, long itemId); 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/adapter/interfaces/OnItemClickListener.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base.adapter.interfaces; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * created by hty 7 | * 2022/7/1 8 | * Desc: 9 | */ 10 | public interface OnItemClickListener { 11 | void onItemClick(View view, int position, long itemId); 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/adapter/interfaces/OnLoadMorePresenter.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base.adapter.interfaces; 2 | 3 | /** 4 | * hty_Yuye@Outlook.com 5 | * 2022/7/7 6 | */ 7 | 8 | public interface OnLoadMorePresenter { 9 | //加载完成 10 | void onLoadComplete(); 11 | //结束,一般为空调用 12 | void onLoadEnd(); 13 | //加载失败 14 | void onLoadError(); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/base/adapter/widget/BaseViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.android.player.base.adapter.widget; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import androidx.annotation.NonNull; 6 | import androidx.recyclerview.widget.RecyclerView; 7 | 8 | /** 9 | * created by hty 10 | * 2022/7/1 11 | * Desc:基础的BaseViewHolder 12 | */ 13 | public class BaseViewHolder extends RecyclerView.ViewHolder { 14 | 15 | public BaseViewHolder(@NonNull View itemView) { 16 | super(itemView); 17 | } 18 | 19 | public View findViewById(int id){ 20 | return getView(id); 21 | } 22 | 23 | public T getView(int id) { 24 | if (null == itemView) return null; 25 | return (T) itemView.findViewById(id); 26 | } 27 | 28 | public Context getContext(){ 29 | if(null!=itemView){ 30 | return itemView.getContext(); 31 | } 32 | return null; 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/bean/Params.java: -------------------------------------------------------------------------------- 1 | package com.android.player.bean; 2 | 3 | /** 4 | * created by hty 5 | * 2022/7/11 6 | * Desc:这个时视频落地页接收处理悬浮窗窗口播放器时的临时中转参数 7 | */ 8 | public class Params { 9 | 10 | private long id; 11 | private String listJson; 12 | private String paramsJson; 13 | 14 | public long getId() { 15 | return id; 16 | } 17 | 18 | public void setId(long id) { 19 | this.id = id; 20 | } 21 | 22 | public String getListJson() { 23 | return listJson; 24 | } 25 | 26 | public void setListJson(String listJson) { 27 | this.listJson = listJson; 28 | } 29 | 30 | public String getParamsJson() { 31 | return paramsJson; 32 | } 33 | 34 | public void setParamsJson(String paramsJson) { 35 | this.paramsJson = paramsJson; 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/bean/Version.java: -------------------------------------------------------------------------------- 1 | package com.android.player.bean; 2 | 3 | /** 4 | * created by hty 5 | * 2022/8/1 6 | * Desc:预更新信息 7 | */ 8 | public class Version { 9 | 10 | private String code; 11 | private String descript; 12 | private String time; 13 | 14 | public String getCode() { 15 | return code; 16 | } 17 | 18 | public void setCode(String code) { 19 | this.code = code; 20 | } 21 | 22 | public String getDescript() { 23 | return descript; 24 | } 25 | 26 | public void setDescript(String descript) { 27 | this.descript = descript; 28 | } 29 | 30 | public String getTime() { 31 | return time; 32 | } 33 | 34 | public void setTime(String time) { 35 | this.time = time; 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/controller/LiveControllerControl.java: -------------------------------------------------------------------------------- 1 | package com.android.player.controller; 2 | 3 | import android.content.Context; 4 | import com.android.iplayer.base.BaseController; 5 | 6 | /** 7 | * created by hty 8 | * 2022/8/29 9 | * Desc:直播场景控制器 10 | */ 11 | public class LiveControllerControl extends BaseController { 12 | 13 | public LiveControllerControl(Context context) { 14 | super(context); 15 | } 16 | 17 | @Override 18 | public int getLayoutId() { 19 | return 0; 20 | } 21 | 22 | @Override 23 | public void initViews() { 24 | 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/net/OnDownloadListener.java: -------------------------------------------------------------------------------- 1 | package com.android.player.net; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Created by TinyHung@outlook.com 7 | * 2019/5/15 8 | * 文件下载监听 9 | */ 10 | 11 | public interface OnDownloadListener { 12 | 13 | /** 14 | * 下载百分比进度,回调在子线程 15 | * @param progress 百分比 16 | * @param totloLength 总长度 17 | * @param readLength 已下载长度 18 | */ 19 | void progress(int progress, long totloLength, long readLength); 20 | 21 | /** 22 | * 下载完成 23 | * @param file 文件信息 24 | */ 25 | void onSuccess(File file); 26 | 27 | /** 28 | * 下载失败 29 | * @param errorCode 错误码 30 | * @param message 描述信息 31 | */ 32 | void onError(int errorCode, String message); 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/net/OnResultCallBack.java: -------------------------------------------------------------------------------- 1 | package com.android.player.net; 2 | 3 | import com.google.gson.internal.$Gson$Types; 4 | import java.lang.reflect.ParameterizedType; 5 | import java.lang.reflect.Type; 6 | 7 | /** 8 | * Created by TinyHung@outlook.com 9 | * 2019/5/8 10 | * 配合OkHttpUtils数据交互的回调抽象类,代替interface接口 11 | * @param 最终返回的实体对象数据类型,如果不指定,则返回String类型实体对象 12 | */ 13 | 14 | public abstract class OnResultCallBack { 15 | 16 | //用户指定的数据类型 17 | private final Type mType; 18 | 19 | public OnResultCallBack(){ 20 | mType = getClassTypeParameter(getClass()); 21 | } 22 | 23 | /** 24 | * 获取当前类的多态 25 | * @param subclass class属性 26 | * @return 指定的泛型、多态 27 | */ 28 | private Type getClassTypeParameter(Class subclass) { 29 | Type superclass = subclass.getGenericSuperclass(); 30 | //JVM未识别到的,泛型、多态为空 31 | if (superclass instanceof Class) { 32 | return String.class; 33 | } 34 | ParameterizedType parameterized = (ParameterizedType) superclass; 35 | return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]); 36 | } 37 | 38 | /** 39 | * 返回实体Type 40 | * @return 泛型对象Type 41 | */ 42 | public Type getType(){ 43 | return mType; 44 | } 45 | 46 | /** 47 | * 响应成功 48 | * @param data 实体对象,没有传泛型默认是String.class类型 49 | */ 50 | public abstract void onResponse(T data); 51 | 52 | /** 53 | * 响应、解析失败 54 | * @param code 错误码 55 | * @param errorMsg 描述信息 56 | */ 57 | public abstract void onError(int code, String errorMsg); 58 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/pager/adapter/VideoListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.android.player.pager.adapter; 2 | 3 | import android.widget.FrameLayout; 4 | import android.widget.ImageView; 5 | import android.widget.TextView; 6 | import com.android.player.R; 7 | import com.android.player.base.adapter.BaseNoimalAdapter; 8 | import com.android.player.base.adapter.widget.BaseViewHolder; 9 | import com.android.player.pager.bean.VideoBean; 10 | import com.android.player.utils.GlideModel; 11 | import com.android.player.utils.ScreenUtils; 12 | import java.util.List; 13 | 14 | /** 15 | * created by hty 16 | * 2022/7/1 17 | * Desc:视频列表适配器 18 | */ 19 | public class VideoListAdapter extends BaseNoimalAdapter { 20 | 21 | private final int mItemHeight; 22 | 23 | public VideoListAdapter(List data) { 24 | super(R.layout.item_video_list,data); 25 | mItemHeight = ((ScreenUtils.getInstance().getScreenWidth() - ScreenUtils.getInstance().dpToPxInt(3f)) / 2) * 16 /11; 26 | } 27 | 28 | @Override 29 | protected void initItemView(BaseViewHolder viewHolder, int position, VideoBean data) { 30 | ((TextView) viewHolder.getView(R.id.item_title)).setText(data.getFilterTitleStr()); 31 | FrameLayout itemRootView = (FrameLayout) viewHolder.getView(R.id.item_root_content); 32 | itemRootView.getLayoutParams().height= mItemHeight; 33 | ImageView imageCover = (ImageView) viewHolder.getView(R.id.item_cover); 34 | GlideModel.getInstance().loadImage(imageCover,data.getCoverImgUrl()); 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/pager/base/BaseViewPager.java: -------------------------------------------------------------------------------- 1 | package com.android.player.pager.base; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | import android.widget.FrameLayout; 7 | import androidx.annotation.NonNull; 8 | import androidx.annotation.Nullable; 9 | import com.android.player.pager.interfaces.IViewPager; 10 | 11 | /** 12 | * created by hty 13 | * 2022/7/4 14 | * Desc:ViewPager 和 RecyclerView 的PagerSnapHelper通用基类 15 | */ 16 | public abstract class BaseViewPager extends FrameLayout implements IViewPager { 17 | 18 | protected static final String TAG="BaseViewPager"; 19 | protected int mPosition;//当前的ITEM位置 20 | 21 | public BaseViewPager(@NonNull Context context) { 22 | this(context,null); 23 | } 24 | 25 | public BaseViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { 26 | this(context, attrs,0); 27 | } 28 | 29 | public BaseViewPager(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 30 | super(context, attrs, defStyleAttr); 31 | View.inflate(context,getLayoutId(),this); 32 | initViews(); 33 | } 34 | 35 | /** 36 | * 返回布局文件ID 37 | * @return 布局文件ID 38 | */ 39 | protected abstract int getLayoutId(); 40 | 41 | /** 42 | * 初始化View 43 | */ 44 | protected abstract void initViews(); 45 | 46 | protected int getPosition() { 47 | return mPosition; 48 | } 49 | 50 | protected String getPositionStr(){ 51 | return ",position:"+ mPosition; 52 | } 53 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/pager/interfaces/IViewPager.java: -------------------------------------------------------------------------------- 1 | package com.android.player.pager.interfaces; 2 | 3 | /** 4 | * created by hty 5 | * 2022/7/4 6 | * Desc:RecyclerView Item 或ViewPager片段扩展接口 7 | */ 8 | public interface IViewPager { 9 | 10 | void prepare();//缓冲中 11 | 12 | void resume();//开始\恢复播放 13 | 14 | void pause();//暂停播放 15 | 16 | void stop();//停止播放 17 | 18 | void error();//播放失败了 19 | 20 | void onRelease();//生命周期-释放 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/pager/interfaces/OnViewPagerListener.java: -------------------------------------------------------------------------------- 1 | package com.android.player.pager.interfaces; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * created by hty 7 | * 2022/7/4 8 | * Desc:RecyclerView仿ViewPager的片段选择器器监听 9 | */ 10 | public interface OnViewPagerListener { 11 | /** 12 | * @param view 当前正在被释放的itemView 13 | * @param isNext 是否还有下一条视频 true:有 false:没有 14 | * @param position 当前被释放的item位置 15 | */ 16 | void onPageRelease(View view,boolean isNext, int position); 17 | 18 | /** 19 | * @param view 当前选中的itemView 20 | * @param position 当前选中的item位置 21 | * @param isBottom 是否滑动到底部 true:当前position已经到<=(最后一条数据-2)的位置了,在这里加载更多数据 flase:否 22 | */ 23 | void onPageSelected(View view, int position, boolean isBottom); 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/pager/widget/MarqueeTextView.java: -------------------------------------------------------------------------------- 1 | package com.android.player.pager.widget; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.content.Context; 5 | import android.util.AttributeSet; 6 | import android.widget.TextView; 7 | 8 | /** 9 | * created by hty 10 | * 2022/7/5 11 | * Desc: 12 | */ 13 | @SuppressLint("AppCompatCustomView") 14 | public class MarqueeTextView extends TextView { 15 | 16 | public MarqueeTextView(Context context) { 17 | super(context); 18 | } 19 | 20 | public MarqueeTextView(Context context, AttributeSet attrs) { 21 | super(context, attrs); 22 | } 23 | 24 | public boolean isFocused() { 25 | return true; 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/ui/widget/GlideCircleTransform.java: -------------------------------------------------------------------------------- 1 | package com.android.player.ui.widget; 2 | 3 | import android.graphics.Bitmap; 4 | import android.graphics.BitmapShader; 5 | import android.graphics.Canvas; 6 | import android.graphics.Paint; 7 | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 8 | import com.bumptech.glide.load.resource.bitmap.CircleCrop; 9 | 10 | /** 11 | * Created by TinyHung@outlook.com 12 | * Glide 3.x 圆形加载,实现Context构造,transform和getId。两个函数 13 | * Glide 4.x 直接继承CircleCrop,无需实现构造和任何方法 14 | */ 15 | public class GlideCircleTransform extends CircleCrop { 16 | 17 | public GlideCircleTransform(){ 18 | 19 | } 20 | 21 | @Override 22 | protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { 23 | return circleCrop(pool, toTransform); 24 | } 25 | 26 | private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { 27 | if (source == null) return null; 28 | 29 | int size = Math.min(source.getWidth(), source.getHeight()); 30 | int x = (source.getWidth() - size) / 2; 31 | int y = (source.getHeight() - size) / 2; 32 | Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); 33 | 34 | Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); 35 | if (result == null) { 36 | result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); 37 | } 38 | Canvas canvas = new Canvas(result); 39 | Paint paint = new Paint(); 40 | paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); 41 | paint.setAntiAlias(true); 42 | float r = size / 2f; 43 | canvas.drawCircle(r, r, r, paint); 44 | return result; 45 | } 46 | 47 | // @Override 48 | // public String getId() { 49 | // 50 | // } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/ui/widget/ListPlayerHolder.java: -------------------------------------------------------------------------------- 1 | package com.android.player.ui.widget; 2 | 3 | import android.view.View; 4 | import android.widget.FrameLayout; 5 | import androidx.annotation.NonNull; 6 | import com.android.player.R; 7 | import com.android.player.base.adapter.widget.BaseViewHolder; 8 | 9 | /** 10 | * created by hty 11 | * 2022/7/2 12 | * Desc:列表播放ViewHolder 13 | */ 14 | public class ListPlayerHolder extends BaseViewHolder { 15 | 16 | private FrameLayout mPlayerContainer; 17 | 18 | public ListPlayerHolder(@NonNull View itemView) { 19 | super(itemView); 20 | if(null!=itemView&&null!=itemView.findViewById(R.id.item_player_container)){ 21 | mPlayerContainer=itemView.findViewById(R.id.item_player_container); 22 | } 23 | itemView.setTag(this); 24 | } 25 | 26 | public FrameLayout getPlayerContainer() { 27 | return mPlayerContainer; 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/utils/Logger.java: -------------------------------------------------------------------------------- 1 | package com.android.player.utils; 2 | 3 | import android.util.Log; 4 | import com.android.player.BuildConfig; 5 | 6 | /** 7 | * created by hty 8 | * 2022/7/1 9 | * Desc: 10 | */ 11 | public class Logger { 12 | 13 | public static void pd(String TAG, String message){ 14 | if(BuildConfig.DEBUG){ 15 | Log.println(Log.DEBUG,TAG,message); 16 | } 17 | } 18 | 19 | public static void pe(String TAG, String message){ 20 | if(BuildConfig.DEBUG){ 21 | Log.println(Log.ERROR,TAG,message); 22 | } 23 | } 24 | 25 | public static void pw(String TAG, String message){ 26 | if(BuildConfig.DEBUG){ 27 | Log.println(Log.WARN,TAG,message); 28 | } 29 | } 30 | 31 | public static void pi(String TAG, String message){ 32 | if(BuildConfig.DEBUG){ 33 | Log.println(Log.INFO,TAG,message); 34 | } 35 | } 36 | public static void d(String TAG, String message) { 37 | if(BuildConfig.DEBUG){ 38 | Log.d(TAG,message); 39 | } 40 | } 41 | 42 | public static void e(String TAG, String message) { 43 | if(BuildConfig.DEBUG){ 44 | Log.e(TAG,message); 45 | } 46 | } 47 | 48 | public static void v(String TAG, String message) { 49 | if(BuildConfig.DEBUG){ 50 | Log.e(TAG,message); 51 | } 52 | } 53 | 54 | public static void w(String TAG, String message) { 55 | if(BuildConfig.DEBUG){ 56 | Log.w(TAG,message); 57 | } 58 | } 59 | 60 | public static void i(String TAG, String message) { 61 | if(BuildConfig.DEBUG){ 62 | Log.i(TAG,message); 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/video/bean/OpenEyesAuthor.java: -------------------------------------------------------------------------------- 1 | package com.android.player.video.bean; 2 | 3 | /** 4 | * TinyHung@Outlook.com 5 | * 2019/4/8 6 | */ 7 | 8 | public class OpenEyesAuthor { 9 | 10 | /** 11 | * followed : false 12 | * itemId : 2162 13 | * itemType : author 14 | */ 15 | private String icon; 16 | private int id; 17 | private String name; 18 | 19 | public String getIcon() { 20 | return icon; 21 | } 22 | 23 | public void setIcon(String icon) { 24 | this.icon = icon; 25 | } 26 | 27 | public int getId() { 28 | return id; 29 | } 30 | 31 | public void setId(int id) { 32 | this.id = id; 33 | } 34 | 35 | public String getName() { 36 | return name; 37 | } 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/video/bean/OpenEyesContent.java: -------------------------------------------------------------------------------- 1 | package com.android.player.video.bean; 2 | 3 | /** 4 | * TinyHung@Outlook.com 5 | * 2019/4/8 6 | */ 7 | 8 | public class OpenEyesContent { 9 | 10 | private long id; 11 | //squareCardCollection 12 | private String type; 13 | private OpenEyesIndexItemBean data; 14 | 15 | public long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getType() { 24 | return type; 25 | } 26 | 27 | public void setType(String type) { 28 | this.type = type; 29 | } 30 | 31 | public OpenEyesIndexItemBean getData() { 32 | return data; 33 | } 34 | 35 | public void setData(OpenEyesIndexItemBean data) { 36 | this.data = data; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/video/bean/OpenEyesIndexInfo.java: -------------------------------------------------------------------------------- 1 | package com.android.player.video.bean; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * TinyHung@Outlook.com 7 | * 2019/4/8 8 | * 开眼视频 9 | */ 10 | 11 | public class OpenEyesIndexInfo { 12 | 13 | //一维数组 14 | private List itemList; 15 | 16 | private List videoList; 17 | 18 | public List getItemList() { 19 | return itemList; 20 | } 21 | 22 | public void setItemList(List itemList) { 23 | this.itemList = itemList; 24 | } 25 | 26 | public List getVideoList() { 27 | return videoList; 28 | } 29 | 30 | public void setVideoList(List videoList) { 31 | this.videoList = videoList; 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/video/contract/VideoListContract.java: -------------------------------------------------------------------------------- 1 | package com.android.player.video.contract; 2 | 3 | import com.android.player.base.BaseContract; 4 | import com.android.player.video.bean.OpenEyesIndexItemBean; 5 | import java.util.List; 6 | 7 | /** 8 | * hty_Yuye@Outlook.com 9 | * 2019/5/6 10 | * Index Video Contract 11 | */ 12 | 13 | public interface VideoListContract { 14 | 15 | interface View extends BaseContract.BaseView{ 16 | 17 | /** 18 | * 显示视频列表 19 | * @param data 视频列表 20 | * @param isRestart 是否从第一页开始加载的 21 | */ 22 | void showVideos(List data, boolean isRestart); 23 | } 24 | 25 | interface Presenter extends BaseContract.BasePresenter{ 26 | 27 | /** 28 | * 获取主页的视频列表 29 | * @param isRestart 是否重新开始? 30 | */ 31 | void getIndexVideos(boolean isRestart); 32 | 33 | /** 34 | * 根据URL获取视频列表 35 | * @param url url 36 | * @param isRestart 是否从第一页开始加载的 37 | */ 38 | void getVideosByUrl(String url, boolean isRestart); 39 | 40 | /** 41 | * 根据视频ID获取推荐列表 42 | * @param videoID 视频ID 43 | */ 44 | void getVideosByVideo(String videoID); 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/video/listener/OnMenuActionListener.java: -------------------------------------------------------------------------------- 1 | package com.android.player.video.listener; 2 | 3 | /** 4 | * created by hty 5 | * 2022/7/11 6 | * Desc:菜单功能交互监听器 7 | */ 8 | public interface OnMenuActionListener { 9 | /** 10 | * @param speed 倍速 从0.5f-2.0f 11 | */ 12 | void onSpeed(float speed); 13 | 14 | /** 15 | * @param zoomModel 画面缩放模式,参考IMediaPlayer定义的常量 16 | */ 17 | void onZoom(int zoomModel); 18 | 19 | /** 20 | * @param scale 画面显示比例 21 | */ 22 | void onScale(int scale); 23 | 24 | /** 25 | * @param mute 是否静音 true:无声 false:跟随系统音量 26 | */ 27 | void onMute(boolean mute); 28 | 29 | /** 30 | * @param mirror 是否镜像翻转 true:镜像翻转 false:正常 31 | */ 32 | void onMirror(boolean mirror); 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/player/video/model/IndexVideoEngin.java: -------------------------------------------------------------------------------- 1 | package com.android.player.video.model; 2 | 3 | import com.android.player.net.BaseEngin; 4 | import com.android.player.net.OnResultCallBack; 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | /** 9 | * hty_Yuye@Outlook.com 10 | * 2019/5/6 11 | * Index Video Model 12 | */ 13 | 14 | public class IndexVideoEngin extends BaseEngin { 15 | 16 | /** 17 | * 获取视频列为表 18 | * @param page 页眉 19 | * @param callBack 回调 20 | */ 21 | public void getIndexVideos(int page, OnResultCallBack callBack){ 22 | Map params=new HashMap<>(); 23 | params.put("page",page+""); 24 | params.put("udid","a53873ffaa4430bbb41ea178c1187e97c4b3c4a"); 25 | sendGetRequst("http://baobab.kaiyanapp.com/api/v5/index/tab/allRec",params,callBack); 26 | } 27 | 28 | /** 29 | * 根据URL获取视频列表 30 | * @param url url 31 | * @param page 页眉 32 | * @param callBack 回调 33 | */ 34 | public void getVideosByUrl(String url, int page, OnResultCallBack callBack){ 35 | Map params=new HashMap<>(); 36 | params.put("page",page+""); 37 | params.put("udid","a53873ffaa4430bbb41ea178c1187e97c4b3c4a"); 38 | sendGetRequst("http://baobab.kaiyanapp.com/api/v2/"+url,params,callBack); 39 | } 40 | 41 | /** 42 | * 根据视频ID获取视频列表 43 | * @param videoID 视频ID 44 | * @param callBack 回调 45 | */ 46 | public void getVideosByVideo(String videoID, OnResultCallBack callBack){ 47 | Map params=new HashMap<>(); 48 | params.put("id",videoID); 49 | params.put("udid","a53873ffaa4430bbb41ea178c1187e97c4b3c4a"); 50 | sendGetRequst("http://baobab.kaiyanapp.com/api/v4/video/related",params,callBack); 51 | } 52 | } -------------------------------------------------------------------------------- /app/src/main/res/anim/bottom_menu_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/bottom_menu_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/menu_live_text_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/menu_text_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_add_player.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_avatar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_btn_continue_play.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_buy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_controller.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_item_avatar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_item_duration.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_item_follow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_item_video_player_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_live_play.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_main_item_buttom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_main_item_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_main_item_dot.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_main_item_full.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_main_item_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_menu_center.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_menu_center2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_menu_center_live.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_menu_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_menu_left_live.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_menu_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_menu_right_live.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_play.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_player_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shape_draw_bottom_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shape_draw_top_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shiyong.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shiyong_bord.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shiyong_bord_tr.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_shiyong_tr.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/fg_video_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/input_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/input_bg2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/item_bg_player_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pb_bottom_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pb_video_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progressbar_drawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sb_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sb_video_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_pad.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 13 | 17 | 23 | 28 | 29 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_pip_player.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 |