Amit Chavan
Amit Chavan

Reputation: 13

Exo player fast scroll playing video sound mixed

I am using exoplayer for playing videos .And for this we are used Fragment instance with pagerstateadapter and viewpager2. But when scroll fast previous played video sound listen in background as well as in screen video means mix the sound in same video player. Please help me how to solve this.

1.State adapter

class StoriesPagerAdapter(
fragment: Fragment,
val onClick1: VideoItemAdapter.OnItemClicked?,
val onlikeClick: VideoItemAdapter.OnLikeCLicked?,
val onFollowClick: VideoItemAdapter.OnFollowCLicked?,
val ontrendingClick: VideoItemAdapter.OnTrendCLicked?,
val oniconCLick: VideoItemAdapter.OnIconClick?) : FragmentStateAdapter(fragment) {
val dataList:MutableList<Gettrendingvideos.Data.Postlist>=mutableListOf()
override fun getItemCount(): Int {
    return dataList.size
}

fun addAll(movies: MutableList<Gettrendingvideos.Data.Postlist>) {
    for (movie in movies) {
        add(movie)
    }
}

fun add(moive: Gettrendingvideos.Data.Postlist) {
    dataList.add(moive)
    notifyItemInserted(dataList.size - 1)
}

override fun createFragment(position: Int): Fragment {
    return StoryViewFragment.newInstance(
        onClick1,
        onlikeClick,
        onFollowClick,
        ontrendingClick,
        oniconCLick,
        dataList[position]
    )
}}

2 Fragment

class StoryViewFragment : Fragment(), CommentFragment.onCommentCountIncrease {

private var storyUrl: String? = null
private var storiesDataModel: Gettrendingvideos.Data.Postlist? = null
lateinit var mView: View
private var simplePlayer: SimpleExoPlayer? = null
private var cacheDataSourceFactory: CacheDataSourceFactory? = null
private val simpleCache = MainApplication.simpleCache
private var toPlayVideoPosition: Int = -1
lateinit var viewModel: MainViewModel
lateinit var preferences: SecurePreferences
private var bool: Boolean? = false
var onItemClick: VideoItemAdapter.OnItemClicked? = null
var onlikeCLicked: VideoItemAdapter.OnLikeCLicked? = null
var onFollowCLicked: VideoItemAdapter.OnFollowCLicked? = null
var onTrendCLicked: VideoItemAdapter.OnTrendCLicked? = null
var onIconClick: VideoItemAdapter.OnIconClick? = null
lateinit var huserId: String
lateinit var token: String


companion object {

    fun newInstance(
        itemClicked: VideoItemAdapter.OnItemClicked?,
        likeCLicked: VideoItemAdapter.OnLikeCLicked?,
        onFollowCLicked: VideoItemAdapter.OnFollowCLicked?,
        onTrendCLicked: VideoItemAdapter.OnTrendCLicked?,
        onIconClick: VideoItemAdapter.OnIconClick?,
        storiesDataModel: Gettrendingvideos.Data.Postlist
    ) = StoryViewFragment()
        .apply {
            arguments = Bundle().apply {
                putParcelable(Constants.KEY_STORY_DATA, storiesDataModel)
            }
            this.onItemClick = itemClicked
            this.onlikeCLicked = likeCLicked
            this.onFollowCLicked = onFollowCLicked
            this.onTrendCLicked = onTrendCLicked
            this.onIconClick = onIconClick
        }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    // Inflate the layout for this fragment
    mView = inflater.inflate(
        R.layout.layout_main,
        container,
        false
    )
    return mView
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewModel = ViewModelProviders.of(this, ViewModelFactory(RetrofitBuilder.apiService))
        .get(MainViewModel::class.java)
    preferences =
        SecurePreferences(
            requireActivity(),
            AppConstants.preferenceName,
            AppConstants.USER_DETAILS,
            true
        )
    storiesDataModel = arguments?.getParcelable(Constants.KEY_STORY_DATA)
    setData()

}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    if (!preferences.getString(AppConstants.USER_ID).equals(null)) {
        huserId = preferences.getString(AppConstants.USER_ID)!!
        Log.d("TAG", "onActivityCreated: $huserId")
    }

} 
@SuppressLint("SetTextI18n")
private fun setData() {
    Log.d("TAG", "setData: $storiesDataModel")
    mView.textview2.text = storiesDataModel?.user_name
    mView.like_count.text = storiesDataModel?.total_likes.toString()
    comment_count.text = storiesDataModel?.total_comments.toString()
    mView.textview.text = storiesDataModel?.type
    Glide.with(this).load(storiesDataModel?.user_profile_pic).placeholder(R.drawable.profile).into(mView.image)
    if (storiesDataModel?.is_like == 0) {
        mView.imageView4.setImageResource(R.drawable.ic_like)
    } else {
        mView.imageView4.setImageResource(R.drawable.ic_like_red)
    }
    if (storiesDataModel?.is_following!! == 0) {
        mView.textview3.text = "Follow"
    } else {
        mView.textview3.text = "Following"
    }
    if (storiesDataModel?.user_id.toString()==preferences.getString(AppConstants.USER_ID)) {
        mView.textview3.visibility = View.GONE
    }
    image.setOnClickListener {
        if (preferences.getString(AppConstants.token).equals(null)) {
               MainActivity().show(childFragmentManager, "")
        } else {
            preferences.put(
                AppConstants.OtherProfile_UserId,
                storiesDataModel?.user_id.toString()
            )
        
        }

    }
     
    val simplePlayer = getPlayer()
    player_view_story.player = simplePlayer player_view_story.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL)
    simplePlayer?.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING)
    storyUrl = storiesDataModel?.video_url
    prepareMedia(storiesDataModel)

}


