সঠিক সময়ে PiP মোড চালু করা

নিম্নলিখিত পরিস্থিতিতে আপনার অ্যাপ PiP মোডে প্রবেশ করা উচিত নয়:

  • ভিডিও বন্ধ বা পজ করা থাকলে।
  • আপনি যদি ভিডিও প্লেয়ারের পরিবর্তে অ্যাপের অন্য কোনও পৃষ্ঠায় থাকেন।

আপনার অ্যাপ কখন PiP মোডে প্রবেশ করবে তা কন্ট্রোল করতে, এমন একটি ভেরিয়েবল যোগ করুন যা mutableStateOf ব্যবহার করে ভিডিও প্লেয়ারের স্টেট ট্র্যাক করে।

ভিডিও চলছে কিনা তার উপর ভিত্তি করে টগল করা

ভিডিও প্লেয়ার চলছে কিনা তার উপর ভিত্তি করে স্ট্যাটাস টগল করতে, ভিডিও প্লেয়ারে একটি লিসনার যোগ করুন। প্লেয়ার চলছে কিনা তার উপর ভিত্তি করে আপনার স্টেট ভেরিয়েবলের স্টেট টগল করুন:

player.addListener(object : Player.Listener {
    override fun onIsPlayingChanged(isPlaying: Boolean) {
        shouldEnterPipMode = isPlaying
    }
})

প্লেয়ার রিলিজ করা হয়েছে কিনা তার উপর ভিত্তি করে টগল করা

প্লেয়ার রিলিজ করা হলে, আপনার স্টেট ভেরিয়েবলকে false হিসেবে সেট করুন:

fun releasePlayer() {
    shouldEnterPipMode = false
}

PiP মোড চালু করা হয়েছে কিনা তা নির্ধারণ করতে স্টেট ব্যবহার করুন (Android 12-এর আগের ভার্সন)

  1. PiP প্রি-১২ যোগ করার জন্য DisposableEffect ব্যবহার করা হয়, তাই আপনাকে rememberUpdatedState-এর মাধ্যমে একটি নতুন ভেরিয়েবল তৈরি করতে হবে, যার newValue আপনার স্টেট ভেরিয়েবল হিসেবে সেট করা থাকবে। এর ফলে নিশ্চিত হওয়া যাবে যে DisposableEffect-এর মধ্যে আপডেট করা ভার্সন ব্যবহার করা হচ্ছে।
  2. OnUserLeaveHintListener ট্রিগার করা হলে যে ল্যাম্বডা আচরণ নির্ধারণ করে, তার মধ্যে if স্টেটমেন্ট যোগ করুন। এই স্টেটমেন্টে, enterPictureInPictureMode()-এ কল করার সময় স্টেট ভেরিয়েবল ব্যবহার করুন:

    val currentShouldEnterPipMode by rememberUpdatedState(newValue = shouldEnterPipMode)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
        Build.VERSION.SDK_INT < Build.VERSION_CODES.S
    ) {
        val context = LocalContext.current
        DisposableEffect(context) {
            val onUserLeaveBehavior = Runnable {
                if (currentShouldEnterPipMode) {
                    context.findActivity()
                        .enterPictureInPictureMode(PictureInPictureParams.Builder().build())
                }
            }
            context.findActivity().addOnUserLeaveHintListener(
                onUserLeaveBehavior
            )
            onDispose {
                context.findActivity().removeOnUserLeaveHintListener(
                    onUserLeaveBehavior
                )
            }
        }
    } else {
        Log.i("PiP info", "API does not support PiP")
    }

PiP মোড চালু করা হয়েছে কিনা তা নির্ধারণ করতে স্টেট ব্যবহার করুন (Android 12 ও তার পরের যেকোনও ভার্সন)

আপনার স্টেট ভেরিয়েবলকে setAutoEnterEnabled-এ পাস করুন যাতে আপনার অ্যাপ শুধুমাত্র সঠিক সময়েই PiP মোডে প্রবেশ করে:

val pipModifier = modifier.onGloballyPositioned { layoutCoordinates ->
    val builder = PictureInPictureParams.Builder()

    // Add autoEnterEnabled for versions S and up
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        builder.setAutoEnterEnabled(shouldEnterPipMode)
    }
    context.findActivity().setPictureInPictureParams(builder.build())
}

VideoPlayer(pipModifier)

সাবলীল অ্যানিমেশনের জন্য setSourceRectHint ব্যবহার করুন

setSourceRectHint API, PiP মোডে ঢোকার জন্য আরও মসৃণ অ্যানিমেশন তৈরি করে। এছাড়াও, Android 12+ ভার্সনে, এটি PiP মোড থেকে বেরিয়ে আসার জন্য আরও মসৃণ অ্যানিমেশন তৈরি করে। PiP-তে ট্রানজিশনের পরে অ্যাক্টিভিটির যে অংশটি দেখা যাবে তা বোঝাতে PiP বিল্ডারে এই API যোগ করুন।

  1. setSourceRectHint() শুধুমাত্র তখনই builder-এ যোগ করুন, যদি স্টেট থেকে বোঝা যায় যে অ্যাপকে PiP মোডে প্রবেশ করতে হবে। এর ফলে, অ্যাপের PiP মোডে ঢোকার প্রয়োজন না হলে sourceRect গণনা করার প্রয়োজন হয় না।
  2. sourceRect ভ্যালু সেট করতে, মডিফায়ারে onGloballyPositioned ফাংশন থেকে পাওয়া layoutCoordinates ব্যবহার করুন।
  3. builder-এ setSourceRectHint()-এ কল করুন এবং sourceRect ভেরিয়েবল পাস করুন।

val context = LocalContext.current

val pipModifier = modifier.onGloballyPositioned { layoutCoordinates ->
    val builder = PictureInPictureParams.Builder()
    if (shouldEnterPipMode) {
        val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect()
        builder.setSourceRectHint(sourceRect)
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        builder.setAutoEnterEnabled(shouldEnterPipMode)
    }
    context.findActivity().setPictureInPictureParams(builder.build())
}

VideoPlayer(pipModifier)