কথোপকথনের জন্য বিজ্ঞপ্তি বাবল ব্যবহার করা

নোটিফিকেশন বাবল ব্যবহারকারীদের জন্য কথোপকথন দেখা ও তাতে অংশগ্রহণ করা আরও সহজ করে তোলে।

ছবি ১. একটি চ্যাট বাবল।

এগুলি অন্যান্য অ্যাপ কন্টেন্টের উপরে ফ্লোট করে এবং ব্যবহারকারীরা বুদবুদ বড় করে অ্যাপ কন্টেন্ট দেখতে ও সেটির সাথে ইন্ট্যার‍্যাক্ট করতে পারেন এবং ব্যবহার না করলে সেগুলি ছোট করে দিতে পারেন।

ডিভাইস লক করা থাকলে অথবা অলওয়েজ-অন-ডিসপ্লে অ্যাক্টিভ থাকলে, সাধারণত যেভাবে বিজ্ঞপ্তি আসে, সেইভাবেই বুদবুদ দেখা যায়।

ব্যবহারকারী বিজ্ঞপ্তি বাবলের সুবিধা চালু করেছেন। বিজ্ঞপ্তিতে বুদবুদ কাজ করে এমন বিজ্ঞপ্তিতে বুদবুদ বোতামে ট্যাপ করে তারা এটি করতে পারে। এর ফলে সেই নির্দিষ্ট চ্যাটটি সবসময় বাবলে দেখা যাবে। সেটিংস থেকে, ব্যবহারকারী কোন চ্যাট বাবল করেছেন তা অ্যাডজাস্ট করতে বা সামগ্রিক অ্যাপের সেটিংস পরিবর্তন করতে পারবেন।

ব্যবহারকারী নিম্নলিখিত কাজগুলি করতে পারবেন:

  • আপনার অ্যাপ থেকে সব বিজ্ঞপ্তি বুদবুদ ব্লক করুন। বিজ্ঞপ্তি ব্লক করা হয় না, কিন্তু সেগুলি কখনও বুদবুদ হিসেবে দেখা যায় না।
  • আপনার অ্যাপ থেকে বেছে নেওয়া বিজ্ঞপ্তি বাবলের অনুমতি দিন। বাবল বোতাম ব্যবহার করে বাবল করা বিজ্ঞপ্তি "বেছে নেওয়া" হয়।
  • আপনার অ্যাপ থেকে সব বিজ্ঞপ্তি বাবলের অনুমতি দিন। BubbleMetadata দিয়ে পাঠানো সব বিজ্ঞপ্তি বাবল হিসেবে দেখা যাবে।

Notification Bubble API

বিজ্ঞপ্তি API ব্যবহার করে বিজ্ঞপ্তি বাব্‌ল তৈরি করা হয়। আপনি যদি চান যে আপনার বিজ্ঞপ্তিটি একটি বাবল হিসেবে দেখা যাক, তাহলে এর সাথে অতিরিক্ত ডেটা অ্যাটাচ করুন।

আপনার বেছে নেওয়া অ্যাক্টিভিটি থেকে বুদ্বুদের বড় ভিউ তৈরি করা হয়। বাবল হিসেবে সঠিকভাবে দেখানোর জন্য অ্যাক্টিভিটি কনফিগার করুন। অ্যাক্টিভিটি অবশ্যই রি-সাইজ করা যায় ও এম্বেড করা যায় এমন হতে হবে। এগুলির মধ্যে কোনও একটি শর্ত পূরণ না হলে, সিস্টেম সেটিকে বিজ্ঞপ্তি হিসেবে দেখায়।

নিম্নলিখিত কোড থেকে কীভাবে বাবল প্রয়োগ করতে হয় তা জানতে পারবেন:

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:resizeableActivity="true"
/>

