├── .gitignore
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
├── proguardMapping.txt
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── easefun
│ │ └── polyv
│ │ └── cloudclassdemo
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ ├── demo.html
│ │ └── testAnimation.js
│ ├── java
│ │ └── com
│ │ │ └── easefun
│ │ │ └── polyv
│ │ │ └── cloudclassdemo
│ │ │ ├── PolyvCloudClassApp.java
│ │ │ ├── login
│ │ │ └── PolyvCloudClassLoginActivity.java
│ │ │ └── watch
│ │ │ ├── IPolyvHomeProtocol.java
│ │ │ ├── PolyvCloudClassHomeActivity.java
│ │ │ ├── PolyvDemoClient.java
│ │ │ ├── chat
│ │ │ ├── PolyvChatBaseFragment.java
│ │ │ ├── PolyvChatFragmentAdapter.java
│ │ │ ├── PolyvChatGroupFragment.java
│ │ │ ├── PolyvChatPrivateFragment.java
│ │ │ ├── adapter
│ │ │ │ ├── PolyvChatListAdapter.java
│ │ │ │ ├── PolyvEmoListAdapter.java
│ │ │ │ ├── PolyvViewHolderCreateFactory.java
│ │ │ │ ├── itemview
│ │ │ │ │ ├── PolyvCustomQMessageItemView.java
│ │ │ │ │ ├── PolyvCustomTipMessageItemView.java
│ │ │ │ │ └── PolyvItemViewFactoy.java
│ │ │ │ └── viewholder
│ │ │ │ │ ├── PolyvReceiveMessageHolder.java
│ │ │ │ │ ├── PolyvSendMessageHolder.java
│ │ │ │ │ └── PolyvTipsMessageHolder.java
│ │ │ ├── config
│ │ │ │ └── PolyvChatUIConfig.java
│ │ │ ├── event
│ │ │ │ └── PolyvChatMessageEvent.java
│ │ │ ├── imageScan
│ │ │ │ ├── PolyvChatImageFragment.java
│ │ │ │ ├── PolyvChatImageViewer.java
│ │ │ │ └── PolyvChatImgFragmentStatePagerAdapter.java
│ │ │ ├── liveInfo
│ │ │ │ ├── PolyvLiveInfoFragment.java
│ │ │ │ ├── PolyvSafeWebView.java
│ │ │ │ └── PolyvWebViewHelper.java
│ │ │ ├── menu
│ │ │ │ ├── PolyvCustomMenuFragment.java
│ │ │ │ └── PolyvTuWenMenuFragment.java
│ │ │ ├── playback
│ │ │ │ └── PolyvChatPlaybackFragment.java
│ │ │ └── point_reward
│ │ │ │ ├── dialog
│ │ │ │ ├── PolyvPointRewardCheckItem.java
│ │ │ │ ├── PolyvPointRewardDialog.java
│ │ │ │ ├── PolyvPointRewardFragment.java
│ │ │ │ └── PolyvPointRewardVPFragmentAdapter.java
│ │ │ │ └── effect
│ │ │ │ ├── IPolyvPointRewardEventProducer.java
│ │ │ │ ├── PolyvPointRewardEffectQueue.java
│ │ │ │ ├── PolyvPointRewardEffectWidget.java
│ │ │ │ └── PolyvPointRewardStrokeTextView.java
│ │ │ ├── danmu
│ │ │ └── PolyvDanmuFragment.java
│ │ │ ├── linkMic
│ │ │ ├── IPolyvDataBinder.java
│ │ │ ├── IPolyvViewVisibilityChangedListener.java
│ │ │ ├── PolyvLinkMicAdapter.java
│ │ │ ├── PolyvLinkMicDataBinder.java
│ │ │ ├── PolyvNormalLiveLinkMicDataBinder.java
│ │ │ └── widget
│ │ │ │ ├── IPolyvRotateBaseView.java
│ │ │ │ ├── PolyvLinkMicBottomView.java
│ │ │ │ ├── PolyvLinkMicListView.java
│ │ │ │ ├── PolyvLinkMicParent.java
│ │ │ │ ├── PolyvLinkMicWaveView.java
│ │ │ │ ├── PolyvNormalLinkMicView.java
│ │ │ │ └── PolyvSmoothRoundProgressView.java
│ │ │ └── player
│ │ │ ├── PolyvOrientoinListener.java
│ │ │ ├── live
│ │ │ ├── PolyvCloudClassMediaController.java
│ │ │ ├── PolyvCloudClassVideoHelper.java
│ │ │ ├── PolyvCloudClassVideoItem.java
│ │ │ └── widget
│ │ │ │ ├── IPolyvLandscapeDanmuSender.java
│ │ │ │ ├── OrientationSensibleLinearLayout.java
│ │ │ │ ├── PolyvChatPullLayout.java
│ │ │ │ ├── PolyvCloudClassAudioModeView.java
│ │ │ │ ├── PolyvCloudClassMoreLayout.java
│ │ │ │ ├── PolyvLandscapeDanmuSendPanel.java
│ │ │ │ └── PolyvTeacherInfoLayout.java
│ │ │ └── playback
│ │ │ ├── PolyvPlaybackMediaController.java
│ │ │ ├── PolyvPlaybackVideoHelper.java
│ │ │ └── PolyvPlaybackVideoItem.java
│ └── res
│ │ ├── drawable-hdpi
│ │ └── ic_launcher.png
│ │ ├── drawable-mdpi
│ │ └── ic_launcher.png
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable-xhdpi
│ │ ├── close.png
│ │ ├── handle.png
│ │ ├── hangup.png
│ │ ├── ic_launcher.png
│ │ ├── img_cemera_switch.png
│ │ ├── login_close.png
│ │ ├── logo_polyv.png
│ │ ├── polyv_cloudclass_logo.png
│ │ ├── putuphands.png
│ │ ├── refresh.png
│ │ ├── select.png
│ │ ├── tab_bg.png
│ │ ├── topbar_blue.png
│ │ ├── topbar_green.png
│ │ └── topbar_orange.png
│ │ ├── drawable-xxhdpi
│ │ ├── ic_launcher.png
│ │ ├── polyv_logo.png
│ │ └── polyv_no_stream.png
│ │ ├── drawable
│ │ ├── ic_launcher_background.xml
│ │ ├── link_mic_default_backgroud.xml
│ │ ├── plv_selector_point_reward_checkbox.xml
│ │ ├── polyv_audio_mode_textview.xml
│ │ ├── polyv_camer_back.xml
│ │ ├── polyv_color_topic_tab_bottom_selector.xml
│ │ ├── polyv_color_topic_tab_text_selector.xml
│ │ ├── polyv_corner_tab_line.xml
│ │ ├── polyv_link_mic_nick_bg.xml
│ │ ├── polyv_live_float_corner_style.xml
│ │ ├── polyv_login_bg_normal.xml
│ │ ├── polyv_login_bg_select.xml
│ │ ├── polyv_login_selector.xml
│ │ ├── polyv_login_text_selector.xml
│ │ ├── polyv_mic_phone_selector.xml
│ │ ├── selector_send_danmu_btn.xml
│ │ ├── shape_et_send_danmu.xml
│ │ ├── shape_tv_send_danmu.xml
│ │ └── text_color_send_danmu_btn.xml
│ │ ├── layout
│ │ ├── link_mic_bottom.xml
│ │ ├── link_mic_layout.xml
│ │ ├── link_mic_scroll_item.xml
│ │ ├── normal_live_link_mic_item.xml
│ │ ├── normal_live_link_mic_layout.xml
│ │ ├── plv_fragment_point_reward.xml
│ │ ├── plv_widget_point_reward_effect.xml
│ │ ├── polyv_activity_cloudclass_home.xml
│ │ ├── polyv_activity_cloudclass_login.xml
│ │ ├── polyv_chat_input_imageviewer_container.xml
│ │ ├── polyv_chat_layout.xml
│ │ ├── polyv_chat_tab_item_layout.xml
│ │ ├── polyv_cloud_class_audio_mode_view.xml
│ │ ├── polyv_cloud_class_item_bitrate.xml
│ │ ├── polyv_cloud_class_participant_login.xml
│ │ ├── polyv_cloudclass_audio_mode_layout.xml
│ │ ├── polyv_cloudclass_controller.xml
│ │ ├── polyv_cloudclass_controller_land.xml
│ │ ├── polyv_cloudclass_controller_more.xml
│ │ ├── polyv_cloudclass_controller_port.xml
│ │ ├── polyv_cloudclass_item.xml
│ │ ├── polyv_cloudclass_send_danmu.xml
│ │ ├── polyv_cloudclass_videoview_main_layout.xml
│ │ ├── polyv_fragment_cloudclass_danmu.xml
│ │ ├── polyv_fragment_custommenu.xml
│ │ ├── polyv_fragment_liveintroduce.xml
│ │ ├── polyv_live_bitrate_popu_layout.xml
│ │ ├── polyv_playback_login_layout.xml
│ │ ├── polyv_playback_video_item.xml
│ │ ├── polyv_playback_videoview_main_layout.xml
│ │ └── polyv_top_controller.xml
│ │ ├── values
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── values.xml
│ │ └── xml
│ │ └── provider_paths.xml
│ └── test
│ └── java
│ └── com
│ └── easefun
│ └── polyv
│ └── cloudclassdemo
│ └── ExampleUnitTest.java
├── build.gradle
├── commonui
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── easefun
│ │ └── polyv
│ │ └── commonui
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ ├── app.973c3fa15a0659d368b8.bundle.js
│ │ ├── css
│ │ │ └── app.973c3fa15a0659d368b8.css
│ │ ├── fonts
│ │ │ └── Helvetica-Bold-Oblique_22454.ttf
│ │ ├── images
│ │ │ └── lottery-start.56681d8.gif
│ │ ├── index.html
│ │ └── vendors~app.973c3fa15a0659d368b8.bundle.js
│ ├── java
│ │ └── com
│ │ │ └── easefun
│ │ │ └── polyv
│ │ │ └── commonui
│ │ │ ├── PolyvCommonMediacontroller.java
│ │ │ ├── PolyvCommonVideoHelper.java
│ │ │ ├── adapter
│ │ │ ├── PolyvBaseRecyclerViewAdapter.java
│ │ │ ├── PolyvHeaderViewRecyclerAdapter.java
│ │ │ ├── itemview
│ │ │ │ └── IPolyvCustomMessageBaseItemView.java
│ │ │ └── viewholder
│ │ │ │ └── ClickableViewHolder.java
│ │ │ ├── base
│ │ │ ├── PolyvBaseActivity.java
│ │ │ └── PolyvBaseFragment.java
│ │ │ ├── modle
│ │ │ └── PolyvCustomQBean.java
│ │ │ ├── player
│ │ │ ├── IPolyvBusinessMediaController.java
│ │ │ ├── IPolyvVideoItem.java
│ │ │ ├── PolyvMediaInfoType.java
│ │ │ ├── PolyvVodVideoHelper.java
│ │ │ ├── adapter
│ │ │ │ └── PolyvBitRateAdapter.java
│ │ │ ├── ppt
│ │ │ │ ├── IPolyvPPTItem.java
│ │ │ │ ├── PolyvPPTItem.java
│ │ │ │ └── PolyvPPTView.java
│ │ │ └── widget
│ │ │ │ ├── PolyvLightTipsView.java
│ │ │ │ ├── PolyvLoadingLayout.java
│ │ │ │ ├── PolyvPlayerLogoView.java
│ │ │ │ ├── PolyvPlayerRetryLayout.java
│ │ │ │ ├── PolyvProgressTipsView.java
│ │ │ │ ├── PolyvScreenshotTipsView.java
│ │ │ │ ├── PolyvSlideSwitchView.java
│ │ │ │ ├── PolyvSoftView.java
│ │ │ │ ├── PolyvVodMediaController.java
│ │ │ │ ├── PolyvVodVideoItem.java
│ │ │ │ └── PolyvVolumeTipsView.java
│ │ │ ├── utils
│ │ │ ├── PLVNetworkBroadcastReceiver.java
│ │ │ ├── PolyvBezierEvaluator.java
│ │ │ ├── PolyvChatEventBus.java
│ │ │ ├── PolyvFaceManager.java
│ │ │ ├── PolyvFileProvider.java
│ │ │ ├── PolyvPictureUtils.java
│ │ │ ├── PolyvSingleRelayBus.java
│ │ │ ├── PolyvTextImageLoader.java
│ │ │ ├── PolyvToast.java
│ │ │ ├── PolyvUriPathHelper.java
│ │ │ ├── PolyvWebUtils.java
│ │ │ └── imageloader
│ │ │ │ ├── IImageLoadEngine.java
│ │ │ │ ├── IPolyvProgressListener.java
│ │ │ │ ├── PolyvImageLoader.java
│ │ │ │ └── glide
│ │ │ │ ├── CompressTransformation.java
│ │ │ │ ├── GlideImageLoadEngine.java
│ │ │ │ └── progress
│ │ │ │ ├── PolyvMyProgressManager.java
│ │ │ │ ├── PolyvOnProgressListener.java
│ │ │ │ ├── PolyvProgressLibraryGlideModule.java
│ │ │ │ └── PolyvProgressResponseBody.java
│ │ │ └── widget
│ │ │ ├── PolyvAnswerView.java
│ │ │ ├── PolyvBeadWidget.java
│ │ │ ├── PolyvChatRecyclerView.java
│ │ │ ├── PolyvCircleProgressView.java
│ │ │ ├── PolyvCornerBgTextView.java
│ │ │ ├── PolyvGreetingTextView.java
│ │ │ ├── PolyvGreetingView.java
│ │ │ ├── PolyvLikeIconView.java
│ │ │ ├── PolyvLookAtMeView.java
│ │ │ ├── PolyvMarqueeTextView.java
│ │ │ ├── PolyvMediaCheckView.java
│ │ │ ├── PolyvPressedHalfBgView.java
│ │ │ ├── PolyvPressedImageView.java
│ │ │ ├── PolyvRoundImageView.java
│ │ │ ├── PolyvScaleImageView.java
│ │ │ ├── PolyvSimpleViewPager.java
│ │ │ ├── PolyvTouchContainerView.java
│ │ │ └── badgeview
│ │ │ ├── Badge.java
│ │ │ ├── BadgeAnimator.java
│ │ │ ├── DisplayUtil.java
│ │ │ ├── MathUtil.java
│ │ │ └── QBadgeView.java
│ └── res
│ │ ├── anim
│ │ ├── plv_point_reward_enter.xml
│ │ ├── plv_point_reward_exit.xml
│ │ ├── polyv_ltor_right.xml
│ │ ├── polyv_rtol_right.xml
│ │ └── polyv_scale_s.xml
│ │ ├── color
│ │ ├── polyv_bit_text_color.xml
│ │ ├── polyv_bt_color_selected_bgplay.xml
│ │ └── polyv_tv_text_selected_send_message.xml
│ │ ├── drawable-hdpi
│ │ ├── polyv_1.png
│ │ ├── polyv_10.png
│ │ ├── polyv_100.png
│ │ ├── polyv_11.png
│ │ ├── polyv_12.png
│ │ ├── polyv_13.png
│ │ ├── polyv_14.png
│ │ ├── polyv_15.png
│ │ ├── polyv_16.png
│ │ ├── polyv_17.png
│ │ ├── polyv_18.png
│ │ ├── polyv_19.png
│ │ ├── polyv_2.png
│ │ ├── polyv_20.png
│ │ ├── polyv_21.png
│ │ ├── polyv_22.png
│ │ ├── polyv_23.png
│ │ ├── polyv_24.png
│ │ ├── polyv_25.png
│ │ ├── polyv_26.png
│ │ ├── polyv_27.png
│ │ ├── polyv_28.png
│ │ ├── polyv_29.png
│ │ ├── polyv_3.png
│ │ ├── polyv_30.png
│ │ ├── polyv_31.png
│ │ ├── polyv_32.png
│ │ ├── polyv_33.png
│ │ ├── polyv_34.png
│ │ ├── polyv_35.png
│ │ ├── polyv_36.png
│ │ ├── polyv_37.png
│ │ ├── polyv_38.png
│ │ ├── polyv_39.png
│ │ ├── polyv_4.png
│ │ ├── polyv_40.png
│ │ ├── polyv_41.png
│ │ ├── polyv_42.png
│ │ ├── polyv_43.png
│ │ ├── polyv_44.png
│ │ ├── polyv_45.png
│ │ ├── polyv_46.png
│ │ ├── polyv_47.png
│ │ ├── polyv_48.png
│ │ ├── polyv_49.png
│ │ ├── polyv_5.png
│ │ ├── polyv_50.png
│ │ ├── polyv_51.png
│ │ ├── polyv_52.png
│ │ ├── polyv_53.png
│ │ ├── polyv_54.png
│ │ ├── polyv_55.png
│ │ ├── polyv_56.png
│ │ ├── polyv_57.png
│ │ ├── polyv_58.png
│ │ ├── polyv_59.png
│ │ ├── polyv_6.png
│ │ ├── polyv_60.png
│ │ ├── polyv_61.png
│ │ ├── polyv_62.png
│ │ ├── polyv_63.png
│ │ ├── polyv_64.png
│ │ ├── polyv_65.png
│ │ ├── polyv_66.png
│ │ ├── polyv_67.png
│ │ ├── polyv_68.png
│ │ ├── polyv_69.png
│ │ ├── polyv_7.png
│ │ ├── polyv_70.png
│ │ ├── polyv_71.png
│ │ ├── polyv_72.png
│ │ ├── polyv_73.png
│ │ ├── polyv_74.png
│ │ ├── polyv_75.png
│ │ ├── polyv_76.png
│ │ ├── polyv_77.png
│ │ ├── polyv_78.png
│ │ ├── polyv_79.png
│ │ ├── polyv_8.png
│ │ ├── polyv_80.png
│ │ ├── polyv_81.png
│ │ ├── polyv_82.png
│ │ ├── polyv_83.png
│ │ ├── polyv_84.png
│ │ ├── polyv_85.png
│ │ ├── polyv_86.png
│ │ ├── polyv_87.png
│ │ ├── polyv_88.png
│ │ ├── polyv_89.png
│ │ ├── polyv_9.png
│ │ ├── polyv_90.png
│ │ ├── polyv_91.png
│ │ ├── polyv_92.png
│ │ ├── polyv_93.png
│ │ ├── polyv_94.png
│ │ ├── polyv_95.png
│ │ ├── polyv_96.png
│ │ ├── polyv_97.png
│ │ ├── polyv_98.png
│ │ └── polyv_99.png
│ │ ├── drawable-xhdpi
│ │ ├── back.png
│ │ ├── brate.png
│ │ ├── btn_call_mic.png
│ │ ├── btn_cup.png
│ │ ├── btn_eraser_off.png
│ │ ├── btn_exchange.png
│ │ ├── btn_exchange_un.png
│ │ ├── btn_look_at_me.png
│ │ ├── btn_pen_disable.png
│ │ ├── btn_showmic.png
│ │ ├── btn_showmic_right.png
│ │ ├── btnbye.png
│ │ ├── btncamex.png
│ │ ├── btncamoff.png
│ │ ├── btncamon.png
│ │ ├── btneraser.png
│ │ ├── btnmicoff.png
│ │ ├── btnmicon.png
│ │ ├── btnpen.png
│ │ ├── call_gray_disable.png
│ │ ├── camera.png
│ │ ├── camera_default.png
│ │ ├── close.png
│ │ ├── controller_danmu_close.png
│ │ ├── controller_danmu_open.png
│ │ ├── controller_exchange.png
│ │ ├── controller_fullscreen.png
│ │ ├── controller_more.png
│ │ ├── controller_pause_live.png
│ │ ├── controller_play_live.png
│ │ ├── emoji.png
│ │ ├── emoji_pressed.png
│ │ ├── flower.png
│ │ ├── hostonly_off.png
│ │ ├── hostonly_on.png
│ │ ├── ic_call_gray.png
│ │ ├── ic_link_mic_off.png
│ │ ├── ic_micoff.png
│ │ ├── ic_nocam.png
│ │ ├── ic_talker.png
│ │ ├── link_mic_head_back.9.png
│ │ ├── nostream_placeholder.png
│ │ ├── pause.png
│ │ ├── play.png
│ │ ├── plv_more.png
│ │ ├── polyv_backspace_android.png
│ │ ├── polyv_btn_likes.png
│ │ ├── polyv_btn_platform_switch_close.png
│ │ ├── polyv_btn_platform_switch_handle.png
│ │ ├── polyv_btn_platform_switch_open.png
│ │ ├── polyv_default_teacher.png
│ │ ├── polyv_gift_flower.png
│ │ ├── polyv_icon_like.png
│ │ ├── polyv_icon_likes.png
│ │ ├── polyv_icon_praise.png
│ │ ├── polyv_icon_publisher.png
│ │ ├── polyv_icon_stop.png
│ │ ├── polyv_icon_viewer.png
│ │ ├── polyv_img_avatar_default.png
│ │ ├── polyv_missing_face.png
│ │ ├── ppt.png
│ │ ├── ppt_default.png
│ │ ├── sound0001.png
│ │ ├── sound0002.png
│ │ ├── sound0003.png
│ │ ├── sound0004.png
│ │ ├── sound0005.png
│ │ ├── sound0006.png
│ │ ├── sound0007.png
│ │ ├── sound0008.png
│ │ ├── sound0009.png
│ │ ├── sound0010.png
│ │ ├── sound0011.png
│ │ ├── sound0012.png
│ │ ├── sound0013.png
│ │ ├── sound0014.png
│ │ ├── sound0015.png
│ │ ├── sound0016.png
│ │ ├── sound0017.png
│ │ ├── sound0018.png
│ │ ├── sound0019.png
│ │ ├── sound0020.png
│ │ ├── sound0021.png
│ │ ├── sound0022.png
│ │ ├── sound0023.png
│ │ ├── sound0024.png
│ │ ├── sound0025.png
│ │ ├── sound0026.png
│ │ ├── sound0027.png
│ │ ├── sound0028.png
│ │ ├── sound0029.png
│ │ ├── sound0030.png
│ │ ├── speed_one.png
│ │ └── success.png
│ │ ├── drawable-xxhdpi
│ │ ├── plv_iv_close_point_reward.png
│ │ ├── plv_iv_show_point_reward.png
│ │ ├── plv_iv_tie_point_reward.png
│ │ ├── polyv_btn_exitfulls.png
│ │ ├── polyv_btn_fullscreen.png
│ │ ├── polyv_btn_pause_port.png
│ │ ├── polyv_btn_play.png
│ │ ├── polyv_btn_play_port.png
│ │ ├── polyv_btn_slider.png
│ │ ├── polyv_btn_slider_settings.png
│ │ ├── polyv_chat_bulletin.png
│ │ ├── polyv_chat_camera.png
│ │ ├── polyv_chat_photo.png
│ │ ├── polyv_ic_left.png
│ │ ├── polyv_ic_light.png
│ │ ├── polyv_ic_menu_moreoverflow_normal_holo_dark.png
│ │ ├── polyv_ic_right.png
│ │ ├── polyv_ic_volume.png
│ │ ├── polyv_icon_download_new.png
│ │ ├── polyv_image_load_err.png
│ │ ├── polyv_q1.png
│ │ ├── polyv_q2.png
│ │ └── polyv_resend_button.png
│ │ ├── drawable
│ │ ├── chat_tab_background.xml
│ │ ├── gray_back.xml
│ │ ├── plv_gradient_point_review_effect_bg.xml
│ │ ├── plv_gradient_point_reward_bg.xml
│ │ ├── plv_selecotr_point_reward_point_to_send_selector.xml
│ │ ├── plv_selector_text_point_reward_point_to_send.xml
│ │ ├── plv_shape_point_reward_point_to_send_check.xml
│ │ ├── plv_shape_point_reward_point_to_send_uncheck.xml
│ │ ├── plvlc_bg_player_retry_btn.xml
│ │ ├── polyv_bt_color_pressed_enter.xml
│ │ ├── polyv_bt_pressed_gray.xml
│ │ ├── polyv_bt_selected_orientation.xml
│ │ ├── polyv_bt_selected_play_port.xml
│ │ ├── polyv_chat_divider.xml
│ │ ├── polyv_controller_link_brush_selector.xml
│ │ ├── polyv_controller_link_cam_selector.xml
│ │ ├── polyv_controller_link_erase_selector.xml
│ │ ├── polyv_controller_link_mic_selector.xml
│ │ ├── polyv_et_chat_corner.xml
│ │ ├── polyv_greeting_layout_bg.xml
│ │ ├── polyv_iv_corner_bg.xml
│ │ ├── polyv_iv_corner_gray.xml
│ │ ├── polyv_iv_corner_pressed.xml
│ │ ├── polyv_iv_corner_white.xml
│ │ ├── polyv_iv_gray.xml
│ │ ├── polyv_iv_hostonly_switch.xml
│ │ ├── polyv_link_mic_arrow_selector.xml
│ │ ├── polyv_link_mic_line_selector.xml
│ │ ├── polyv_live_status_live.xml
│ │ ├── polyv_live_status_noactive.xml
│ │ ├── polyv_live_status_waitting.xml
│ │ ├── polyv_ppt_sub_selector.xml
│ │ ├── polyv_q1_bg.xml
│ │ ├── polyv_q2_bg.xml
│ │ ├── polyv_rl_bg_corners.xml
│ │ ├── polyv_rl_bg_white.xml
│ │ ├── polyv_sb_bg_drawable.xml
│ │ ├── polyv_sb_thumb.xml
│ │ ├── polyv_selector_emoji.xml
│ │ ├── polyv_speed_text_selector.xml
│ │ ├── polyv_tv_bg_corner.xml
│ │ ├── polyv_tv_corner.xml
│ │ ├── polyv_tv_corner_color_blue_deep_send_message.xml
│ │ ├── polyv_tv_corner_color_blue_send_message.xml
│ │ ├── polyv_tv_corner_color_gray_send_message.xml
│ │ ├── polyv_tv_corner_gray.xml
│ │ ├── polyv_tv_receive.xml
│ │ ├── polyv_tv_selected_send_message.xml
│ │ ├── polyv_tv_send.xml
│ │ ├── polyv_tv_status.xml
│ │ ├── polyv_tv_toast.xml
│ │ ├── polyv_video_bottom_gradient.xml
│ │ ├── polyv_video_top_gradient.xml
│ │ ├── selector_controller_danmu_switch.xml
│ │ ├── selector_controller_more_tv.xml
│ │ ├── selector_controller_play_and_pause.xml
│ │ └── shape_controller_more_tv_checked.xml
│ │ ├── layout
│ │ ├── chat_pull_layout.xml
│ │ ├── plv_player_retry_layout.xml
│ │ ├── plv_window_point_reward.xml
│ │ ├── polyv_answer_web_layout.xml
│ │ ├── polyv_bit_item.xml
│ │ ├── polyv_chat_add_more.xml
│ │ ├── polyv_chat_default_message.xml
│ │ ├── polyv_chat_edit_group.xml
│ │ ├── polyv_chat_edit_person.xml
│ │ ├── polyv_chat_emo_item.xml
│ │ ├── polyv_chat_emo_list_layout.xml
│ │ ├── polyv_chat_greeting_layout.xml
│ │ ├── polyv_chat_message_q_item.xml
│ │ ├── polyv_chat_receive_message_item.xml
│ │ ├── polyv_chat_receive_normal_message_content_item.xml
│ │ ├── polyv_chat_receive_quote.xml
│ │ ├── polyv_chat_send_message_item.xml
│ │ ├── polyv_chat_send_normal_message_content_item.xml
│ │ ├── polyv_chat_tip_normal_message_item.xml
│ │ ├── polyv_chat_tips_message_item.xml
│ │ ├── polyv_controller.xml
│ │ ├── polyv_controller_land.xml
│ │ ├── polyv_controller_land_speed_layout.xml
│ │ ├── polyv_controller_port.xml
│ │ ├── polyv_fragment_chat_image.xml
│ │ ├── polyv_fragment_groupchat.xml
│ │ ├── polyv_fragment_personchat.xml
│ │ ├── polyv_fragment_playbackchat.xml
│ │ ├── polyv_image_viewpager.xml
│ │ ├── polyv_loading_layout.xml
│ │ ├── polyv_nostream_layout.xml
│ │ ├── polyv_popup_item_active.xml
│ │ ├── polyv_ppt_item_view.xml
│ │ ├── polyv_ppt_webview_layout.xml
│ │ ├── polyv_stopstream_layout.xml
│ │ ├── polyv_teacher_info.xml
│ │ ├── polyv_tips_view_gif.xml
│ │ ├── polyv_tips_view_light.xml
│ │ ├── polyv_tips_view_progress.xml
│ │ ├── polyv_tips_view_screenshot.xml
│ │ ├── polyv_tips_view_volume.xml
│ │ ├── polyv_video_item.xml
│ │ ├── polyv_videoview_main_layout.xml
│ │ └── polyv_videoview_sub_layout.xml
│ │ └── values
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── easefun
│ └── polyv
│ └── commonui
│ └── ExampleUnitTest.java
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── sign.jks
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle/
3 | .idea/
4 | .DS_Store/
5 | /local.properties
6 | */build
7 | /captures
8 | build/
9 | make/
10 | release/
11 | .DS_Store
12 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/easefun/polyv/cloudclassdemo/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo;
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.polyv.easefun.polyvandroidcloudclassdemo", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/assets/demo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
10 |
11 |
12 |
13 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/PolyvCloudClassApp.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo;
2 |
3 | import android.support.multidex.MultiDexApplication;
4 |
5 | import com.easefun.polyv.businesssdk.vodplayer.PolyvVodSDKClient;
6 | import com.easefun.polyv.cloudclass.config.PolyvLiveSDKClient;
7 | import com.easefun.polyv.foundationsdk.log.PolyvCommonLog;
8 |
9 | /**
10 | * @author df
11 | * @create 2018/8/7
12 | * @Describe
13 | */
14 | public class PolyvCloudClassApp extends MultiDexApplication {
15 | private static final String TAG = "PolyvCloudClassApp";
16 | //加密秘钥和加密向量,在点播后台->设置->API接口中获取,用于解密SDK加密串
17 | //值修改请参考https://github.com/easefun/polyv-android-sdk-demo/wiki/10.%E5%85%B3%E4%BA%8E-SDK%E5%8A%A0%E5%AF%86%E4%B8%B2-%E4%B8%8E-%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AF%E5%8A%A0%E5%AF%86%E4%BC%A0%E8%BE%93
18 | /** 加密秘钥 */
19 | private String aeskey = "VXtlHmwfS2oYm0CZ";
20 | /** 加密向量 */
21 | private String iv = "2u9gDPKdX6GyQJKU";
22 | /** SDK加密串,可以在点播后台获取 */
23 | private String config = "";
24 |
25 | @Override
26 | public void onCreate() {
27 | super.onCreate();
28 | // Normal app init code...
29 | PolyvCommonLog.setDebug(true);
30 | PolyvLiveSDKClient liveSDKClient = PolyvLiveSDKClient.getInstance();
31 | liveSDKClient.initContext(this);
32 | //0.16.0 起默认开启 HttpDns
33 | // liveSDKClient.enableHttpDns(true);
34 | //如果需要支持 IPV6,请开启enableIPV6=true。默认为false。开启后自动关闭 HttpDns
35 | // liveSDKClient.enableIPV6(false);
36 |
37 | PolyvVodSDKClient client = PolyvVodSDKClient.getInstance();
38 | //使用SDK加密串来配置
39 | client.setConfig(config, aeskey, iv);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/IPolyvHomeProtocol.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch;
2 |
3 | import android.view.ViewGroup;
4 |
5 | import com.easefun.polyv.businesssdk.api.common.player.microplayer.PolyvCommonVideoView;
6 | import com.easefun.polyv.cloudclass.chat.PolyvChatManager;
7 |
8 | /**
9 | * @author df
10 | * @create 2018/9/27
11 | * @Describe
12 | */
13 | public interface IPolyvHomeProtocol {
14 | //发送弹幕
15 | void sendDanmu(CharSequence content);
16 |
17 | //添加提问的未读信息数
18 | void addUnreadQuiz(int unreadCount);
19 |
20 | //当前是否选择了提问tab
21 | boolean isSelectedQuiz();
22 |
23 | //添加聊天的未读信息数
24 | void addUnreadChat(int unreadCount);
25 |
26 | //当前是否选择了聊天tab
27 | boolean isSelectedChat();
28 |
29 | //获取播放器对象
30 | PolyvCommonVideoView getVideoView();
31 |
32 | //当前直播的场次Id
33 | String getSessionId();
34 |
35 | //获取聊天图片浏览的容器
36 | ViewGroup getImageViewerContainer();
37 |
38 | //获取聊天输入框的容器
39 | ViewGroup getChatEditContainer();
40 |
41 | //获取聊天室管理对象
42 | PolyvChatManager getChatManager();
43 |
44 | /**
45 | * 移动聊天室得位置
46 | * @param downChat 是否沉底
47 | */
48 | public void moveChatLocation(boolean downChat);
49 |
50 | /**
51 | * 更新画笔状态
52 | */
53 | void updatePaintStatus(boolean showPaint);
54 | }
55 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/PolyvDemoClient.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch;
2 |
3 | import com.easefun.polyv.businesssdk.model.link.PolyvJoinInfoEvent;
4 | import com.easefun.polyv.cloudclass.chat.event.PolyvLoginEvent;
5 | import com.easefun.polyv.cloudclass.chat.event.PolyvTeacherInfo;
6 |
7 | /**
8 | * @author df
9 | * @create 2019/1/18
10 | * @Describe demo层的 用户信息管理
11 | */
12 | public class PolyvDemoClient {
13 | private static final PolyvDemoClient ourInstance = new PolyvDemoClient();
14 |
15 | public static PolyvDemoClient getInstance() {
16 | return ourInstance;
17 | }
18 |
19 | private PolyvDemoClient() {
20 | }
21 |
22 | private PolyvTeacherInfo teacher;
23 | private PolyvLoginEvent loginEvent;
24 |
25 | public PolyvTeacherInfo getTeacher() {
26 | return teacher;
27 | }
28 |
29 | public void setTeacher(PolyvTeacherInfo teacher) {
30 | this.teacher = teacher;
31 | }
32 |
33 | public void onDestory(){
34 | this.teacher = null;
35 | }
36 |
37 | public PolyvLoginEvent getLoginEvent() {
38 | return loginEvent;
39 | }
40 |
41 | public void setLoginEvent(PolyvLoginEvent loginEvent) {
42 | this.loginEvent = loginEvent;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/chat/PolyvChatFragmentAdapter.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.chat;
2 |
3 | import android.support.v4.app.Fragment;
4 | import android.support.v4.app.FragmentManager;
5 | import android.support.v4.app.FragmentPagerAdapter;
6 |
7 | import java.util.List;
8 |
9 | public class PolyvChatFragmentAdapter extends FragmentPagerAdapter {
10 | private List fragments;
11 |
12 | private PolyvChatFragmentAdapter(FragmentManager fm) {
13 | super(fm);
14 | }
15 |
16 | public PolyvChatFragmentAdapter(FragmentManager fm, List fragments) {
17 | this(fm);
18 | this.fragments = fragments;
19 | }
20 |
21 | public void add(Fragment fragment) {
22 | if (fragments != null) {
23 | fragments.add(fragment);
24 | }
25 | }
26 |
27 | @Override
28 | public Fragment getItem(int position) {
29 | return fragments.get(position);
30 | }
31 |
32 | @Override
33 | public int getCount() {
34 | return fragments.size();
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/chat/adapter/itemview/PolyvCustomQMessageItemView.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.chat.adapter.itemview;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.NonNull;
5 | import android.support.annotation.Nullable;
6 | import android.util.AttributeSet;
7 | import android.view.View;
8 | import android.widget.ImageView;
9 |
10 | import com.easefun.polyv.cloudclass.chat.send.custom.PolyvCustomEvent;
11 | import com.easefun.polyv.commonui.modle.PolyvCustomQBean;
12 | import com.easefun.polyv.cloudclassdemo.R;
13 | import com.easefun.polyv.commonui.adapter.itemview.IPolyvCustomMessageBaseItemView;
14 |
15 | /**
16 | * @author df
17 | * @create 2019/1/16
18 | * @Describe
19 | */
20 | public class PolyvCustomQMessageItemView extends IPolyvCustomMessageBaseItemView> {
21 | private ImageView ivQ;
22 |
23 | public PolyvCustomQMessageItemView(@NonNull Context context) {
24 | super(context);
25 | }
26 |
27 | public PolyvCustomQMessageItemView(@NonNull Context context, @Nullable AttributeSet attrs) {
28 | super(context, attrs);
29 | }
30 |
31 | public PolyvCustomQMessageItemView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
32 | super(context, attrs, defStyleAttr);
33 | }
34 |
35 | @Override
36 | public void processMessage(PolyvCustomEvent message, int pos) {
37 | PolyvCustomQBean data= message.getData();
38 | int type = data.getContentType();
39 | ivQ.setImageResource(getDrawResourceID("polyv_q" + type));
40 | }
41 |
42 | public void initView() {
43 | View.inflate(getContext(), R.layout.polyv_chat_message_q_item, this);
44 | ivQ = findViewById(R.id.message_q_iv);
45 | }
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/chat/adapter/itemview/PolyvCustomTipMessageItemView.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.chat.adapter.itemview;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.NonNull;
5 | import android.support.annotation.Nullable;
6 | import android.util.AttributeSet;
7 | import android.view.View;
8 |
9 | import com.easefun.polyv.cloudclass.chat.event.PolyvCustomerMessageEvent;
10 | import com.easefun.polyv.cloudclass.chat.send.custom.PolyvCustomEvent;
11 | import com.easefun.polyv.cloudclassdemo.R;
12 | import com.easefun.polyv.commonui.adapter.itemview.IPolyvCustomMessageBaseItemView;
13 |
14 | /**
15 | * @author df
16 | * @create 2019/1/16
17 | * @Describe
18 | */
19 | public class PolyvCustomTipMessageItemView extends IPolyvCustomMessageBaseItemView> {
20 | public PolyvCustomTipMessageItemView(@NonNull Context context) {
21 | super(context);
22 | }
23 |
24 | public PolyvCustomTipMessageItemView(@NonNull Context context, @Nullable AttributeSet attrs) {
25 | super(context, attrs);
26 | }
27 |
28 | public PolyvCustomTipMessageItemView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
29 | super(context, attrs, defStyleAttr);
30 | }
31 |
32 | @Override
33 | public void processMessage(PolyvCustomEvent data, int pos) {
34 |
35 | }
36 |
37 | @Override
38 | public void initView() {
39 | View.inflate(getContext(), R.layout.polyv_chat_message_q_item,this);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/chat/event/PolyvChatMessageEvent.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.chat.event;
2 |
3 | /**
4 | * @author df
5 | * @create 2019/1/17
6 | * @Describe
7 | */
8 | public class PolyvChatMessageEvent {
9 | public interface MessageEvent{
10 | public static final String QMessage = "QMessage";//扣消息
11 | public static final String RewardMessage = "RewardMessage";//打赏消息
12 | public static final String GiftMessage = "GiftMessage";//送礼消息
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/chat/imageScan/PolyvChatImgFragmentStatePagerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.chat.imageScan;
2 |
3 | import android.support.v4.app.Fragment;
4 | import android.support.v4.app.FragmentManager;
5 | import android.support.v4.app.FragmentStatePagerAdapter;
6 | import android.view.View;
7 |
8 | import com.easefun.polyv.cloudclassdemo.watch.chat.adapter.PolyvChatListAdapter;
9 |
10 | import java.util.List;
11 |
12 | public class PolyvChatImgFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
13 | private List chatTypeItems;
14 | private View.OnClickListener onClickListener;
15 |
16 | private PolyvChatImgFragmentStatePagerAdapter(FragmentManager fm) {
17 | super(fm);
18 | }
19 |
20 | public PolyvChatImgFragmentStatePagerAdapter(FragmentManager fm, List chatTypeItems) {
21 | this(fm);
22 | this.chatTypeItems = chatTypeItems;
23 | }
24 |
25 | public void setOnClickImgListener(View.OnClickListener l) {
26 | this.onClickListener = l;
27 | }
28 |
29 | @Override
30 | public Fragment getItem(int position) {
31 | return PolyvChatImageFragment.newInstance(chatTypeItems.get(position), position).setOnImgClickListener(onClickListener);
32 | }
33 |
34 | @Override
35 | public int getCount() {
36 | return chatTypeItems.size();
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/linkMic/IPolyvViewVisibilityChangedListener.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.linkMic;
2 |
3 | import android.support.annotation.NonNull;
4 | import android.view.View;
5 |
6 | public interface IPolyvViewVisibilityChangedListener {
7 | void onVisibilityChanged(@NonNull View changedView, int visibility);
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/linkMic/widget/IPolyvRotateBaseView.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.linkMic.widget;
2 |
3 | import android.view.View;
4 | import android.view.ViewGroup;
5 | import android.view.ViewTreeObserver;
6 |
7 | import com.easefun.polyv.cloudclassdemo.watch.linkMic.IPolyvViewVisibilityChangedListener;
8 |
9 | /**
10 | * @author df
11 | * @create 2018/11/30
12 | * @Describe 旋转view的抽象定义 (云课堂连麦与普通直播连麦的接口定义)
13 | */
14 | public interface IPolyvRotateBaseView {
15 |
16 | //
17 | public void resetSoftTo();
18 |
19 | public void resetFloatViewLand();
20 |
21 | public void resetFloatViewPort();
22 |
23 | public void setOriginTop(int originTop);
24 |
25 | public void setLayoutParams(ViewGroup.LayoutParams params);
26 |
27 | public void setVisibility(int visibility);
28 |
29 | public void enableShow(boolean show);
30 |
31 | public void setLinkType(String type);
32 |
33 | public void setSupportRtc(boolean type);
34 |
35 | public void setOnVisibilityChangedListener(IPolyvViewVisibilityChangedListener listener);
36 | //
37 |
38 | //
39 | public void scrollToPosition(int pos, View parent);
40 |
41 | public void topSubviewTo(final int top);
42 | //
43 |
44 | //
45 | public ViewTreeObserver getViewTreeObserver();
46 |
47 | public ViewGroup.MarginLayoutParams getLayoutParamsLayout();
48 |
49 | public ViewGroup getOwnView();
50 | //
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/player/live/widget/IPolyvLandscapeDanmuSender.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.player.live.widget;
2 |
3 | /**
4 | * date: 2019/6/6 0006
5 | *
6 | * @author hwj
7 | * description 弹幕发送器抽象
8 | */
9 | public interface IPolyvLandscapeDanmuSender {
10 |
11 | /**
12 | * 设置发送弹幕监听器
13 | *
14 | * @param listener listener
15 | */
16 | void setOnSendDanmuListener(OnSendDanmuListener listener);
17 |
18 | /**
19 | * 打开弹幕发送器
20 | */
21 | void openDanmuSender();
22 |
23 | /**
24 | * 隐藏
25 | */
26 | void dismiss();
27 |
28 | /**
29 | * 发送弹幕监听器
30 | */
31 | interface OnSendDanmuListener {
32 | /**
33 | * 横屏发送的弹幕消息应同步到聊天室
34 | *
35 | * @param danmuMessage 横屏发送的弹幕消息
36 | */
37 | void onSendDanmu(String danmuMessage);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/easefun/polyv/cloudclassdemo/watch/player/live/widget/OrientationSensibleLinearLayout.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo.watch.player.live.widget;
2 |
3 | import android.content.Context;
4 | import android.content.res.Configuration;
5 | import android.support.annotation.Nullable;
6 | import android.util.AttributeSet;
7 | import android.widget.LinearLayout;
8 |
9 | /**
10 | * date: 2019/6/10 0010
11 | *
12 | * @author hwj
13 | * description 能收到方向回调的LinearLayout
14 | */
15 | public class OrientationSensibleLinearLayout extends LinearLayout {
16 | public Runnable onPortrait;
17 | public Runnable onLandscape;
18 |
19 | public OrientationSensibleLinearLayout(Context context) {
20 | super(context);
21 | }
22 |
23 | public OrientationSensibleLinearLayout(Context context, @Nullable AttributeSet attrs) {
24 | super(context, attrs);
25 | }
26 |
27 | public OrientationSensibleLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
28 | super(context, attrs, defStyleAttr);
29 | }
30 |
31 | @Override
32 | protected void onConfigurationChanged(Configuration newConfig) {
33 | if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
34 | if (onPortrait != null) {
35 | onPortrait.run();
36 | }
37 | } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
38 | if (onLandscape != null) {
39 | onLandscape.run();
40 | }
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/close.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/handle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/handle.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/hangup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/hangup.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/img_cemera_switch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/img_cemera_switch.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/login_close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/login_close.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/logo_polyv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/logo_polyv.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/polyv_cloudclass_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/polyv_cloudclass_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/putuphands.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/putuphands.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/refresh.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/select.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/tab_bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/tab_bg.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/topbar_blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/topbar_blue.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/topbar_green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/topbar_green.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/topbar_orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xhdpi/topbar_orange.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/polyv_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xxhdpi/polyv_logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/polyv_no_stream.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/app/src/main/res/drawable-xxhdpi/polyv_no_stream.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/link_mic_default_backgroud.xml:
--------------------------------------------------------------------------------
1 |
2 | >
4 |
5 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/plv_selector_point_reward_checkbox.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_audio_mode_textview.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_camer_back.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_color_topic_tab_bottom_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_color_topic_tab_text_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_corner_tab_line.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_link_mic_nick_bg.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_live_float_corner_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_login_bg_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_login_bg_select.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_login_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_login_text_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/polyv_mic_phone_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/selector_send_danmu_btn.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_et_send_danmu.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_tv_send_danmu.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/text_color_send_danmu_btn.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/link_mic_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
18 |
19 |
20 |
21 |
28 |
29 |
30 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_chat_input_imageviewer_container.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_chat_tab_item_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
20 |
21 |
27 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_cloud_class_audio_mode_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_cloud_class_item_bitrate.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_cloud_class_participant_login.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
15 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_cloudclass_audio_mode_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_cloudclass_controller.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_fragment_cloudclass_danmu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_fragment_custommenu.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_live_bitrate_popu_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
19 |
20 |
28 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/polyv_top_controller.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #D6F2FF
4 | #bfbfbf
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 13.3sp
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | 云课堂
3 | 弹幕
4 |
5 |
6 | 登录
7 | POLYV 云课堂
8 | 用户ID
9 | 视频ID
10 | 频道ID
11 | APP ID
12 | APP Secert
13 | 正在登录中,请稍等...
14 | 2013 - 2019 广州易方信息科技股份有限公司 版权所有
15 |
16 |
17 | 直播介绍
18 | 自定义菜单
19 | 推广外链
20 | 图文直播
21 | 聊天
22 | 提问
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/values/values.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/provider_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/test/java/com/easefun/polyv/cloudclassdemo/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.cloudclassdemo;
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 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | jcenter()
8 | mavenCentral()
9 | }
10 | dependencies {
11 | classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
12 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
13 | classpath 'com.android.tools.build:gradle:3.2.0'
14 |
15 | // NOTE: Do not place your application dependencies here; they belong
16 | // in the individual module build.gradle files
17 | }
18 | }
19 |
20 | allprojects {
21 | repositories {
22 | google()
23 | jcenter()
24 | maven { url "https://jitpack.io" }
25 | maven {
26 | url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
27 | }
28 | //mavenCentral 源
29 | mavenCentral()
30 | //阿里云效关于central的镜像
31 | maven{
32 | url 'https://maven.aliyun.com/repository/public'
33 | }
34 | }
35 | }
36 |
37 | ext {
38 | compileSdkVersion = 29
39 | minSdkVersion = 21
40 | targetSdkVersion = 29
41 | versionCode = 163
42 | versionName = "0.16.3"
43 | }
44 |
45 | task clean(type: Delete) {
46 | delete rootProject.buildDir
47 | }
48 |
49 |
--------------------------------------------------------------------------------
/commonui/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/commonui/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 |
--------------------------------------------------------------------------------
/commonui/src/androidTest/java/com/easefun/polyv/commonui/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui;
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.polyv.easefun.commonui.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/commonui/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/commonui/src/main/assets/fonts/Helvetica-Bold-Oblique_22454.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/commonui/src/main/assets/fonts/Helvetica-Bold-Oblique_22454.ttf
--------------------------------------------------------------------------------
/commonui/src/main/assets/images/lottery-start.56681d8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/polyv/polyv-android-cloudClass-sdk-demo/1d0bf320ee1b0bb72382e558226612051ea3d3d4/commonui/src/main/assets/images/lottery-start.56681d8.gif
--------------------------------------------------------------------------------
/commonui/src/main/assets/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Document
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 公告
18 | ×
19 |
20 |
暂无公告
21 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/adapter/itemview/IPolyvCustomMessageBaseItemView.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.adapter.itemview;
2 |
3 | import android.content.Context;
4 | import android.content.res.Resources;
5 | import android.support.annotation.NonNull;
6 | import android.support.annotation.Nullable;
7 | import android.util.AttributeSet;
8 | import android.widget.FrameLayout;
9 |
10 | /**
11 | * @author df
12 | * @create 2019/1/16
13 | * @Describe
14 | */
15 | public abstract class IPolyvCustomMessageBaseItemView extends FrameLayout {
16 | public IPolyvCustomMessageBaseItemView(@NonNull Context context) {
17 | this(context,null);
18 | }
19 |
20 | public IPolyvCustomMessageBaseItemView(@NonNull Context context, @Nullable AttributeSet attrs) {
21 | this(context, attrs,0);
22 | }
23 |
24 | public IPolyvCustomMessageBaseItemView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
25 | super(context, attrs, defStyleAttr);
26 | initView();
27 | }
28 |
29 | //处理对应的数据信息,展示内容
30 | public abstract void processMessage(T data, int pos);
31 |
32 | //初始化view
33 | public abstract void initView();
34 |
35 | /**
36 | * 根据图片的名称获取对应的资源id
37 | * @param resourceName
38 | * @return
39 | */
40 | public int getDrawResourceID(String resourceName) {
41 | Resources res=getResources();
42 | int picid = res.getIdentifier(resourceName,"drawable",getContext().getPackageName());
43 | return picid;
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/modle/PolyvCustomQBean.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.modle;
2 |
3 | import com.easefun.polyv.businesssdk.model.PolyvBaseVO;
4 |
5 | /**
6 | * @author df
7 | * @create 2019/1/17
8 | * @Describe
9 | */
10 | public class PolyvCustomQBean implements PolyvBaseVO{
11 | private int contentType;
12 |
13 | public int getContentType() {
14 | return contentType;
15 | }
16 |
17 | public void setContentType(int contentType) {
18 | this.contentType = contentType;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/player/IPolyvBusinessMediaController.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.player;
2 |
3 | import com.easefun.polyv.businesssdk.api.common.meidaControl.IPolyvMediaController;
4 | import com.easefun.polyv.businesssdk.api.common.player.microplayer.PolyvCommonVideoView;
5 | import com.easefun.polyv.commonui.PolyvCommonVideoHelper;
6 |
7 | /**
8 | * @author df
9 | * @create 2018/8/15
10 | * @Describe
11 | */
12 | public interface IPolyvBusinessMediaController extends IPolyvMediaController {
13 | void addHelper(R tpqPolyvCommonVideoHelper);
14 | }
15 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/player/IPolyvVideoItem.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.player;
2 |
3 | import android.view.View;
4 |
5 | import com.easefun.polyv.businesssdk.api.auxiliary.PolyvAuxiliaryVideoview;
6 | import com.easefun.polyv.businesssdk.api.common.meidaControl.IPolyvMediaController;
7 | import com.easefun.polyv.businesssdk.api.common.player.microplayer.PolyvCommonVideoView;
8 | import com.easefun.polyv.businesssdk.model.video.PolyvBaseVideoParams;
9 | import com.easefun.polyv.commonui.player.ppt.PolyvPPTItem;
10 |
11 | /**
12 | * @author df
13 | * @create 2018/8/10
14 | * @Describe
15 | */
16 | public interface IPolyvVideoItem {
17 | public View getView();
18 |
19 | public T getVideoView();
20 |
21 | public PolyvAuxiliaryVideoview getSubVideoView();
22 |
23 | public R getController();
24 |
25 | public void resetUI();
26 |
27 | void bindPPTView(PolyvPPTItem polyvPPTItem);
28 |
29 | PolyvPPTItem getPPTItem();
30 |
31 | void destroy();
32 |
33 | void setNickName(String studentNickName);
34 |
35 | void setBaseVideoParams(PolyvBaseVideoParams polyvBaseVideoParams);
36 | }
37 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/player/ppt/IPolyvPPTItem.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.player.ppt;
2 |
3 | import android.view.View;
4 |
5 | import com.easefun.polyv.businesssdk.api.common.meidaControl.IPolyvMediaController;
6 | import com.easefun.polyv.businesssdk.api.common.ppt.IPolyvPPTView;
7 |
8 | /**
9 | * @author df
10 | * @create 2018/8/11
11 | * @Describe
12 | */
13 | public interface IPolyvPPTItem {
14 |
15 | View getItemRootView();
16 |
17 | IPolyvPPTView getPPTView();
18 |
19 | void addMediaController(T mediaController);
20 | }
21 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/player/widget/PolyvLightTipsView.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.player.widget;
2 |
3 | import android.content.Context;
4 | import android.os.Handler;
5 | import android.os.Message;
6 | import android.util.AttributeSet;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.widget.FrameLayout;
10 | import android.widget.TextView;
11 |
12 | import com.easefun.polyv.commonui.R;
13 |
14 |
15 | public class PolyvLightTipsView extends FrameLayout {
16 | //lightView
17 | private View view;
18 | private TextView tv_percent;
19 |
20 | public PolyvLightTipsView(Context context) {
21 | this(context, null);
22 | }
23 |
24 | public PolyvLightTipsView(Context context, AttributeSet attrs) {
25 | this(context, attrs, 0);
26 | }
27 |
28 | public PolyvLightTipsView(Context context, AttributeSet attrs, int defStyleAttr) {
29 | super(context, attrs, defStyleAttr);
30 | this.view = LayoutInflater.from(context).inflate(R.layout.polyv_tips_view_light, this);
31 | initView();
32 | }
33 |
34 | private void initView() {
35 | hide();
36 | tv_percent = (TextView) view.findViewById(R.id.tv_percent);
37 | }
38 |
39 | public void hide() {
40 | setVisibility(View.GONE);
41 | }
42 |
43 | private Handler handler = new Handler() {
44 | @Override
45 | public void handleMessage(Message msg) {
46 | if (msg.what == View.GONE)
47 | setVisibility(View.GONE);
48 | }
49 | };
50 |
51 | public void setLightPercent(int brightness, boolean slideEnd) {
52 | handler.removeMessages(View.GONE);
53 | if (slideEnd) {
54 | handler.sendEmptyMessageDelayed(View.GONE, 300);
55 | } else {
56 | setVisibility(View.VISIBLE);
57 | tv_percent.setText(brightness + "%");
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/player/widget/PolyvPlayerRetryLayout.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.player.widget;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.NonNull;
5 | import android.support.annotation.Nullable;
6 | import android.util.AttributeSet;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.widget.FrameLayout;
10 | import android.widget.TextView;
11 |
12 | import com.easefun.polyv.commonui.R;
13 |
14 | /**
15 | * date: 2021/2/22
16 | * author: HWilliamgo
17 | * description: 播放器重试布局
18 | */
19 | public class PolyvPlayerRetryLayout extends FrameLayout {
20 |
21 | //
22 | private TextView playerRetryTv;
23 | //
24 |
25 | //
26 | public PolyvPlayerRetryLayout(@NonNull Context context) {
27 | this(context, null);
28 | }
29 |
30 | public PolyvPlayerRetryLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
31 | this(context, attrs, 0);
32 | }
33 |
34 | public PolyvPlayerRetryLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
35 | super(context, attrs, defStyleAttr);
36 | initView(context);
37 | }
38 | //
39 |
40 | //
41 | private void initView(Context context) {
42 | View view = LayoutInflater.from(context).inflate(R.layout.plv_player_retry_layout, this, true);
43 |
44 | playerRetryTv = view.findViewById(R.id.plv_player_retry_tv);
45 | }
46 | //
47 |
48 | //
49 | public void setOnClickPlayerRetryListener(OnClickListener onClickListener) {
50 | playerRetryTv.setOnClickListener(onClickListener);
51 | }
52 | //
53 | }
54 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/utils/PolyvBezierEvaluator.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.utils;
2 |
3 | import android.animation.TypeEvaluator;
4 | import android.graphics.PointF;
5 |
6 | /**
7 | * Created by Ben.li on 2017/8/17.
8 | */
9 |
10 | public class PolyvBezierEvaluator implements TypeEvaluator {
11 |
12 | private PointF point1, point2;
13 | private PointF point;
14 |
15 | public PolyvBezierEvaluator(PointF point1, PointF point2) {
16 | this.point1 = point1;
17 | this.point2 = point2;
18 | point = new PointF();
19 | }
20 |
21 | @Override
22 | public PointF evaluate(float t, PointF startValue, PointF endValue) {
23 | point.x = startValue.x * (1 - t) * (1 - t) * (1 - t)
24 | + 3 * point1.x * t * (1 - t) * (1 - t)
25 | + 3 * point2.x * t * t * (1 - t)
26 | + endValue.x * t * t * t;
27 | point.y = startValue.y * (1 - t) * (1 - t) * (1 - t)
28 | + 3 * point1.y * t * (1 - t) * (1 - t)
29 | + 3 * point2.y * t * t * (1 - t)
30 | + endValue.y * t * t * t;
31 | return point;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/commonui/src/main/java/com/easefun/polyv/commonui/utils/PolyvChatEventBus.java:
--------------------------------------------------------------------------------
1 | package com.easefun.polyv.commonui.utils;
2 |
3 | import com.jakewharton.rxrelay2.Relay;
4 | import com.jakewharton.rxrelay2.ReplayRelay;
5 |
6 | import io.reactivex.Observable;
7 |
8 | /**
9 | * 发送聊天室状态请用{@link PolyvSingleRelayBus}
10 | * 发送聊天消息请用{@link com.easefun.polyv.foundationsdk.rx.PolyvRxBus}
11 | */
12 | @Deprecated
13 | public class PolyvChatEventBus {
14 | //xxxRelay的xxx等同于xxxSuject/xxxProcessor
15 | private final Relay