0

My app contains links to youtube videos, what I want is when the user clicks on a picture the respective youtube video should be played in a Floating window as it happens in WhatsApp.

Is there any way to achieve this without using any new dependency? and if not please guide me on how to do this.

Ayush Raj
  • 3
  • 1
  • 3

1 Answers1

0

Well I finally made it work.

import android.app.PendingIntent
import android.app.PictureInPictureParams
import android.app.RemoteAction
import android.content.Intent
import android.content.res.Configuration
import android.graphics.drawable.Icon
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.util.Rational
import android.view.Window
import android.widget.Toast
import com.google.android.youtube.player.YouTubeBaseActivity
import com.google.android.youtube.player.YouTubeInitializationResult
import com.google.android.youtube.player.YouTubePlayer
import com.nishanatthani.nnfda.R
import com.nishanatthani.nnfda.databinding.ActivityMainBinding


class MainActivity : YouTubeBaseActivity() {
    private lateinit var bind: ActivityMainBinding
    private val RECOVERY_REQUEST = 1
    private var yPlayer: YouTubePlayer? = null
    private lateinit var yListener: YouTubePlayer.OnInitializedListener
    private val apiKey: String = "<API_KEY>"
    private var id: String = "a"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        bind = ActivityMainBinding.inflate(layoutInflater)
        requestWindowFeature(Window.FEATURE_NO_TITLE)
        setContentView(bind.root)
        if (intent != null) {
            id = intent.getStringExtra("id").toString()
            if (id == "a") {
                onBackPressed()
            }
        } else {
            onBackPressed()
        }
        initializeListener()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val actions = ArrayList<RemoteAction>()
                .add(
                    RemoteAction(
                        Icon.createWithResource(
                            this@MainActivity,
                            R.drawable.ic_right
                        ),
                        "Play", " ",
                        PendingIntent.getActivity(
                            this@MainActivity, 0,
                            Intent(
                                Intent.ACTION_VIEW,
                                Uri.parse("https://www.youtube.com/channel/UCC8Z-Sv-pUsKtQof9ROm3hw/videos")
                            ),
                            PendingIntent.FLAG_ONE_SHOT
                        )
                    )
                )
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val pParams = PictureInPictureParams.Builder()
            pParams.setAspectRatio(
                Rational(340, 150)
            )
            enterPictureInPictureMode(pParams.build())
        } else {
            getYouTubePlayerProvider().initialize(apiKey, yListener)
        }
    }

    private fun initializeListener() {
        yListener = object : YouTubePlayer.OnInitializedListener {
            override fun onInitializationSuccess(
                provider: YouTubePlayer.Provider?,
                player: YouTubePlayer?,
                wasRestored: Boolean
            ) {
                yPlayer = player
                Log.e("InitializtionS1", wasRestored.toString())
                if (!wasRestored) {
                    player?.loadVideo(id)
                }
                player?.setPlaybackEventListener(object : YouTubePlayer.PlaybackEventListener {
                    override fun onPlaying() {
                        Log.d("Playback", "Playing")
                    }

                    override fun onPaused() {
                        Log.d("Playback", "Paused")
                    }

                    override fun onStopped() {
//                finish()
                        Log.d("Playback", "Stopped")
                    }

                    override fun onBuffering(p0: Boolean) {
                        Log.d("Playback", "Buffering")
                    }

                    override fun onSeekTo(p0: Int) {
                        Log.d("Playback", "Seek")
                    }
                })

                player?.setPlayerStateChangeListener(object :
                    YouTubePlayer.PlayerStateChangeListener {
                    override fun onLoading() {
                        Log.d("State", "Loading")
                    }

                    override fun onLoaded(p0: String?) {
//                player.play()
                        Log.d("State", "Loaded")
                    }

                    override fun onAdStarted() {
                        Log.d("State", "Ad")
                    }

                    override fun onVideoStarted() {
                        Log.d("State", "Started")
                    }

                    override fun onVideoEnded() {
                        Log.d("State", "Ended")
                        finish()
                    }

                    override fun onError(p0: YouTubePlayer.ErrorReason?) {
                        Log.e("YPlayer", "Error ${p0?.name}")
//                Toast.makeText(this@MainActivity, "Error ${p0?.name}", Toast.LENGTH_LONG).show()
                        player.play()
                    }

                })
            }

            override fun onInitializationFailure(
                provider: YouTubePlayer.Provider?,
                errorReason: YouTubeInitializationResult?
            ) {
                if (errorReason?.isUserRecoverableError == true) {
                    errorReason.getErrorDialog(this@MainActivity, RECOVERY_REQUEST).show()
                } else {
                    Toast.makeText(
                        this@MainActivity,
                        "Player Error ${errorReason.toString()})",
                        Toast.LENGTH_LONG
                    )
                        .show()
                }
            }


        }

    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == RECOVERY_REQUEST) {
            // Retry initialization if user performed a recovery action
            getYouTubePlayerProvider().initialize(apiKey, yListener)
        }
        super.onActivityResult(requestCode, resultCode, data)
    }

    private fun getYouTubePlayerProvider(): YouTubePlayer.Provider {
        return bind.player
    }

    override fun onPictureInPictureRequested(): Boolean {
        Log.e("Pip Requested", "Requested")
        return super.onPictureInPictureRequested()
    }

    override fun onPictureInPictureModeChanged(
        isInPictureInPictureMode: Boolean,
        newConfig: Configuration?
    ) {
        getYouTubePlayerProvider().initialize(apiKey, yListener)
        Log.e("PlayerPip", isInPictureInPictureMode.toString())
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
    }

    override fun onBackPressed() {
        finish()
        super.onBackPressed()
    }
}
Ayush Raj
  • 3
  • 1
  • 3