আপনার অ্যাপ যদি একই ধরনের একাধিক বাবুল দেখায়, যেমন, আলাদা আলাদা পরিচিতির সাথে একাধিক চ্যাট কনভার্সেশন, তাহলে অ্যাক্টিভিটিকে অবশ্যই একাধিক ইনস্ট্যান্স লঞ্চ করতে হবে। Android 10 ও তার আগের যেকোনও ভার্সনে চলা ডিভাইসে, আপনি স্পষ্টভাবে documentLaunchMode-কে "always" হিসেবে সেট না করলে, বিজ্ঞপ্তি বাবল হিসেবে দেখানো হয় না। Android 11 থেকে শুরু করে, আপনাকে স্পষ্টভাবে এই ভ্যালু সেট করতে হবে না, কারণ সিস্টেম অটোমেটিক সব কথোপকথনের documentLaunchMode ভ্যালু "always" হিসেবে সেট করে দেয়।

বিজ্ঞপ্তি বাব্‌ল পাঠাতে, এইসব ধাপ অনুসরণ করুন:

  1. আপনি যেভাবে সাধারণত বিজ্ঞপ্তি তৈরি করেন, সেইভাবেই করুন।
  2. BubbleMetadata অবজেক্ট তৈরি করতে BubbleMetadata.Builder(PendingIntent, Icon) অথবা BubbleMetadata.Builder(String) কল করুন।
  3. বিজ্ঞপ্তিতে মেটাডেটা যোগ করতে setBubbleMetadata() ব্যবহার করুন।
  4. Android 11 (API লেভেল 30) বা এর পরের যেকোনও ভার্সনকে টার্গেট করলে, নিশ্চিত করুন যে বাবল মেটাডেটা বা বিজ্ঞপ্তি কোনও শেয়ারিং শর্টকাটকে রেফার করছে।
  5. বাবল হিসেবে দেখানো বিজ্ঞপ্তি বাতিল না করার জন্য আপনার অ্যাপ পরিবর্তন করুন। বিজ্ঞপ্তি বাতিল করলে স্ক্রিন থেকে বাবল সরে যায়। কোনও বাবল খুললে সেটির সাথে যুক্ত বিজ্ঞপ্তি অটোমেটিক লুকিয়ে যায়।

নিচে দেওয়া উদাহরণে এইসব ধাপ দেখানো হয়েছে:

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent =
    PendingIntent.getActivity(context, 0, target, PendingIntent.FLAG_IMMUTABLE /* flags */)
val category = "com.example.category.IMG_SHARE_TARGET"

val chatPartner = Person.Builder()
    .setName("Chat partner")
    .setImportant(true)
    .build()

// Create a sharing shortcut.
val shortcutId = generateShortcutId()
val shortcut =
    ShortcutInfoCompat.Builder(context, shortcutId)
        .setCategories(setOf(category))
        .setIntent(Intent(Intent.ACTION_DEFAULT))
        .setLongLived(true)
        .setShortLabel("Chat partner name")
        .build()
// Publish the shortcut, otherwise the bubble metadata will not apply.
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)

// Create a bubble metadata.
val bubbleData = NotificationCompat.BubbleMetadata.Builder(bubbleIntent,
    IconCompat.createWithResource(context, R.drawable.ic_logo))
    .setDesiredHeight(600)
    .build()

// Create a notification, referencing the sharing shortcut.
val builder = NotificationCompat.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.chat)
    .setBubbleMetadata(bubbleData)
    .setShortcutId(shortcutId)
    .addPerson(chatPartner)

কোনও বাবল পাঠানোর সময় আপনার অ্যাপ ফোরগ্রাউন্ডে থাকলে, গুরুত্ব উপেক্ষা করা হয় এবং আপনার অ্যাপ থেকে ব্যবহারকারী বাবল বা বিজ্ঞপ্তি ব্লক না করলে, আপনার বাবল সবসময় দেখানো হয়।

একটি বড় বাবল তৈরি করা

