Skip to content
This repository has been archived by the owner on Feb 1, 2023. It is now read-only.

Commit

Permalink
✨ Added buffering indicator
Browse files Browse the repository at this point in the history
  • Loading branch information
markhaehnel committed May 15, 2019
1 parent 34fa190 commit 068ac86
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 19 deletions.
Expand Up @@ -22,6 +22,7 @@ import de.markhaehnel.rbtv.rocketbeanstv.ui.schedule.ScheduleFragment
import de.markhaehnel.rbtv.rocketbeanstv.ui.serviceinfo.ServiceInfoFragment
import de.markhaehnel.rbtv.rocketbeanstv.ui.serviceinfo.ServiceInfoFragmentInterface
import de.markhaehnel.rbtv.rocketbeanstv.util.FragmentInterface
import de.markhaehnel.rbtv.rocketbeanstv.util.IntervalTask
import de.markhaehnel.rbtv.rocketbeanstv.util.autoCleared
import de.markhaehnel.rbtv.rocketbeanstv.util.highestBandwith
import kotlinx.android.synthetic.main.fragment_player.*
Expand All @@ -35,11 +36,12 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
var binding by autoCleared<FragmentPlayerBinding>()

private lateinit var playerViewModel: PlayerViewModel
private lateinit var playStateObserver: IntervalTask

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val dataBinding = DataBindingUtil.inflate<FragmentPlayerBinding>(
inflater,
de.markhaehnel.rbtv.rocketbeanstv.R.layout.fragment_player,
R.layout.fragment_player,
container,
false,
dataBindingComponent
Expand All @@ -60,23 +62,12 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
binding.setLifecycleOwner(viewLifecycleOwner)

binding.isChatVisible = playerViewModel.isChatVisible
binding.isBuffering = playerViewModel.isBuffering

initStreamData()
initObservers()
initPlayer()
}

private fun inflateChat() {
val fragmentTag = "tagFragmentChat"

if (childFragmentManager.findFragmentByTag(fragmentTag) == null) {
val chatFragment = ChatFragment()
childFragmentManager.beginTransaction().apply {
replace(R.id.chatContainer, chatFragment, fragmentTag)
commit()
}
}
}

override fun onResume() {
super.onResume()
videoView.start()
Expand All @@ -100,6 +91,18 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
return false
}

private fun inflateChat() {
val fragmentTag = "tagFragmentChat"

if (childFragmentManager.findFragmentByTag(fragmentTag) == null) {
val chatFragment = ChatFragment()
childFragmentManager.beginTransaction().apply {
replace(R.id.chatContainer, chatFragment, fragmentTag)
commit()
}
}
}

override fun onShowSchedule() {
super.onShowSchedule()
val fragmentTag = "fragment_schedule"
Expand Down Expand Up @@ -130,12 +133,10 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
return true
}



return false
}

private fun initStreamData() {
private fun initObservers() {
playerViewModel.streamPlaylist.observe(viewLifecycleOwner, Observer { streamPlaylist ->
if (streamPlaylist?.data != null) {
videoView.setVideoURI(streamPlaylist.data.highestBandwith().uri().toUri())
Expand All @@ -146,6 +147,9 @@ class PlayerFragment : Fragment(), Injectable, FragmentInterface, ServiceInfoFra
private fun initPlayer() {
videoView.setOnPreparedListener {
videoView.start()
playStateObserver = IntervalTask(lifecycle, 2000, Runnable {
playerViewModel.isBuffering.postValue(!videoView.isPlaying)
})
}
}
}
Expand Up @@ -38,6 +38,8 @@ class PlayerViewModel

var isChatVisible = MutableLiveData<Boolean>().apply { value = false }

var isBuffering = MutableLiveData<Boolean>().apply { value = true }

fun retry() {
//TODO: implement retry
}
Expand Down
@@ -0,0 +1,37 @@
package de.markhaehnel.rbtv.rocketbeanstv.util

import android.os.Handler
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent

class IntervalTask(
lifecycle: Lifecycle,
interval: Long,
task: Runnable
) : LifecycleObserver {

private val handler = Handler()
private lateinit var intervalRunnable : Runnable

init {
intervalRunnable = Runnable {
try {
task.run()
} finally {
handler.postDelayed(intervalRunnable, interval)
}
}
lifecycle.addObserver(this)
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun start() {
intervalRunnable.run()
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun stop() {
handler.removeCallbacks(intervalRunnable)
}
}
40 changes: 38 additions & 2 deletions app/src/main/res/layout/fragment_player.xml
Expand Up @@ -7,6 +7,7 @@

<variable name="retryCallback" type="de.markhaehnel.rbtv.rocketbeanstv.ui.common.RetryCallback"/>
<variable name="isChatVisible" type="LiveData&lt;Boolean>"/>
<variable name="isBuffering" type="LiveData&lt;Boolean>"/>

</data>

Expand All @@ -22,7 +23,42 @@
android:layout_height="match_parent"
app:useDefaultControls="false"
app:layout_constraintRight_toLeftOf="@+id/chatContainer"
app:layout_constraintLeft_toLeftOf="parent"/>
app:layout_constraintLeft_toLeftOf="parent">
</com.devbrackets.android.exomedia.ui.widget.VideoView>

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bufferingContainer"
android:animateLayoutChanges="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:visibleHidden="@{isBuffering}">

<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBuffering"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:indeterminateTint="@color/progressBar"/>

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_logo"
android:id="@+id/logoBuffering"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

<FrameLayout
android:layout_width="0dp"
Expand All @@ -37,7 +73,7 @@
android:layout_height="match_parent"
android:id="@+id/chatContainer"
app:layout_constraintRight_toRightOf="parent"
app:visibleGone="@{safeUnbox(isChatVisible)}"
app:visibleGone="@{isChatVisible}"
android:visibility="gone"/>

</androidx.constraintlayout.widget.ConstraintLayout>
Expand Down

0 comments on commit 068ac86

Please sign in to comment.