forked from recloudstream/cloudstream
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
1943a4e66e
8 changed files with 86 additions and 51 deletions
|
@ -52,17 +52,17 @@ class HomeChildItemAdapter(
|
||||||
) :
|
) :
|
||||||
RecyclerView.ViewHolder(itemView) {
|
RecyclerView.ViewHolder(itemView) {
|
||||||
|
|
||||||
fun bind(card: SearchResponse, index: Int) {
|
fun bind(card: SearchResponse, position: Int) {
|
||||||
|
|
||||||
// TV focus fixing
|
// TV focus fixing
|
||||||
val nextFocusBehavior = when (index) {
|
val nextFocusBehavior = when (position) {
|
||||||
0 -> true
|
0 -> true
|
||||||
itemCount - 1 -> false
|
itemCount - 1 -> false
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchResultBuilder.bind(clickCallback, card, itemView, nextFocusBehavior, nextFocusUp, nextFocusDown)
|
SearchResultBuilder.bind(clickCallback, card, position, itemView, nextFocusBehavior, nextFocusUp, nextFocusDown)
|
||||||
itemView.tag = index
|
itemView.tag = position
|
||||||
//val ani = ScaleAnimation(0.9f, 1.0f, 0.9f, 1f)
|
//val ani = ScaleAnimation(0.9f, 1.0f, 0.9f, 1f)
|
||||||
//ani.fillAfter = true
|
//ani.fillAfter = true
|
||||||
//ani.duration = 200
|
//ani.duration = 200
|
||||||
|
|
|
@ -437,7 +437,7 @@ class HomeFragment : Fragment() {
|
||||||
if (itemId == 1) {
|
if (itemId == 1) {
|
||||||
handleSearchClickCallback(
|
handleSearchClickCallback(
|
||||||
activity,
|
activity,
|
||||||
SearchClickCallback(SEARCH_ACTION_LOAD, callback.view, callback.card)
|
SearchClickCallback(SEARCH_ACTION_LOAD, callback.view, -1, callback.card)
|
||||||
)
|
)
|
||||||
reloadStored()
|
reloadStored()
|
||||||
}
|
}
|
||||||
|
|
|
@ -409,6 +409,9 @@ class PlayerFragment : Fragment() {
|
||||||
|
|
||||||
private fun onClickChange() {
|
private fun onClickChange() {
|
||||||
isShowing = !isShowing
|
isShowing = !isShowing
|
||||||
|
if(isShowing) {
|
||||||
|
autoHide()
|
||||||
|
}
|
||||||
activity?.hideSystemUI()
|
activity?.hideSystemUI()
|
||||||
updateClick()
|
updateClick()
|
||||||
}
|
}
|
||||||
|
@ -1016,6 +1019,18 @@ class PlayerFragment : Fragment() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var currentTapIndex = 0
|
||||||
|
|
||||||
|
private fun autoHide() {
|
||||||
|
currentTapIndex++
|
||||||
|
val index = currentTapIndex
|
||||||
|
player_holder?.postDelayed({
|
||||||
|
if (isShowing && index == currentTapIndex && this::exoPlayer.isInitialized && exoPlayer.isPlaying) {
|
||||||
|
onClickChange()
|
||||||
|
}
|
||||||
|
}, 2000)
|
||||||
|
}
|
||||||
|
|
||||||
private var receiver: BroadcastReceiver? = null
|
private var receiver: BroadcastReceiver? = null
|
||||||
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
|
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
|
||||||
isInPIPMode = isInPictureInPictureMode
|
isInPIPMode = isInPictureInPictureMode
|
||||||
|
@ -1056,34 +1071,10 @@ class PlayerFragment : Fragment() {
|
||||||
|
|
||||||
private fun handleKeyEvent(event: KeyEvent): Boolean {
|
private fun handleKeyEvent(event: KeyEvent): Boolean {
|
||||||
event.keyCode.let { keyCode ->
|
event.keyCode.let { keyCode ->
|
||||||
when (keyCode) {
|
|
||||||
// don't allow dpad move when hidden
|
|
||||||
KeyEvent.KEYCODE_DPAD_LEFT,
|
|
||||||
KeyEvent.KEYCODE_DPAD_DOWN,
|
|
||||||
KeyEvent.KEYCODE_DPAD_UP,
|
|
||||||
KeyEvent.KEYCODE_DPAD_RIGHT,
|
|
||||||
KeyEvent.KEYCODE_DPAD_DOWN_LEFT,
|
|
||||||
KeyEvent.KEYCODE_DPAD_DOWN_RIGHT,
|
|
||||||
KeyEvent.KEYCODE_DPAD_UP_LEFT,
|
|
||||||
KeyEvent.KEYCODE_DPAD_UP_RIGHT -> {
|
|
||||||
if (!isShowing) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// netflix capture back and hide ~monke
|
|
||||||
KeyEvent.KEYCODE_BACK -> {
|
|
||||||
if (isShowing) {
|
|
||||||
onClickChange()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
when (event.action) {
|
when (event.action) {
|
||||||
KeyEvent.ACTION_DOWN -> {
|
KeyEvent.ACTION_DOWN -> {
|
||||||
when (keyCode) {
|
when (keyCode) {
|
||||||
KeyEvent.KEYCODE_DPAD_CENTER -> {
|
KeyEvent.KEYCODE_DPAD_CENTER, KeyEvent.KEYCODE_DPAD_UP -> {
|
||||||
if (!isShowing) {
|
if (!isShowing) {
|
||||||
onClickChange()
|
onClickChange()
|
||||||
return true
|
return true
|
||||||
|
@ -1099,6 +1090,32 @@ class PlayerFragment : Fragment() {
|
||||||
//)
|
//)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
when (keyCode) {
|
||||||
|
// don't allow dpad move when hidden
|
||||||
|
KeyEvent.KEYCODE_DPAD_LEFT,
|
||||||
|
KeyEvent.KEYCODE_DPAD_DOWN,
|
||||||
|
KeyEvent.KEYCODE_DPAD_UP,
|
||||||
|
KeyEvent.KEYCODE_DPAD_RIGHT,
|
||||||
|
KeyEvent.KEYCODE_DPAD_DOWN_LEFT,
|
||||||
|
KeyEvent.KEYCODE_DPAD_DOWN_RIGHT,
|
||||||
|
KeyEvent.KEYCODE_DPAD_UP_LEFT,
|
||||||
|
KeyEvent.KEYCODE_DPAD_UP_RIGHT -> {
|
||||||
|
if (!isShowing) {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
autoHide()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// netflix capture back and hide ~monke
|
||||||
|
KeyEvent.KEYCODE_BACK -> {
|
||||||
|
if (isShowing) {
|
||||||
|
onClickChange()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
@ -1214,6 +1231,7 @@ class PlayerFragment : Fragment() {
|
||||||
val subsSettings = sourceDialog.findViewById<View>(R.id.subs_settings)!!
|
val subsSettings = sourceDialog.findViewById<View>(R.id.subs_settings)!!
|
||||||
|
|
||||||
subsSettings.setOnClickListener {
|
subsSettings.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
saveArguments()
|
saveArguments()
|
||||||
SubtitlesFragment.push(activity)
|
SubtitlesFragment.push(activity)
|
||||||
sourceDialog.dismiss()
|
sourceDialog.dismiss()
|
||||||
|
@ -1358,6 +1376,17 @@ class PlayerFragment : Fragment() {
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
updateLock()
|
updateLock()
|
||||||
|
|
||||||
|
exo_pause?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
|
handlePlayerEvent(PlayerEventType.Pause)
|
||||||
|
}
|
||||||
|
|
||||||
|
exo_play?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
|
handlePlayerEvent(PlayerEventType.Play)
|
||||||
|
}
|
||||||
|
|
||||||
context?.let { ctx ->
|
context?.let { ctx ->
|
||||||
setPreferredSubLanguage(ctx.getAutoSelectLanguageISO639_1())
|
setPreferredSubLanguage(ctx.getAutoSelectLanguageISO639_1())
|
||||||
}
|
}
|
||||||
|
@ -1638,6 +1667,7 @@ class PlayerFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
exo_rew?.setOnClickListener {
|
exo_rew?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
rewind()
|
rewind()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1666,6 +1696,7 @@ class PlayerFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
exo_ffwd?.setOnClickListener {
|
exo_ffwd?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
fastForward()
|
fastForward()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1707,7 +1738,7 @@ class PlayerFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player_holder.setOnTouchListener(
|
player_holder?.setOnTouchListener(
|
||||||
Listener()
|
Listener()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1727,10 +1758,12 @@ class PlayerFragment : Fragment() {
|
||||||
|
|
||||||
playback_speed_btt?.isVisible = playBackSpeedEnabled
|
playback_speed_btt?.isVisible = playBackSpeedEnabled
|
||||||
playback_speed_btt?.setOnClickListener {
|
playback_speed_btt?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
handlePlayerEvent(PlayerEventType.ShowSpeed)
|
handlePlayerEvent(PlayerEventType.ShowSpeed)
|
||||||
}
|
}
|
||||||
|
|
||||||
sources_btt.setOnClickListener {
|
sources_btt.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
handlePlayerEvent(PlayerEventType.ShowMirrors)
|
handlePlayerEvent(PlayerEventType.ShowMirrors)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1738,6 +1771,7 @@ class PlayerFragment : Fragment() {
|
||||||
if (playerResizeEnabled) {
|
if (playerResizeEnabled) {
|
||||||
resize_player?.visibility = VISIBLE
|
resize_player?.visibility = VISIBLE
|
||||||
resize_player?.setOnClickListener {
|
resize_player?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
handlePlayerEvent(PlayerEventType.Resize)
|
handlePlayerEvent(PlayerEventType.Resize)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1745,10 +1779,12 @@ class PlayerFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_op?.setOnClickListener {
|
skip_op?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
skipOP()
|
skipOP()
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_episode?.setOnClickListener {
|
skip_episode?.setOnClickListener {
|
||||||
|
autoHide()
|
||||||
handlePlayerEvent(PlayerEventType.NextEpisode)
|
handlePlayerEvent(PlayerEventType.NextEpisode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,9 @@ import kotlin.math.roundToInt
|
||||||
const val SEARCH_ACTION_LOAD = 0
|
const val SEARCH_ACTION_LOAD = 0
|
||||||
const val SEARCH_ACTION_SHOW_METADATA = 1
|
const val SEARCH_ACTION_SHOW_METADATA = 1
|
||||||
const val SEARCH_ACTION_PLAY_FILE = 2
|
const val SEARCH_ACTION_PLAY_FILE = 2
|
||||||
|
const val SEARCH_ACTION_FOCUSED = 4
|
||||||
|
|
||||||
class SearchClickCallback(val action: Int, val view: View, val card: SearchResponse)
|
class SearchClickCallback(val action: Int, val view: View, val position : Int, val card: SearchResponse)
|
||||||
|
|
||||||
class SearchAdapter(
|
class SearchAdapter(
|
||||||
var cardList: List<SearchResponse>,
|
var cardList: List<SearchResponse>,
|
||||||
|
@ -69,7 +70,7 @@ class SearchAdapter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchResultBuilder.bind(clickCallback, card, itemView)
|
SearchResultBuilder.bind(clickCallback, card, position, itemView)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ object SearchHelper {
|
||||||
} else {
|
} else {
|
||||||
handleSearchClickCallback(
|
handleSearchClickCallback(
|
||||||
activity,
|
activity,
|
||||||
SearchClickCallback(SEARCH_ACTION_LOAD, callback.view, callback.card)
|
SearchClickCallback(SEARCH_ACTION_LOAD, callback.view, -1, callback.card)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ object SearchResultBuilder {
|
||||||
fun bind(
|
fun bind(
|
||||||
clickCallback: (SearchClickCallback) -> Unit,
|
clickCallback: (SearchClickCallback) -> Unit,
|
||||||
card: SearchResponse,
|
card: SearchResponse,
|
||||||
|
position: Int,
|
||||||
itemView: View,
|
itemView: View,
|
||||||
nextFocusBehavior: Boolean? = null,
|
nextFocusBehavior: Boolean? = null,
|
||||||
nextFocusUp: Int? = null,
|
nextFocusUp: Int? = null,
|
||||||
|
@ -54,16 +55,17 @@ object SearchResultBuilder {
|
||||||
SearchClickCallback(
|
SearchClickCallback(
|
||||||
if (card is DataStoreHelper.ResumeWatchingResult) SEARCH_ACTION_PLAY_FILE else SEARCH_ACTION_LOAD,
|
if (card is DataStoreHelper.ResumeWatchingResult) SEARCH_ACTION_PLAY_FILE else SEARCH_ACTION_LOAD,
|
||||||
it,
|
it,
|
||||||
|
position,
|
||||||
card
|
card
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nextFocusUp != null) {
|
if (nextFocusUp != null) {
|
||||||
bg.nextFocusUpId = nextFocusUp
|
bg.nextFocusUpId = nextFocusUp
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nextFocusDown != null) {
|
if (nextFocusDown != null) {
|
||||||
bg.nextFocusDownId = nextFocusDown
|
bg.nextFocusDownId = nextFocusDown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,10 +85,16 @@ object SearchResultBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
bg.setOnLongClickListener {
|
bg.setOnLongClickListener {
|
||||||
clickCallback.invoke(SearchClickCallback(SEARCH_ACTION_SHOW_METADATA, it, card))
|
clickCallback.invoke(SearchClickCallback(SEARCH_ACTION_SHOW_METADATA, it, position, card))
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bg.setOnFocusChangeListener { view, b ->
|
||||||
|
if (b) {
|
||||||
|
clickCallback.invoke(SearchClickCallback(SEARCH_ACTION_FOCUSED, view, position, card))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
when (card) {
|
when (card) {
|
||||||
is DataStoreHelper.ResumeWatchingResult -> {
|
is DataStoreHelper.ResumeWatchingResult -> {
|
||||||
val pos = card.watchPos?.fixVisual()
|
val pos = card.watchPos?.fixVisual()
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
tools:visibility="gone"
|
||||||
android:id="@+id/home_loading"
|
android:id="@+id/home_loading"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
@ -148,7 +148,7 @@
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
<androidx.core.widget.NestedScrollView
|
<androidx.core.widget.NestedScrollView
|
||||||
android:background="?attr/primaryBlackBackground"
|
android:background="?attr/primaryBlackBackground"
|
||||||
tools:visibility="gone"
|
tools:visibility="visible"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
android:id="@+id/home_loaded"
|
android:id="@+id/home_loaded"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -417,8 +417,6 @@
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:nextFocusLeft="@id/nav_rail_view"
|
android:nextFocusLeft="@id/nav_rail_view"
|
||||||
android:nextFocusRight="@id/home_plan_to_watch_btt"
|
android:nextFocusRight="@id/home_plan_to_watch_btt"
|
||||||
android:nextFocusDown="@id/home_bookmarked_child_recyclerview"
|
|
||||||
android:nextFocusUp="@id/home_watch_child_recyclerview"
|
|
||||||
|
|
||||||
android:id="@+id/home_type_watching_btt"
|
android:id="@+id/home_type_watching_btt"
|
||||||
android:text="@string/type_watching"
|
android:text="@string/type_watching"
|
||||||
|
@ -426,8 +424,6 @@
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:nextFocusLeft="@id/home_type_watching_btt"
|
android:nextFocusLeft="@id/home_type_watching_btt"
|
||||||
android:nextFocusRight="@id/home_type_on_hold_btt"
|
android:nextFocusRight="@id/home_type_on_hold_btt"
|
||||||
android:nextFocusDown="@id/home_bookmarked_child_recyclerview"
|
|
||||||
android:nextFocusUp="@id/home_watch_child_recyclerview"
|
|
||||||
|
|
||||||
android:id="@+id/home_plan_to_watch_btt"
|
android:id="@+id/home_plan_to_watch_btt"
|
||||||
android:text="@string/type_plan_to_watch"
|
android:text="@string/type_plan_to_watch"
|
||||||
|
@ -435,8 +431,6 @@
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:nextFocusLeft="@id/home_plan_to_watch_btt"
|
android:nextFocusLeft="@id/home_plan_to_watch_btt"
|
||||||
android:nextFocusRight="@id/home_type_dropped_btt"
|
android:nextFocusRight="@id/home_type_dropped_btt"
|
||||||
android:nextFocusDown="@id/home_bookmarked_child_recyclerview"
|
|
||||||
android:nextFocusUp="@id/home_watch_child_recyclerview"
|
|
||||||
|
|
||||||
android:id="@+id/home_type_on_hold_btt"
|
android:id="@+id/home_type_on_hold_btt"
|
||||||
android:text="@string/type_on_hold"
|
android:text="@string/type_on_hold"
|
||||||
|
@ -444,16 +438,12 @@
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:nextFocusLeft="@id/home_type_on_hold_btt"
|
android:nextFocusLeft="@id/home_type_on_hold_btt"
|
||||||
android:nextFocusRight="@id/home_type_completed_btt"
|
android:nextFocusRight="@id/home_type_completed_btt"
|
||||||
android:nextFocusDown="@id/home_bookmarked_child_recyclerview"
|
|
||||||
android:nextFocusUp="@id/home_watch_child_recyclerview"
|
|
||||||
|
|
||||||
android:id="@+id/home_type_dropped_btt"
|
android:id="@+id/home_type_dropped_btt"
|
||||||
android:text="@string/type_dropped"
|
android:text="@string/type_dropped"
|
||||||
style="@style/RoundedSelectableButton"/>
|
style="@style/RoundedSelectableButton"/>
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:nextFocusLeft="@id/home_type_dropped_btt"
|
android:nextFocusLeft="@id/home_type_dropped_btt"
|
||||||
android:nextFocusDown="@id/home_bookmarked_child_recyclerview"
|
|
||||||
android:nextFocusUp="@id/home_watch_child_recyclerview"
|
|
||||||
|
|
||||||
android:id="@+id/home_type_completed_btt"
|
android:id="@+id/home_type_completed_btt"
|
||||||
android:text="@string/type_completed"
|
android:text="@string/type_completed"
|
||||||
|
|
|
@ -156,7 +156,7 @@
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
<ImageView
|
<ImageView
|
||||||
android:nextFocusDown="@id/result_bookmark_button"
|
android:nextFocusDown="@id/result_bookmark_button"
|
||||||
android:nextFocusRight="@id/result_bookmark_button"
|
android:nextFocusRight="@id/result_share"
|
||||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||||
|
|
||||||
android:id="@+id/result_back"
|
android:id="@+id/result_back"
|
||||||
|
|
Loading…
Reference in a new issue