toro
toro copied to clipboard
How can I auto-play without user interaction?
Hi @eneim, toro does not play video automatically when a user does not interact with it. Is this can be caused because my single Viewholder fills the entire screen. My purpose is to auto-play without user scrolling. Is this possible or if it is possible, how? Thanks.
Hi there, toro default behavior is to start the playback automatically. It should be a bug if not. Can you share with me your ViewHolder implementation? Do you use CoordinatorLayout with Behavior?
Sorry for the late response. Here it is the viewholder.xml and its implementation;
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/performancePlayerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:player_layout_id="@layout/toro_exo_player_view"
app:resize_mode="fill"
app:surface_type="texture_view"
app:use_controller="false"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Viewholder implementation;
class VideoAdapter(
var data: ArrayList<Any>?,
var activity: FragmentActivity
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var helper: ExoPlayerViewHelper? = null
var viewHolder: RecyclerView.ViewHolder? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
Log.i(TAG, "onCreateViewHolder(...)")
when (viewType) {
VideoItemType.PERFOMANCE.id -> {
val view = LayoutInflater.from(activity).inflate(R.layout.feed_performance_row, parent, false)
viewHolder = VideoViewHolder(view)
}
}
return viewHolder!!
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is VideoViewHolder -> {
val video: Video? = data?.get(position) as Video
holder.setupView(video)
}
}
}
inner class VideoViewHolder(private val view: View?) : ToroPlayer {
var mediaUri: Uri?
fun setupView(video: Video) {
mediaUri = Uri.parse(video?.playUrl)
}
override fun getPlayerView(): View {
return view?.performancePlayerView!!
}
override fun wantsToPlay(): Boolean {
return ToroUtil.visibleAreaOffset(this, itemView.parent) >= 0.85
}
override fun getPlayerOrder(): Int {
return adapterPosition
}
override fun play() {
Log.i(TAG, "play()")
helper?.play()
}
override fun pause() {
Log.i(TAG, "pause()")
helper?.pause() ?: Log.i(TAG, "Helper is null and it won't pause !!")
}
override fun isPlaying(): Boolean {
return helper != null && helper?.isPlaying!!
}
override fun getCurrentPlaybackInfo(): PlaybackInfo {
Log.i(TAG, "resumePosition is ${helper?.latestPlaybackInfo?.resumePosition}")
return helper?.latestPlaybackInfo ?: PlaybackInfo()
}
override fun release() {
Log.i(TAG, "Helper has release()")
helper?.release()
helper = null
}
override fun initialize(container: Container, playbackInfo: PlaybackInfo) {
if (helper == null) {
Log.i(TAG, "Helper will be initialized !!")
helper = ExoPlayerViewHelper(this, presenter?.mediaUri!!, null, FeedCategoryFragment.config)
Log.i(TAG, "Helper has initialized !!")
}
helper?.initialize(container, playbackInfo)
helper?.addEventListener(object : Playable.DefaultEventListener() {
private var TAG = "EventListener"
private var isSeekSet: Boolean = false
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
super.onPlayerStateChanged(playWhenReady, playbackState)
Log.i(TAG, "onPlayerStateChanged(...)")
if (playWhenReady && playbackState == Player.STATE_ENDED) {
Log.i(TAG, "Performance ended !!")
seekPlayer(0)
pause()
showCoverImage()
showPlay()
} else if (playWhenReady) {
Log.i(TAG, "Video playback ended !!")
} else {
Log.i(TAG, "Video paused")
}
}
})
helper?.addPlayerEventListener(object : ToroPlayer.EventListener {
private var TAG = "PlayerEventListener"
override fun onBuffering() {
Log.i(TAG, "onBuffering()")
}
override fun onFirstFrameRendered() {
Log.i(TAG, "onFirstFrameRendered()")
}
override fun onPlaying() {
Log.i(TAG, "onPlaying()")
hideCoverImage()
}
override fun onPaused() {
Log.i(TAG, "onPaused()")
}
override fun onCompleted() {
Log.i(TAG, "onCompleted()")
}
})
}
}