migrate player episodes list to DialogFragment; change hideBars() behaviour
This commit is contained in:
		@ -53,8 +53,8 @@ import kotlinx.coroutines.launch
 | 
				
			|||||||
import org.mosad.teapod.R
 | 
					import org.mosad.teapod.R
 | 
				
			||||||
import org.mosad.teapod.parser.crunchyroll.NoneEpisode
 | 
					import org.mosad.teapod.parser.crunchyroll.NoneEpisode
 | 
				
			||||||
import org.mosad.teapod.preferences.Preferences
 | 
					import org.mosad.teapod.preferences.Preferences
 | 
				
			||||||
 | 
					import org.mosad.teapod.ui.activity.player.fragment.EpisodeListDialogFragment
 | 
				
			||||||
import org.mosad.teapod.ui.activity.player.fragment.LanguageSettingsDialogFragment
 | 
					import org.mosad.teapod.ui.activity.player.fragment.LanguageSettingsDialogFragment
 | 
				
			||||||
import org.mosad.teapod.ui.components.EpisodesListPlayer
 | 
					 | 
				
			||||||
import org.mosad.teapod.util.hideBars
 | 
					import org.mosad.teapod.util.hideBars
 | 
				
			||||||
import org.mosad.teapod.util.isInPiPMode
 | 
					import org.mosad.teapod.util.isInPiPMode
 | 
				
			||||||
import org.mosad.teapod.util.navToLauncherTask
 | 
					import org.mosad.teapod.util.navToLauncherTask
 | 
				
			||||||