আপনি বাবল কনফিগার করে এটিকে অটোমেটিক এক্সপ্যান্ড করা অবস্থায় দেখাতে পারবেন। আমরা শুধুমাত্র তখনই এই ফিচার ব্যবহার করার সাজেশন দিই, যখন ব্যবহারকারী এমন কোনও অ্যাকশন নেন যা বাবল তৈরি করে, যেমন নতুন চ্যাট শুরু করার জন্য কোনও বোতামে ট্যাপ করা। এই ক্ষেত্রে, কোনও বাবল তৈরি হলে, শুরুতে পাঠানো বিজ্ঞপ্তিটি গোপন রাখলে ভাল হয়।

এইসব আচরণ চালু করার জন্য ফ্ল্যাগ সেট করার পদ্ধতি আছে: setAutoExpandBubble() এবং setSuppressNotification().

নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে কোনও বাবলকে অটোমেটিক এক্সপ্যান্ড করা অবস্থায় দেখানো যায়:

val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIntent(bubbleIntent)
    .setAutoExpandBubble(true)
    .setSuppressNotification(true)
    .build()

Bubble কন্টেন্ট লাইফসাইকেল

কোনও বাবল বড় করা হলে, কন্টেন্ট অ্যাক্টিভিটি সাধারণ প্রসেস লাইফসাইকেল-এর মধ্যে দিয়ে যায়, এর ফলে অ্যাপ্লিকেশনটি ফোরগ্রাউন্ড প্রসেস হয়ে যায়, যদি সেটি আগে থেকেই না হয়ে থাকে।

বাবলটি আড়াল করা বা বাতিল করা হলে, অ্যাক্টিভিটি মুছে যায়। এর ফলে প্রসেসটি ক্যাশে করা হতে পারে এবং পরে সেটি বন্ধ করে দেওয়া হতে পারে। এটি নির্ভর করে অ্যাপে অন্য কোনও ফোরগ্রাউন্ড কম্পোনেন্ট চলছে কিনা তার উপর।

কখন বাবল দেখা যায়

ব্যবহারকারীর জন্য বাধা কমানোর জন্য, নির্দিষ্ট পরিস্থিতিতেই শুধু বাব্‌ল দেখা যায়।

কোনও অ্যাপ Android 11 (API লেভেল 30) বা এর পরের যেকোনও ভার্সনকে টার্গেট করলে, সেটি কথোপকথন সংক্রান্ত প্রয়োজনীয়তা পূরণ না করলে, বিজ্ঞপ্তিটি বাবল হিসেবে দেখা যাবে না। কোনও অ্যাপ Android 10 (API লেভেল 29) বা তার আগের যেকোনও ভার্সনকে টার্গেট করলে, নিম্নলিখিত শর্তগুলির মধ্যে একটি বা একাধিক পূরণ হলেই শুধুমাত্র বিজ্ঞপ্তিটি একটি বাবল হিসেবে দেখা যাবে:

  • বিজ্ঞপ্তিতে MessagingStyle ব্যবহার করা হয়েছে এবং একটি Person যোগ করা হয়েছে।
  • বিজ্ঞপ্তিটি Service.startForeground নম্বরে করা কল থেকে এসেছে, এতে CATEGORY_CALL-এর category আছে এবং একটি Person যোগ করা হয়েছে।
  • বিজ্ঞপ্তি পাঠানোর সময় অ্যাপটি ফোরগ্রাউন্ডে থাকে।

এইসব শর্তের কোনওটি পূরণ না হলে, বিজ্ঞপ্তিটি কোনও বাবলের পরিবর্তে দেখানো হয়।

বাবল থেকে অ্যাক্টিভিটি লঞ্চ করা

কোনও বাবল নতুন অ্যাক্টিভিটি লঞ্চ করলে, নতুন অ্যাক্টিভিটি হয় একই টাস্ক ও একই বাবল উইন্ডোর মধ্যে লঞ্চ হবে অথবা ফুলস্ক্রিনে নতুন টাস্কে লঞ্চ হবে, যে বাবল এটি লঞ্চ করেছে সেটি আড়াল হয়ে যাবে।

