eneim / toro

Video list auto playback made simple, specially built for RecyclerView
Apache License 2.0
1.41k stars 253 forks source link

How can I auto-play without user interaction? #463

Open yektasarioglu opened 4 years ago

yektasarioglu commented 4 years ago

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.

eneim commented 4 years ago

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?

yektasarioglu commented 4 years ago

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()")
                }
            })

        }
}