From c7d32097366deb395910d240fad01b654363e4dc Mon Sep 17 00:00:00 2001 From: LagradOst Date: Thu, 10 Jun 2021 20:21:42 +0200 Subject: [PATCH] chromecast stuff --- app/src/main/AndroidManifest.xml | 4 + .../com/lagradost/cloudstream3/UIHelper.kt | 17 +++- .../cloudstream3/ui/ControllerActivity.kt | 4 +- .../cloudstream3/ui/player/PlayerFragment.kt | 89 ++++++++++++++++++- .../cloudstream3/ui/result/ResultFragment.kt | 7 +- .../drawable/ic_baseline_play_arrow_24.xml | 2 +- app/src/main/res/drawable/netflix_play.xml | 4 +- app/src/main/res/layout/activity_main.xml | 19 +++- .../main/res/layout/player_custom_layout.xml | 15 +++- app/src/main/res/values/array.xml | 16 ++++ app/src/main/res/values/styles.xml | 43 +++++++++ 11 files changed, 206 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/values/array.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c62789a7..e267b893 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,10 @@ + + + + { if (!isValidTouch) return + isValidTouch = false val transition: Transition = Fade() transition.duration = 1000 @@ -463,7 +477,7 @@ class PlayerFragment : Fragment() { else (data is AnimeLoadResponse && (data.type == TvType.Anime || data.type == TvType.ONA)) skip_op.visibility = if (isVis) View.VISIBLE else View.GONE } else { - if(data is AnimeLoadResponse) { + if (data is AnimeLoadResponse) { val isVis = ((data.type == TvType.Anime || data.type == TvType.ONA)) skip_op_text.text = "Skip OP" skip_op.visibility = if (isVis) View.VISIBLE else View.GONE @@ -562,6 +576,7 @@ class PlayerFragment : Fragment() { skip_op.isClickable = isClick resize_player.isClickable = isClick exo_progress.isEnabled = isClick + player_media_route_button.isEnabled = isClick //video_go_back_holder2.isEnabled = isClick // Clickable doesn't seem to work on com.google.android.exoplayer2.ui.DefaultTimeBar @@ -580,6 +595,7 @@ class PlayerFragment : Fragment() { private var playbackSpeed = 0f private var allEpisodes: HashMap> = HashMap() private var episodes: ArrayList = ArrayList() + var currentPoster: String? = null @SuppressLint("SetTextI18n") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -588,6 +604,67 @@ class PlayerFragment : Fragment() { navigationBarHeight = requireContext().getNavigationBarHeight() statusBarHeight = requireContext().getStatusBarHeight() + if (activity?.isCastApiAvailable() == true) { + CastButtonFactory.setUpMediaRouteButton(activity, player_media_route_button) + val castContext = CastContext.getSharedInstance(requireActivity().applicationContext) + + if (castContext.castState != CastState.NO_DEVICES_AVAILABLE) player_media_route_button.visibility = VISIBLE + castContext.addCastStateListener { state -> + if (player_media_route_button != null) { + if (state == CastState.NO_DEVICES_AVAILABLE) player_media_route_button.visibility = GONE else { + if (player_media_route_button.visibility == GONE) player_media_route_button.visibility = VISIBLE + } + if (state == CastState.CONNECTED) { + if (!this::exoPlayer.isInitialized) return@addCastStateListener + val links = sortUrls(getUrls() ?: return@addCastStateListener) + val epData = getEpisode() ?: return@addCastStateListener + + val index = links.indexOf(getCurrentUrl()) + + val mediaItems = links.map { + val movieMetadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE) + movieMetadata.putString( + MediaMetadata.KEY_TITLE, + + "Episode ${epData.episode}" + + if (epData.name != null) + "- ${epData.name}" + else + "" + ) + movieMetadata.putString(MediaMetadata.KEY_ALBUM_ARTIST, + epData.name ?: "Episode ${epData.episode}") + + val srcPoster = epData.poster ?: currentPoster + if (srcPoster != null) { + movieMetadata.addImage(WebImage(Uri.parse(srcPoster))) + } + + MediaQueueItem.Builder( + MediaInfo.Builder(it.url) + .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) + .setContentType(MimeTypes.VIDEO_UNKNOWN) + .setCustomData(JSONObject().put("data", it.name)) + .setMetadata(movieMetadata) + .build() + ) + .build() + }.toTypedArray() + + val castPlayer = CastPlayer(castContext) + castPlayer.loadItems( + mediaItems, + if (index > 0) index else 0, + exoPlayer.currentPosition, + MediaStatus.REPEAT_MODE_REPEAT_SINGLE + ) + // activity?.popCurrentPage(isInPlayer = true, isInExpandedView = false, isInResults = false) + activity?.popCurrentPage() + } + } + } + } + if (savedInstanceState != null) { currentWindow = savedInstanceState.getInt(STATE_RESUME_WINDOW) playbackPosition = savedInstanceState.getLong(STATE_RESUME_POSITION) @@ -637,6 +714,7 @@ class PlayerFragment : Fragment() { val d = data.value if (d is LoadResponse) { localData = d + currentPoster = d.posterUrl } } is Resource.Failure -> { @@ -709,6 +787,7 @@ class PlayerFragment : Fragment() { // MENUS centerMenu.startAnimation(fadeAnimation) + player_media_route_button.startAnimation(fadeAnimation) //video_bar.startAnimation(fadeAnimation) //TITLE @@ -759,11 +838,13 @@ class PlayerFragment : Fragment() { ) video_go_back.setOnClickListener { - activity?.popCurrentPage(isInPlayer = true, isInExpandedView = false, isInResults = false) + //activity?.popCurrentPage(isInPlayer = true, isInExpandedView = false, isInResults = false) + activity?.popCurrentPage() } video_go_back_holder.setOnClickListener { println("video_go_back_pressed") - activity?.popCurrentPage(isInPlayer = true, isInExpandedView = false, isInResults = false) + // activity?.popCurrentPage(isInPlayer = true, isInExpandedView = false, isInResults = false) + activity?.popCurrentPage() } playback_speed_btt.visibility = if (playBackSpeedEnabled) VISIBLE else GONE @@ -1146,7 +1227,7 @@ class PlayerFragment : Fragment() { override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { // updatePIPModeActions() - if(activity == null) return + if (activity == null) return if (playWhenReady) { when (playbackState) { Player.STATE_READY -> { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index 9e6f1bab..33e271c9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -47,6 +47,7 @@ import com.lagradost.cloudstream3.utils.ExtractorLink import jp.wasabeef.glide.transformations.BlurTransformation import kotlinx.android.synthetic.main.fragment_result.* import org.json.JSONObject +import android.app.ProgressDialog const val MAX_SYNO_LENGH = 300 @@ -107,8 +108,6 @@ class ResultFragment : Fragment() { activity?.fixPaddingStatusbar(result_barstatus) if (activity?.isCastApiAvailable() == true) { - val mMediaRouteButton = view.findViewById(R.id.media_route_button) - CastButtonFactory.setUpMediaRouteButton(activity, media_route_button) val castContext = CastContext.getSharedInstance(requireActivity().applicationContext) @@ -151,9 +150,13 @@ class ResultFragment : Fragment() { val buildInPlayer = true when (episodeClick.action) { ACTION_CHROME_CAST_EPISODE -> { + val dialog = ProgressDialog.show(requireContext(), "", + "Loading. Please wait...", true) + dialog.show() Toast.makeText(activity, "Loading links", Toast.LENGTH_SHORT).show() viewModel.loadEpisode(episodeClick.data, true) { data -> + dialog.dismiss() when (data) { is Resource.Failure -> { Toast.makeText(activity, "Failed to load links", Toast.LENGTH_SHORT).show() diff --git a/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml b/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml index f880379f..0870be8f 100644 --- a/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml +++ b/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml @@ -1,4 +1,4 @@ - diff --git a/app/src/main/res/drawable/netflix_play.xml b/app/src/main/res/drawable/netflix_play.xml index 816d1069..1f8c9e7d 100644 --- a/app/src/main/res/drawable/netflix_play.xml +++ b/app/src/main/res/drawable/netflix_play.xml @@ -1,6 +1,6 @@ - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/player_custom_layout.xml b/app/src/main/res/layout/player_custom_layout.xml index 638d1b2c..d2e58427 100644 --- a/app/src/main/res/layout/player_custom_layout.xml +++ b/app/src/main/res/layout/player_custom_layout.xml @@ -172,6 +172,19 @@ --> + + + - + + + + @id/cast_button_type_rewind_30_seconds + @id/cast_button_type_play_pause_toggle + @id/cast_button_type_forward_30_seconds + + + + @id/cast_button_type_rewind_30_seconds + @id/cast_button_type_rewind_30_seconds + @id/cast_button_type_forward_30_seconds + + @id/cast_button_type_forward_30_seconds + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ce927e25..9a5a0e84 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -28,6 +28,11 @@ @style/AppSearchViewStyle @style/Theme.Widget.Tabs + + @style/CustomCastExpandedController + + @style/CustomCastMiniController + @color/textColor @color/colorItemSeen @@ -108,4 +113,42 @@ @android:dimen/dialog_min_width_minor @drawable/dialog__window_background + + + + + + \ No newline at end of file