override fun onPause() {
    pauseVideo()
   super.onPause()
}

override fun onResume() {
    restartVideo()
     super.onResume()
}

override fun onDestroy() {
    releasePlayer()
    super.onDestroy()
}

private fun pausePlayer() {
    simplePlayer?.setPlayWhenReady(false)
    simplePlayer?.getPlaybackState()
}

private fun startPlayer() {
    simplePlayer?.setPlayWhenReady(true)
    simplePlayer?.getPlaybackState()
}

private val playerCallback: Player.EventListener? = object : Player.EventListener {
    override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
        
    }

    override fun onPlayerError(error: com.google.android.exoplayer2.ExoPlaybackException?) {
        super.onPlayerError(error)
    }
}

private fun prepareVideoPlayer() {
    simplePlayer = ExoPlayerFactory.newSimpleInstance(context)
    cacheDataSourceFactory = CacheDataSourceFactory(
        simpleCache,
        DefaultHttpDataSourceFactory(
            Util.getUserAgent(
                context,
                "exo"
            )
        )
    )
}

private fun getPlayer(): SimpleExoPlayer? {
    if (simplePlayer == null) {
        prepareVideoPlayer()
    }
    return simplePlayer
}

private fun prepareMedia(datamodel: Gettrendingvideos.Data.Postlist?{
   val uri = Uri.parse(datamodel?.video_url)  

    simplePlayer.repeatMode = Player.REPEAT_MODE_ONE
    simplePlayer.playWhenReady = true
    if (storiesDataModel!!.type == "following") {
        following_page.typeface = Typeface.DEFAULT_BOLD
        trending_page.setTypeface(null, Typeface.NORMAL)
    } else {
        following_page.setTypeface(null, Typeface.BOLD)
    }

    if (storiesDataModel.type == "treading") {
        trending_page.typeface = Typeface.DEFAULT_BOLD
        following_page.setTypeface(null, Typeface.NORMAL)
    } else {
        trending_page.setTypeface(null, Typeface.BOLD)
    }
    if (simplePlayer.playWhenReady == true) {         
    }
    simplePlayer.addListener(playerCallback)

    toPlayVideoPosition = -1
}

private fun setArtwork(drawable: Drawable, playerView: PlayerView) {
    playerView.useArtwork = true
    playerView.defaultArtwork = drawable
}

private fun playVideo() {
    simplePlayer.playWhenReady = true
}

private fun restartVideo() {
    if (simplePlayer == null) {
        prepareMedia(storiesDataModel)
    } else {
        simplePlayer.seekToDefaultPosition()
        simplePlayer.playWhenReady = true
    }
}

private fun pauseVideo() {
    simplePlayer.playWhenReady = false
}

private fun releasePlayer() {
    simplePlayer.stop(true)
    simplePlayer.release()
}}

Upvotes: 0

Views: 363

Answers (1)

Karan
Karan

Reputation: 11

override fun setMenuVisibility(menuVisible: Boolean) {

    if (!menuVisible){
        simplePlayer?.playWhenReady = false
        simplePlayer?.pause()
    }

    super.setMenuVisibility(menuVisible)
}

JUST ADD THIS IN YOUR StoryViewFragment.

Upvotes: 1

Related Questions