সঠিক সময়ে PiP লিখুন

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

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

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

ভিডিও চলছে কিনা তার উপর ভিত্তি করে অবস্থা পরিবর্তন করুন।

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

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

প্লেয়ার ছেড়ে দেওয়া হলে অবস্থা পরিবর্তন করুন।

যখন প্লেয়ারটি ছেড়ে দেওয়া হয়, তখন আপনার স্টেট ভেরিয়েবলটির মান false সেট করুন:

fun releasePlayer() {
    shouldEnterPipMode = false
}

PiP মোডে প্রবেশ করা হয়েছে কিনা তা নির্ধারণ করতে স্টেট ব্যবহার করুন (অ্যান্ড্রয়েড ১২-এর পূর্ববর্তী সংস্করণ)

  1. যেহেতু PiP প্রি-১২ যোগ করতে একটি 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 মোডে প্রবেশ করা হয়েছে কিনা তা নির্ধারণ করতে স্টেট ব্যবহার করুন (অ্যান্ড্রয়েড ১২-এর পরে)।

আপনার স্টেট ভেরিয়েবলটি 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-তে রূপান্তরের পর অ্যাক্টিভিটির কোন অংশটি দৃশ্যমান থাকবে তা নির্দেশ করতে, এই API-টি PiP বিল্ডারে যোগ করুন।

  1. builder শুধুমাত্র তখনই setSourceRectHint() যোগ করুন, যখন স্টেট অনুযায়ী অ্যাপটি 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)