@ -480,11 +480,8 @@ class PlayerActivity : AppCompatActivity() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun showEpisodesList() {
 | 
					    private fun showEpisodesList() {
 | 
				
			||||||
        val episodesList = EpisodesListPlayer(this, model = model).apply {
 | 
					 | 
				
			||||||
            onViewRemovedAction = { model.player.play() }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        player_layout.addView(episodesList)
 | 
					 | 
				
			||||||
        pauseAndHideControls()
 | 
					        pauseAndHideControls()
 | 
				
			||||||
 | 
					        EpisodeListDialogFragment().show(supportFragmentManager, EpisodeListDialogFragment.TAG)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun showLanguageSettings() {
 | 
					    private fun showLanguageSettings() {
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					package org.mosad.teapod.ui.activity.player.fragment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.DialogInterface
 | 
				
			||||||
 | 
					import android.os.Bundle
 | 
				
			||||||
 | 
					import android.view.LayoutInflater
 | 
				
			||||||
 | 
					import android.view.View
 | 
				
			||||||
 | 
					import android.view.ViewGroup
 | 
				
			||||||
 | 
					import androidx.fragment.app.DialogFragment
 | 
				
			||||||
 | 
					import androidx.lifecycle.ViewModelProvider
 | 
				
			||||||
 | 
					import org.mosad.teapod.R
 | 
				
			||||||
 | 
					import org.mosad.teapod.databinding.PlayerEpisodesListBinding
 | 
				
			||||||
 | 
					import org.mosad.teapod.ui.activity.player.PlayerViewModel
 | 
				
			||||||
 | 
					import org.mosad.teapod.util.adapter.EpisodeItemAdapter
 | 
				
			||||||
 | 
					import org.mosad.teapod.util.hideBars
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EpisodeListDialogFragment : DialogFragment()  {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private lateinit var model: PlayerViewModel
 | 
				
			||||||
 | 
					    private lateinit var binding: PlayerEpisodesListBinding
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    companion object {
 | 
				
			||||||
 | 
					        const val TAG = "LanguageSettingsDialogFragment"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun onCreate(savedInstanceState: Bundle?) {
 | 
				
			||||||
 | 
					        super.onCreate(savedInstanceState)
 | 
				
			||||||
 | 
					        setStyle(STYLE_NO_TITLE, R.style.FullScreenDialogStyle)
 | 
				
			||||||
 | 
					        model = ViewModelProvider(requireActivity())[PlayerViewModel::class.java]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
 | 
				
			||||||
 | 
					        binding = PlayerEpisodesListBinding.inflate(inflater, container, false)
 | 
				
			||||||
 | 
					        return binding.root
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 | 
				
			||||||
 | 
					        super.onViewCreated(view, savedInstanceState)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        binding.buttonCloseEpisodesList.setOnClickListener {
 | 
				
			||||||
 | 
					            dismiss()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        val adapterRecEpisodes = EpisodeItemAdapter(
 | 
				
			||||||
 | 
					            model.episodes.items,
 | 
				
			||||||
 | 
					            null,
 | 
				
			||||||
 | 
					            mapOf(),
 | 
				
			||||||
 | 
					            EpisodeItemAdapter.OnClickListener { episode ->
 | 
				
			||||||
 | 
					                dismiss()
 | 
				
			||||||
 | 
					                model.setCurrentEpisode(episode.id, startPlayback = true)
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            EpisodeItemAdapter.ViewType.PLAYER
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // episodeNumber starts at 1, we need the episode index -> - 1
 | 
				
			||||||
 | 
					        adapterRecEpisodes.currentSelected = model.currentEpisode.episodeNumber?.minus(1) ?: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        binding.recyclerEpisodesPlayer.adapter = adapterRecEpisodes
 | 
				
			||||||
 | 
					        binding.recyclerEpisodesPlayer.scrollToPosition(adapterRecEpisodes.currentSelected)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // initially hide the status and navigation bar
 | 
				
			||||||
 | 
					        hideBars(requireDialog().window, binding.root)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    override fun onDismiss(dialog: DialogInterface) {
 | 
				
			||||||
 | 
					        super.onDismiss(dialog)
 | 
				
			||||||
 | 
					        model.player.play()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,48 +0,0 @@
 | 
				
			|||||||
package org.mosad.teapod.ui.components
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import android.content.Context
 | 
					 | 
				
			||||||
import android.util.AttributeSet
 | 
					 | 
				
			||||||
import android.view.LayoutInflater
 | 
					 | 
				
			||||||
import android.view.ViewGroup
 | 
					 | 
				
			||||||
import android.widget.LinearLayout
 | 
					 | 
				
			||||||
import org.mosad.teapod.databinding.PlayerEpisodesListBinding
 | 
					 | 
				
			||||||
import org.mosad.teapod.ui.activity.player.PlayerViewModel
 | 
					 | 
				
			||||||
import org.mosad.teapod.util.adapter.EpisodeItemAdapter
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class EpisodesListPlayer @JvmOverloads constructor(
 | 
					 | 
				
			||||||
    context: Context,
 | 
					 | 
				
			||||||
    attrs: AttributeSet? = null,
 | 
					 | 
				
			||||||
    defStyleAttr: Int = 0,
 | 
					 | 
				
			||||||
    model: PlayerViewModel? = null
 | 
					 | 
				
			||||||
) : LinearLayout(context, attrs, defStyleAttr) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private val binding = PlayerEpisodesListBinding.inflate(LayoutInflater.from(context), this, true)
 | 
					 | 
				
			||||||
    var onViewRemovedAction: (() -> Unit)? = null // TODO find a better solution for this
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    init {
 | 
					 | 
				
			||||||
        binding.buttonCloseEpisodesList.setOnClickListener {
 | 
					 | 
				
			||||||
            (this.parent as ViewGroup).removeView(this)
 | 
					 | 
				
			||||||
            onViewRemovedAction?.invoke()
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        model?.let {
 | 
					 | 
				
			||||||
            val adapterRecEpisodes = EpisodeItemAdapter(
 | 
					 | 
				
			||||||
                model.episodes.items,
 | 
					 | 
				
			||||||
                null,
 | 
					 | 
				
			||||||
                mapOf(),
 | 
					 | 
				
			||||||
                EpisodeItemAdapter.OnClickListener { episode ->
 | 
					 | 
				
			||||||
                    (this.parent as ViewGroup).removeView(this)
 | 
					 | 
				
			||||||
                    model.setCurrentEpisode(episode.id, startPlayback = true)
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                EpisodeItemAdapter.ViewType.PLAYER
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // episodeNumber starts at 1, we need the episode index -> - 1
 | 
					 | 
				
			||||||
            adapterRecEpisodes.currentSelected = model.currentEpisode.episodeNumber?.minus(1) ?: 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            binding.recyclerEpisodesPlayer.adapter = adapterRecEpisodes
 | 
					 | 
				
			||||||
            binding.recyclerEpisodesPlayer.scrollToPosition(adapterRecEpisodes.currentSelected)
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -61,7 +61,7 @@ fun hideBars(window: Window?, root: View) {
 | 
				
			|||||||
        WindowCompat.setDecorFitsSystemWindows(window, false)
 | 
					        WindowCompat.setDecorFitsSystemWindows(window, false)
 | 
				
			||||||
        WindowInsetsControllerCompat(window, root).let { controller ->
 | 
					        WindowInsetsControllerCompat(window, root).let { controller ->
 | 
				
			||||||
            controller.hide(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.navigationBars())
 | 
					            controller.hide(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.navigationBars())
 | 
				
			||||||
            controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE
 | 
					            controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
					<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
					    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
				
			||||||
 | 
					    xmlns:tools="http://schemas.android.com/tools"
 | 
				
			||||||
    android:layout_width="match_parent"
 | 
					    android:layout_width="match_parent"
 | 
				
			||||||
    android:layout_height="match_parent"
 | 
					    android:layout_height="match_parent"
 | 
				
			||||||
    android:background="#73000000">
 | 
					    android:background="#73000000">
 | 
				
			||||||
@ -17,12 +18,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        <ImageButton
 | 
					        <ImageButton
 | 
				
			||||||
            android:id="@+id/exo_close_player"
 | 
					            android:id="@+id/exo_close_player"
 | 
				
			||||||
 | 
					            android:layout_width="48dp"
 | 
				
			||||||
 | 
					            android:layout_height="48dp"
 | 
				
			||||||
            android:background="@android:color/transparent"
 | 
					            android:background="@android:color/transparent"
 | 
				
			||||||
            android:scaleType="fitXY"
 | 
					 | 
				
			||||||
            android:layout_width="44dp"
 | 
					 | 
				
			||||||
            android:layout_height="44dp"
 | 
					 | 
				
			||||||
            android:contentDescription="@string/close_player"
 | 
					            android:contentDescription="@string/close_player"
 | 
				
			||||||
            android:padding="10dp"
 | 
					            android:padding="10dp"
 | 
				
			||||||
 | 
					            android:scaleType="fitXY"
 | 
				
			||||||
            app:srcCompat="@drawable/ic_baseline_arrow_back_24" />
 | 
					            app:srcCompat="@drawable/ic_baseline_arrow_back_24" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <TextView
 | 
					        <TextView
 | 
				
			||||||
@ -32,8 +33,9 @@
 | 
				
			|||||||
            android:layout_marginEnd="44dp"
 | 
					            android:layout_marginEnd="44dp"
 | 
				
			||||||
            android:text="@string/text_title_ex"
 | 
					            android:text="@string/text_title_ex"
 | 
				
			||||||
            android:textAlignment="center"
 | 
					            android:textAlignment="center"
 | 
				
			||||||
            android:textColor="@color/exo_white"
 | 
					            android:textColor="@color/player_white"
 | 
				
			||||||
            android:textSize="16sp" />
 | 
					            android:textSize="16sp"
 | 
				
			||||||
 | 
					            tools:ignore="TextContrastCheck" />
 | 
				
			||||||
    </LinearLayout>
 | 
					    </LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <LinearLayout
 | 
					    <LinearLayout
 | 
				
			||||||
@ -90,12 +92,12 @@
 | 
				
			|||||||
        android:layout_gravity="bottom"
 | 
					        android:layout_gravity="bottom"
 | 
				
			||||||
        android:layout_marginStart="12dp"
 | 
					        android:layout_marginStart="12dp"
 | 
				
			||||||
        android:layout_marginEnd="12dp"
 | 
					        android:layout_marginEnd="12dp"
 | 
				
			||||||
        android:layout_marginBottom="@dimen/exo_styled_progress_margin_bottom">
 | 
					        android:layout_marginBottom="@dimen/player_styled_progress_margin_bottom">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <View
 | 
					        <View
 | 
				
			||||||
            android:id="@+id/exo_progress_placeholder"
 | 
					            android:id="@+id/exo_progress_placeholder"
 | 
				
			||||||
            android:layout_width="0dp"
 | 
					            android:layout_width="0dp"
 | 
				
			||||||
            android:layout_height="@dimen/exo_styled_progress_layout_height"
 | 
					            android:layout_height="@dimen/player_styled_progress_layout_height"
 | 
				
			||||||
            android:layout_marginBottom="2dp"
 | 
					            android:layout_marginBottom="2dp"
 | 
				
			||||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
					            app:layout_constraintBottom_toBottomOf="parent"
 | 
				
			||||||
            app:layout_constraintEnd_toStartOf="@+id/exo_remaining"
 | 
					            app:layout_constraintEnd_toStartOf="@+id/exo_remaining"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								app/src/main/res/values/dimens.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/src/main/res/values/dimens.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					    <dimen name="player_styled_progress_layout_height">48dp</dimen>
 | 
				
			||||||
 | 
					    <dimen name="player_styled_progress_margin_bottom">52dp</dimen>
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user