From 636e996d24386239575edf128e9cb766181f74c7 Mon Sep 17 00:00:00 2001 From: LagradOst Date: Wed, 27 Oct 2021 16:54:57 +0200 Subject: [PATCH] keyboard stuff and remote I hope --- .../lagradost/cloudstream3/MainActivity.kt | 47 +++++- .../cloudstream3/ui/player/PlayerFragment.kt | 138 ++++++++++++------ 2 files changed, 141 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 78a3e923..7f326998 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -26,12 +26,11 @@ import com.lagradost.cloudstream3.APIHolder.apis import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings import com.lagradost.cloudstream3.APIHolder.restrictedApis import com.lagradost.cloudstream3.mvvm.logError -import com.lagradost.cloudstream3.network.get import com.lagradost.cloudstream3.network.initRequestClient -import com.lagradost.cloudstream3.network.text import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO +import com.lagradost.cloudstream3.ui.player.PlayerEventType import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable import com.lagradost.cloudstream3.utils.AppUtils.loadResult import com.lagradost.cloudstream3.utils.DataStore.getKey @@ -49,7 +48,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.toPx import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.fragment_result.* import java.util.* -import java.util.zip.GZIPInputStream import kotlin.concurrent.thread @@ -138,6 +136,47 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { } } + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + println("Keycode: $keyCode") + when (keyCode) { + KeyEvent.KEYCODE_FORWARD, KeyEvent.KEYCODE_D, KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD -> { + PlayerEventType.SeekForward + } + KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_A, KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD -> { + PlayerEventType.SeekBack + } + KeyEvent.KEYCODE_MEDIA_NEXT -> { + PlayerEventType.NextEpisode + } + KeyEvent.KEYCODE_MEDIA_PREVIOUS -> { + PlayerEventType.PrevEpisode + } + KeyEvent.KEYCODE_MEDIA_PAUSE -> { + PlayerEventType.Pause + } + KeyEvent.KEYCODE_MEDIA_PLAY -> { + PlayerEventType.Play + } + KeyEvent.KEYCODE_L -> { + PlayerEventType.Lock + } + KeyEvent.KEYCODE_H -> { + PlayerEventType.ToggleHide + } + KeyEvent.KEYCODE_M -> { + PlayerEventType.ToggleMute + } + KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, KeyEvent.KEYCODE_P, KeyEvent.KEYCODE_SPACE -> { // space is not captured due to navigation + PlayerEventType.PlayPauseToggle + } + else -> null + }?.let { playerEvent -> + playerEventListener?.invoke(playerEvent) + } + + return super.onKeyDown(keyCode, event) + } + companion object { fun Activity?.getCastSession(): CastSession? { return (this as MainActivity?)?.mSessionManager?.currentCastSession @@ -151,6 +190,8 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { val onColorSelectedEvent = Event>() val onDialogDismissedEvent = Event() + var playerEventListener: ((PlayerEventType) -> Unit)? = null + var currentToast: Toast? = null fun showToast(act: Activity?, @StringRes message: Int, duration: Int) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt index e2be874f..9a2949c0 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerFragment.kt @@ -131,7 +131,11 @@ enum class PlayerEventType(val value: Int) { SeekBack(3), SkipCurrentChapter(4), NextEpisode(5), - PlayPauseToggle(6) + PrevEpisode(5), + PlayPauseToggle(7), + ToggleMute(8), + Lock(9), + ToggleHide(10), } /* @@ -335,9 +339,7 @@ class PlayerFragment : Fragment() { } } - private fun onClickChange() { - isShowing = !isShowing - + private fun updateClick() { click_overlay?.isVisible = !isShowing val titleMove = if (isShowing) 0f else -50.toPx.toFloat() @@ -400,6 +402,12 @@ class PlayerFragment : Fragment() { //video_lock_holder?.startAnimation(fadeAnimation) } + private fun onClickChange() { + isShowing = !isShowing + + updateClick() + } + private fun forceLetters(inp: Int, letters: Int = 2): String { val added: Int = letters - inp.toString().length return if (added > 0) { @@ -812,6 +820,42 @@ class PlayerFragment : Fragment() { private var localData: LoadResponse? = null + private fun toggleLock() { + if(!isShowing) { + onClickChange() + } + + isLocked = !isLocked + //if(isShowing) { + val fadeTo = if (isLocked) 0f else 1f + + val fadeAnimation = AlphaAnimation(video_title.alpha, fadeTo) + fadeAnimation.duration = 100 + // fadeAnimation.startOffset = 100 + fadeAnimation.fillAfter = true + + // MENUS + //centerMenu.startAnimation(fadeAnimation) + player_pause_holder?.startAnimation(fadeAnimation) + player_ffwd_holder?.startAnimation(fadeAnimation) + player_rew_holder?.startAnimation(fadeAnimation) + player_media_route_button?.startAnimation(fadeAnimation) + //video_bar.startAnimation(fadeAnimation) + + //TITLE + video_title_rez.startAnimation(fadeAnimation) + video_title.startAnimation(fadeAnimation) + + // BOTTOM + lock_holder.startAnimation(fadeAnimation) + video_go_back_holder2.startAnimation(fadeAnimation) + + shadow_overlay.startAnimation(fadeAnimation) + // } + + updateLock() + } + private fun updateLock() { video_locked_img.setImageResource(if (isLocked) R.drawable.video_locked else R.drawable.video_unlocked) val color = if (isLocked) ContextCompat.getColor(requireContext(), R.color.videoColorPrimary) @@ -836,7 +880,7 @@ class PlayerFragment : Fragment() { resize_player?.isClickable = isClick exo_progress.isEnabled = isClick player_media_route_button?.isEnabled = isClick - if (isClick) { + if (isClick && isShowing) { player_pause_holder?.alpha = 1f player_rew_holder?.alpha = 1f player_ffwd_holder?.alpha = 1f @@ -847,13 +891,8 @@ class PlayerFragment : Fragment() { // Clickable doesn't seem to work on com.google.android.exoplayer2.ui.DefaultTimeBar //exo_progress.visibility = if (isLocked) INVISIBLE else VISIBLE - val fadeTo = if (!isLocked) 1f else 0f - val fadeAnimation = AlphaAnimation(1f - fadeTo, fadeTo) - fadeAnimation.duration = 100 - fadeAnimation.fillAfter = true - - shadow_overlay.startAnimation(fadeAnimation) + //updateClick() } private var resizeMode = 0 @@ -954,13 +993,47 @@ class PlayerFragment : Fragment() { handlePlayerEvent(event.value) } + var lastMuteVolume = 0f + private fun handlePlayerEvent(event: Int) { if (!this::exoPlayer.isInitialized) return - when (event) { - PlayerEventType.Play.value -> exoPlayer.play() - PlayerEventType.Pause.value -> exoPlayer.pause() - PlayerEventType.SeekBack.value -> seekTime(-30000L) - PlayerEventType.SeekForward.value -> seekTime(30000L) + try { + when (event) { + PlayerEventType.Play.value -> exoPlayer.play() + PlayerEventType.Pause.value -> exoPlayer.pause() + PlayerEventType.SeekBack.value -> seekTime(-30000L) + PlayerEventType.SeekForward.value -> seekTime(30000L) + PlayerEventType.PlayPauseToggle.value -> { + if (exoPlayer.isPlaying) { + exoPlayer.pause() + } else { + exoPlayer.play() + } + } + PlayerEventType.NextEpisode.value -> { + if (hasNextEpisode()) { + skipToNextEpisode() + } + } + PlayerEventType.Lock.value -> { + toggleLock() + } + PlayerEventType.ToggleHide.value -> { + onClickChange() + } + PlayerEventType.ToggleMute.value -> { + if (exoPlayer.volume <= 0) { + //is muted + exoPlayer.volume = lastMuteVolume + } else { + // is not muted + lastMuteVolume = exoPlayer.volume + exoPlayer.volume = 0f + } + } + } + } catch (e: Exception) { + logError(e) } } //endregion @@ -1294,31 +1367,7 @@ class PlayerFragment : Fragment() { } lock_player?.setOnClickListener { - isLocked = !isLocked - val fadeTo = if (isLocked) 0f else 1f - - val fadeAnimation = AlphaAnimation(1f - fadeTo, fadeTo) - fadeAnimation.duration = 100 - // fadeAnimation.startOffset = 100 - fadeAnimation.fillAfter = true - - // MENUS - //centerMenu.startAnimation(fadeAnimation) - player_pause_holder?.startAnimation(fadeAnimation) - player_ffwd_holder?.startAnimation(fadeAnimation) - player_rew_holder?.startAnimation(fadeAnimation) - player_media_route_button?.startAnimation(fadeAnimation) - //video_bar.startAnimation(fadeAnimation) - - //TITLE - video_title_rez.startAnimation(fadeAnimation) - video_title.startAnimation(fadeAnimation) - - // BOTTOM - lock_holder.startAnimation(fadeAnimation) - video_go_back_holder2.startAnimation(fadeAnimation) - - updateLock() + toggleLock() } class Listener : DoubleClickListener(this) { @@ -1765,7 +1814,10 @@ class PlayerFragment : Fragment() { } // player_torrent_info?.visibility = if(isTorrent) VISIBLE else GONE // + isShowing = true + onClickChange() + player_torrent_info?.isVisible = false //player_torrent_info?.alpha = 0f println("LOADED: ${uri} or ${currentUrl}") @@ -1982,6 +2034,10 @@ class PlayerFragment : Fragment() { }*/ //https://stackoverflow.com/questions/47731779/detect-pause-resume-in-exoplayer + MainActivity.playerEventListener = { eventType -> + handlePlayerEvent(eventType) + } + exoPlayer.addListener(object : Player.Listener { override fun onRenderedFirstFrame() { super.onRenderedFirstFrame()