বাবলের মতো একই টাস্কে নতুন অ্যাক্টিভিটি লঞ্চ করতে: ১. ইনটেন্ট লঞ্চ করার সময় অ্যাক্টিভিটি প্রসঙ্গ ব্যবহার করুন, activity.startActivity(intent) এবং ১. ইন্টেন্টে FLAG_ACTIVITY_NEW_TASK ফ্ল্যাগ সেট করবেন না।

অন্যথায়, নতুন অ্যাক্টিভিটি নতুন টাস্কে শুরু হয় এবং বুদ্বুদটি লুকিয়ে দেওয়া হয়।

মনে রাখবেন, একটি বাবল একটি নির্দিষ্ট কথোপকথনকে উপস্থাপন করে, তাই বাবল এর মধ্যে লঞ্চ করা অ্যাক্টিভিটি সেই কথোপকথনের সাথে সম্পর্কিত হতে হবে। এছাড়াও, বাবলের মধ্যে কোনও অ্যাক্টিভিটি লঞ্চ করলে, বাবলের টাস্ক স্ট্যাক বেড়ে যায় এবং এর ফলে ব্যবহারকারীর অভিজ্ঞতা জটিল হয়ে যেতে পারে, বিশেষ করে নেভিগেশন সংক্রান্ত সমস্যা হতে পারে।

পেশাদার পদ্ধতি

  • কোনও বিজ্ঞপ্তি গুরুত্বপূর্ণ হলে তবেই সেটি বাবল হিসেবে পাঠাবেন, যেমন, সেটি চলমান কথোপকথনের অংশ হলে অথবা ব্যবহারকারী যদি কন্টেন্টের জন্য স্পষ্টভাবে বাবলের অনুরোধ করেন। বাবল স্ক্রিনের জায়গা ব্যবহার করে এবং অন্যান্য অ্যাপের কন্টেন্ট ঢেকে দেয়।
  • ভালভাবে দেখে নিন যে আপনার বাবলের বিজ্ঞপ্তিও সাধারণ বিজ্ঞপ্তির মতো কাজ করছে কিনা। ব্যবহারকারী বাবল বন্ধ করে দিলে, একটি বাবল বিজ্ঞপ্তি সাধারণ বিজ্ঞপ্তি হিসেবে দেখানো হয়।
  • BackHandler কম্পোজ করার উপযুক্ত আইটেম ব্যবহার করুন এবং এর enabled প্যারামিটারকে আপনার UI স্টেটের সাথে কানেক্ট করুন যাতে শুধুমাত্র প্রয়োজন হলেই এটি ব্যাক প্রেস ইন্টারসেপ্ট করতে পারে। আপনার হ্যান্ডলার বন্ধ হয়ে গেলে, বাবলটি ছোট হয়ে যায়।

কোনও আড়াল করা বাবল আপডেট করা মেসেজ পেলে, বাবলটি একটি ব্যাজ আইকন দেখায় যা থেকে বোঝা যায় যে মেসেজটি পড়া হয়নি। ব্যবহারকারী সংশ্লিষ্ট অ্যাপে মেসেজটি খুললে, এইসব ধাপ অনুসরণ করুন:

  • বিজ্ঞপ্তি বন্ধ করতে BubbleMetadata আপডেট করুন। BubbleMetadata.Builder.setSuppressNotification() নম্বরে কল করুন। এর ফলে, ব্যবহারকারী যে মেসেজের সাথে ইন্টার‍্যাক্ট করেছেন তা বোঝাতে ব্যাজ আইকনটি সরিয়ে দেওয়া হয়।
  • Notification.Builder.setOnlyAlertOnce() true সেট করে, BubbleMetadata আপডেট করার সময় হওয়া সাউন্ড বা ভাইব্রেশন বন্ধ করুন।

Sample app

SociaLite নমুনা অ্যাপ হল একটি কথোপকথন অ্যাপ যা বাবল ব্যবহার করে। ডেমোনস্ট্রেশনের উদ্দেশ্যে, এই অ্যাপ চ্যাটবট ব্যবহার করে। বাস্তব-জগতে অ্যাপ্লিকেশনের ক্ষেত্রে, মানুষের মেসেজের জন্য বাবল ব্যবহার করুন।