সঠিক সময়ে 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 pre-12 যোগ করতে DisposableEffect ব্যবহার করা হয়, তাই আপনাকে rememberUpdatedState-এর মাধ্যমে একটি নতুন ভেরিয়েবল তৈরি করতে হবে এবং newValue-কে স্টেট ভেরিয়েবল হিসেবে সেট করতে হবে। এটি নিশ্চিত করবে যে আপডেট করা ভার্সনটি DisposableEffect-এর মধ্যে ব্যবহার করা হয়েছে।
  2. ল্যাম্বডাতে, যা OnUserLeaveHintListener ট্রিগার হওয়ার সময় আচরণ নির্ধারণ করে, enterPictureInPictureMode()-এ কল করার সময় স্টেট ভেরিয়েবল সহ একটি if স্টেটমেন্ট যোগ করুন:

    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. অ্যাপটি PiP মোডে প্রবেশ করবে কিনা তা যদি স্টেট নির্ধারণ করে, তবেই builder-এ setSourceRectHint() যোগ করুন। অ্যাপকে 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)