# Android-এ লাইভ আপডেট

Pushwoosh `pushwoosh-liveupdates` মডিউলের (SDK 6.9.0 এবং পরবর্তী) মাধ্যমে Android লাইভ আপডেট সমর্থন করে। একটি লাইভ আপডেট হল একটি চলমান, প্রোগ্রেস-স্টাইল নোটিফিকেশন যা সিস্টেম লক স্ক্রিনে, নোটিফিকেশন ড্রয়ারে এবং স্ট্যাটাস বারে একটি স্ট্যাটাস চিপ হিসাবে প্রচার করে, যাতে ব্যবহারকারীরা আপনার অ্যাপ না খুলেই একটি কার্যকলাপ অনুসরণ করতে পারে।

পুরো জীবনচক্র সার্ভার থেকে চালিত হয়: আপনার ব্যাকএন্ড কার্যকলাপ শুরু হলে একটি পুশ পাঠায়, এটি অগ্রসর হওয়ার সাথে সাথে আরও পুশ পাঠায় এবং এটি শেষ হলে একটি চূড়ান্ত পুশ পাঠায়। SDK প্রতিটি পুশ স্বয়ংক্রিয়ভাবে রেন্ডার করে।

## লাইভ আপডেট কী

লাইভ আপডেটগুলি Android 16 (API 36)-এ একটি ব্যবহারকারী-সূচিত, সময়-সংবেদনশীল কার্যকলাপ শুরু থেকে শেষ পর্যন্ত দেখানোর একটি উপায় হিসাবে চালু করা হয়েছিল। এগুলি প্ল্যাটফর্মের প্রোগ্রেস-কেন্দ্রিক নোটিফিকেশন এবং `Notification.ProgressStyle` API-এর উপর ভিত্তি করে তৈরি। ধারণাগতভাবে এগুলি iOS লাইভ অ্যাক্টিভিটিজের অ্যান্ড্রয়েড প্রতিরূপ।

এই পৃষ্ঠাটি শুধুমাত্র Pushwoosh ইন্টিগ্রেশন কভার করে। প্ল্যাটফর্মের আচরণ, প্রচারের নিয়ম এবং ডিজাইনের নির্দেশিকাগুলির জন্য, অফিসিয়াল অ্যান্ড্রয়েড ডকুমেন্টেশন দেখুন:

- [Progress-centric notifications](https://developer.android.com/about/versions/16/features/progress-centric-notifications)
- [Create live update notifications (Views)](https://developer.android.com/develop/ui/views/notifications/live-update)
- [Create live update notifications (Compose)](https://developer.android.com/develop/ui/compose/notifications/live-update)

## কখন লাইভ আপডেট ব্যবহার করবেন

লাইভ আপডেটগুলি এমন একটি কার্যকলাপের জন্য যা চলমান, ব্যবহারকারী-সূচিত এবং সময়-সংবেদনশীল — এমন কিছু যার একটি স্পষ্ট শুরু এবং শেষ আছে এবং ব্যবহারকারী সক্রিয়ভাবে এই মুহূর্তে সেটির ಬಗ್ಗೆ যত্নশীল। Pushwoosh গ্রাহকদের জন্য সাধারণ পরিস্থিতি:

- **খাদ্য ডেলিভারি** — অর্ডার গৃহীত হয়েছে, প্রস্তুত করা হচ্ছে, ডেলিভারির জন্য বের হয়েছে, পৌঁছাচ্ছে।
- **রাইড-হেলিং এবং ট্যাক্সি** — ড্রাইভার নির্ধারিত হয়েছে, পথে আছে, পৌঁছাচ্ছে, ট্রিপ চলছে।
- **অর্ডার এবং চালান ট্র্যাকিং** — একটি অর্ডারের লাইভ স্ট্যাটাস যা সক্রিয়ভাবে ট্রানজিটে আছে।
- **লাইভ স্পোর্টস এবং মিডিয়া** — খেলা চলার সাথে সাথে ম্যাচের স্কোর এবং সময়।
- **ফিটনেস** — একটি সক্রিয় ওয়ার্কআউট বা দৌড়, যেখানে অতিবাহিত সময় এবং অগ্রগতি দেখানো হয়।
- **ফিনটেক** — একটি লেনদেন বা যাচাইকরণ প্রবাহ যা তার বিভিন্ন পর্যায়ের মধ্য দিয়ে যাচ্ছে।

যেহেতু জীবনচক্রটি বাস্তব ঘটনা দ্বারা চালিত হয় যা আপনার ব্যাকএন্ড ইতিমধ্যে জানে (একটি অর্ডারের স্থিতি পরিবর্তন হয়, একজন কুরিয়ার চলে), একটি লাইভ আপডেট সাধারণত আপনার বিদ্যমান ইভেন্ট প্রবাহে একটি API কল দ্বারা সংযুক্ত থাকে — এটি এমন কিছু নয় যা একজন ব্যক্তি হাতে পাঠায়।

<Aside type="caution">
প্রচার, চ্যাট বার্তা বা পরিবেষ্টিত তথ্যের জন্য লাইভ আপডেট ব্যবহার করবেন না এবং ব্যবহারকারী খারিজ করে দেওয়া একটি লাইভ আপডেট কখনও পুনরায় পোস্ট করবেন না। অ্যান্ড্রয়েড প্রচারিত নোটিফিকেশন পোস্ট করার জন্য অ্যাপের ক্ষমতা প্রত্যাহার করতে পারে। [যথাযথ ব্যবহারের উপর অ্যান্ড্রয়েডের নির্দেশিকা](https://developer.android.com/develop/ui/views/notifications/live-update#best-practices) অনুসরণ করুন।
</Aside>

## আবশ্যকতা

- Android 16 (API 36) বা নতুন। পুরানো ডিভাইসগুলিতে মডিউলটি নিষ্ক্রিয় থাকে এবং প্রতিটি লাইভ আপডেট API কল একটি নিরাপদ নো-অপ (no-op) হয়।
- Pushwoosh Android SDK 6.9.0 বা পরবর্তী।

## pushwoosh-liveupdates মডিউল যোগ করুন

আপনার **app/build.gradle**-এ নির্ভরতা (dependency) যোগ করুন:

```groovy
dependencies {
    implementation 'com.pushwoosh:pushwoosh-liveupdates:<latest-version>'
}
```

`<latest-version>`-কে [Maven Central](https://mvnrepository.com/artifact/com.pushwoosh/pushwoosh-liveupdates) থেকে বর্তমান সংস্করণ দিয়ে প্রতিস্থাপন করুন।

মডিউলটি স্টার্টআপে স্বয়ংক্রিয়ভাবে আবিষ্কৃত হয়। এটি প্রয়োজনীয় `POST_PROMOTED_NOTIFICATIONS` অনুমতি ঘোষণা করে, তার নিজস্ব নোটিফিকেশন চ্যানেল নিবন্ধন করে এবং ডিফল্ট নোটিফিকেশন পাথের আগে লাইভ আপডেট পুশগুলিকে বাধা দেয়। কোনও অতিরিক্ত ইনিশিয়ালাইজেশন কোড নেই — SDK চলমান এবং প্রচারিত ফ্ল্যাগ সেট করে, বড় আইকন ডাউনলোড করে, অ্যাকশন বোতাম ম্যাপ করে এবং আপনার জন্য নোটিফিকেশন পোস্ট করে।

## একটি লাইভ আপডেট পাঠান

আপনি [Messaging API v2](/bn/developer/api-reference/messaging-api-v2/) এর মাধ্যমে `android` কন্টেন্ট ব্লকে একটি `live_update` অবজেক্ট যোগ করে লাইভ আপডেট পাঠান। একটি `transactional` অনুরোধ ব্যবহার করুন — একটি লাইভ আপডেট নির্দিষ্ট ব্যবহারকারীকে লক্ষ্য করে যার কার্যকলাপ এটি ট্র্যাক করছে। `schedule` ক্ষেত্রটি প্রয়োজনীয়; `{ "after": "0s" }` অবিলম্বে পাঠায়। জীবনচক্রের তিনটি অপারেশন আছে, যা `live_update.op`-এ সেট করা হয়:

- `OPERATION_START` — একটি কার্যকলাপের জন্য প্রথম পুশ। চলমান নোটিফিকেশন পোস্ট করে।
- `OPERATION_UPDATE` — একই কার্যকলাপের জন্য পরবর্তী পুশ। এটি নীরবে তার জায়গায় রিফ্রেশ করে।
- `OPERATION_END` — টার্মিনাল পুশ। নোটিফিকেশনটি খারিজ করে।

একই কার্যকলাপের অন্তর্গত সমস্ত পুশকে একই `live_update.id` শেয়ার করতে হবে। সেই আইডি আপডেটগুলিকে একসাথে বাঁধে এবং অ্যাপ থেকে আপডেটটি খারিজ করার জন্য আপনি এটি ব্যবহার করেন।

প্রতিটি পুশ নোটিফিকেশনটিকে সম্পূর্ণরূপে বর্ণনা করে — আগের পুশ থেকে কিছুই বহন করা হয় না। আপনি যে প্রতিটি ক্ষেত্র রাখতে চান, যেমন সেগমেন্ট এবং বড় আইকন, প্রতিটি `OPERATION_UPDATE`-এর সাথে পুনরায় পাঠান; একটি বাদ দেওয়া ক্ষেত্র অনুপস্থিত হিসাবে রেন্ডার করা হয়।

### লাইভ আপডেট প্যারামিটার

এই কীগুলি `android` কন্টেন্ট ব্লকের `live_update` অবজেক্টের ভিতরে যায়। শিরোনাম, বডি এবং বড় আইকন স্ট্যান্ডার্ড অ্যান্ড্রয়েড পুশ ক্ষেত্রগুলি (`title`, `body`, `custom_icon`) ব্যবহার করে, যা `live_update`-এর পাশাপাশি পাঠানো হয়।

| প্যারামিটার | টাইপ | বিবরণ |
|---|---|---|
| `op` | string | জীবনচক্র অপারেশন: `OPERATION_START`, `OPERATION_UPDATE`, বা `OPERATION_END`। আবশ্যক। |
| `id` | string | একটি লাইভ আপডেটের সমস্ত পুশ দ্বারা শেয়ার করা স্থিতিশীল কার্যকলাপ আইডি। আবশ্যক। |
| `progress` | int | অগ্রগতির মান, যা সেগমেন্টের দৈর্ঘ্যের সমষ্টির বিপরীতে পরিমাপ করা হয়। |
| `progress_indeterminate` | bool | একটি নির্দিষ্ট মানের পরিবর্তে একটি অনির্দিষ্ট অ্যানিমেশন দেখান। |
| `progress_bar` | bool | প্রোগ্রেস বারটি আদৌ দেখান। ডিফল্ট `true`। |
| `segments` | array | অর্ডার করা প্রোগ্রেস সেগমেন্ট, প্রতিটি `{ "color": "#RRGGBB", "length": N }`। |
| `extras` | object | একটি কাস্টম স্টাইল প্রদানকারীতে পাস করা নির্বিচারে ডেটা। |
| `when` | int64 | হেডার টাইম অ্যাঙ্কর, ইপক মিলিসেকেন্ডে। |
| `chronometer` | bool | হেডার সময়টি একটি চলমান টাইমার হিসাবে দেখান। |
| `chronometer_count_down` | bool | একটি চলমান টাইমার উপরে যাওয়ার পরিবর্তে নিচে গণনা করে। |
| `show_when` | bool | হেডার টাইম কলামটি আদৌ দেখান। ডিফল্ট `true`। |

<Aside>
`op` মানটি অবশ্যই `OPERATION_START`, `OPERATION_UPDATE`, বা `OPERATION_END` এই সঠিক enum নামগুলির মধ্যে একটি হতে হবে — সংক্ষিপ্ত ফর্মগুলি উপেক্ষা করা হয়। প্রতিটি ক্ষেত্র তার নেটিভ JSON টাইপ বহন করে: `segments` একটি JSON অ্যারে এবং `extras` একটি JSON অবজেক্ট, এনকোড করা স্ট্রিং নয়।
</Aside>

চারটি সময় ক্ষেত্র নিম্নলিখিতভাবে একত্রিত হয়: `show_when` `false` সেট করা হলে সময় লুকানো থাকে; অন্যথায় `when` হল অ্যাঙ্কর, `chronometer` এটিকে একটি লাইভ কাউন্টারে পরিণত করে, এবং `chronometer_count_down` সেই কাউন্টারটিকে পিছনের দিকে চালায়।

### স্টার্ট পুশ

```bash
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "transactional": {
      "application": "XXXXX-XXXXX",
      "platforms": ["ANDROID"],
      "users": { "list": ["customer-42"] },
      "payload": {
        "content": {
          "localized_content": {
            "default": {
              "android": {
                "title": "Order #4521",
                "body": "We are preparing your order",
                "custom_icon": "https://example.com/restaurant.png",
                "live_update": {
                  "op": "OPERATION_START",
                  "id": "order_4521",
                  "progress": 1,
                  "segments": [
                    { "color": "#34A853", "length": 3 },
                    { "color": "#FBBC05", "length": 4 },
                    { "color": "#4285F4", "length": 3 }
                  ],
                  "extras": { "eta": "18:40" }
                }
              }
            }
          }
        }
      },
      "schedule": { "after": "0s" },
      "message_type": "MESSAGE_TYPE_TRANSACTIONAL"
    }
  }'
```

### আপডেট পুশ

যখনই কার্যকলাপটি এগিয়ে যায় তখন একই `id` সহ একটি `OPERATION_UPDATE` পাঠান। সেগমেন্ট এবং আইকন পুনরাবৃত্তি করুন — একটি আপডেট যা এগুলি বাদ দেয় তা এগুলি ছাড়াই রেন্ডার হয়।

```bash
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "transactional": {
      "application": "XXXXX-XXXXX",
      "platforms": ["ANDROID"],
      "users": { "list": ["customer-42"] },
      "payload": {
        "content": {
          "localized_content": {
            "default": {
              "android": {
                "title": "Order #4521",
                "body": "Your courier is on the way",
                "custom_icon": "https://example.com/restaurant.png",
                "live_update": {
                  "op": "OPERATION_UPDATE",
                  "id": "order_4521",
                  "progress": 7,
                  "segments": [
                    { "color": "#34A853", "length": 3 },
                    { "color": "#FBBC05", "length": 4 },
                    { "color": "#4285F4", "length": 3 }
                  ]
                }
              }
            }
          }
        }
      },
      "schedule": { "after": "0s" },
      "message_type": "MESSAGE_TYPE_TRANSACTIONAL"
    }
  }'
```

### এন্ড পুশ

টার্মিনাল পুশের জন্য শুধুমাত্র অপারেশন এবং আইডি প্রয়োজন।

```bash
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "transactional": {
      "application": "XXXXX-XXXXX",
      "platforms": ["ANDROID"],
      "users": { "list": ["customer-42"] },
      "payload": {
        "content": {
          "localized_content": {
            "default": {
              "android": {
                "live_update": {
                  "op": "OPERATION_END",
                  "id": "order_4521"
                }
              }
            }
          }
        }
      },
      "schedule": { "after": "0s" },
      "message_type": "MESSAGE_TYPE_TRANSACTIONAL"
    }
  }'
```

## চেহারা কাস্টমাইজ করুন

SDK একটি ডিফল্ট প্রোগ্রেস স্টাইল সরবরাহ করে যা `progress`, `progress_indeterminate`, এবং `segments` থেকে তৈরি। প্রোগ্রেস বারের উপর সম্পূর্ণ নিয়ন্ত্রণ নিতে, `LiveUpdateProgressStyleProvider` প্রয়োগ করুন এবং নিজে একটি `Notification.ProgressStyle` তৈরি করুন।

প্রদানকারী হল একমাত্র কাস্টমাইজেশন পয়েন্ট। SDK এখনও চ্যানেল সেটআপ, চলমান এবং প্রচারিত ফ্ল্যাগ, বড় আইকন, অ্যাকশন বোতাম এবং হেডার সময়ের মালিক — একটি কাস্টম প্রদানকারী শুধুমাত্র প্রোগ্রেস বারকে আকার দিতে পারে, তাই এটি প্রচারের যোগ্যতা ভঙ্গ করতে পারে না। এটি অবশ্যই স্টেটলেস হতে হবে: শুধুমাত্র সরবরাহ করা `LiveUpdateState` থেকে প্রত্যাবর্তিত স্টাইলটি প্রাপ্ত করুন। যদি এটি থ্রো করে, SDK ডিফল্ট স্টাইলে ফিরে যায় এবং নোটিফিকেশনটি এখনও পোস্ট হয়।

<Tabs>
<TabItem label="Java">
```java
import android.app.Notification;
import androidx.annotation.NonNull;
import com.pushwoosh.liveupdates.LiveUpdateProgressStyleProvider;
import com.pushwoosh.liveupdates.LiveUpdateSegment;
import com.pushwoosh.liveupdates.LiveUpdateState;
import java.util.List;

public class OrderStyleProvider implements LiveUpdateProgressStyleProvider {
    @NonNull
    @Override
    public Notification.ProgressStyle createStyle(@NonNull LiveUpdateState state) {
        Notification.ProgressStyle style = new Notification.ProgressStyle();
        if (state.getProgress() != null) {
            style.setProgress(state.getProgress());
        }
        style.setProgressIndeterminate(state.isProgressIndeterminate());

        List<LiveUpdateSegment> segments = state.getSegments();
        int boundary = 0;
        for (int i = 0; i < segments.size(); i++) {
            LiveUpdateSegment seg = segments.get(i);
            style.addProgressSegment(
                new Notification.ProgressStyle.Segment(seg.getLength()).setColor(seg.getColor()));
            boundary += seg.getLength();
            if (i < segments.size() - 1) {
                style.addProgressPoint(new Notification.ProgressStyle.Point(boundary));
            }
        }
        return style;
    }
}
```
</TabItem>
<TabItem label="Kotlin">
```kotlin
import android.app.Notification
import com.pushwoosh.liveupdates.LiveUpdateProgressStyleProvider
import com.pushwoosh.liveupdates.LiveUpdateState

class OrderStyleProvider : LiveUpdateProgressStyleProvider {
    override fun createStyle(state: LiveUpdateState): Notification.ProgressStyle {
        val style = Notification.ProgressStyle()
        state.progress?.let { style.setProgress(it) }
        style.setProgressIndeterminate(state.isProgressIndeterminate)

        val segments = state.segments
        var boundary = 0
        segments.forEachIndexed { i, seg ->
            style.addProgressSegment(
                Notification.ProgressStyle.Segment(seg.length).setColor(seg.color))
            boundary += seg.length
            if (i < segments.size - 1) {
                style.addProgressPoint(Notification.ProgressStyle.Point(boundary))
            }
        }
        return style
    }
}
```
</TabItem>
</Tabs>

**AndroidManifest.xml**-এ একটি `<meta-data>` ট্যাগ দিয়ে প্রদানকারীকে নিবন্ধন করুন। ক্লাসটির একটি পাবলিক নো-আর্গুমেন্ট কনস্ট্রাক্টর থাকতে হবে।

```xml
<meta-data
    android:name="com.pushwoosh.LIVE_UPDATE_STYLE_PROVIDER"
    android:value="com.example.OrderStyleProvider" />
```

`live_update.extras`-এ পাঠানো JSON পড়তে এবং আপনার নিজের ব্যবসায়িক ডেটার সাথে স্টাইলটি খাপ খাইয়ে নিতে `LiveUpdateState.getExtras()` ব্যবহার করুন।

## আপনার অ্যাপ থেকে লাইভ আপডেট পরিচালনা করুন

সার্ভার প্রতিটি `OPERATION_START`, `OPERATION_UPDATE`, এবং `OPERATION_END` চালায়, তাই একটি লাইভ আপডেট পোস্ট বা রিফ্রেশ করার জন্য কোনও অ্যাপ-সাইড API নেই। `PushwooshLiveUpdates` ফ্যাসাড শুধুমাত্র সেই কাজগুলি কভার করে যা সার্ভার করতে পারে না — স্থানীয়ভাবে একটি আপডেট খারিজ করা এবং কোনটি স্ক্রিনে আছে তা পরীক্ষা করা।

```java
import com.pushwoosh.liveupdates.PushwooshLiveUpdates;

// ব্যবহারকারী অ্যাপ-মধ্যস্থ কার্যকলাপ শেষ করলে একটি নির্দিষ্ট লাইভ আপডেট খারিজ করুন,
// সার্ভারের টার্মিনাল "end" পুশের জন্য অপেক্ষা না করে
PushwooshLiveUpdates.endLiveUpdate("order_4521");

// এই অ্যাপ দ্বারা বর্তমানে দেখানো কার্যকলাপ আইডিগুলির তালিকা করুন
List<String> active = PushwooshLiveUpdates.getActiveIds();

// এই অ্যাপ যা কিছু দেখাচ্ছে তা পরিষ্কার করুন, উদাহরণস্বরূপ লগআউটে
PushwooshLiveUpdates.endAllLiveUpdates();
```

সমস্ত মেথড যেকোনো থ্রেড থেকে কল করা নিরাপদ এবং Android 16-এর নীচের ডিভাইসগুলিতে একটি নো-অপ।

## সম্পর্কিত লিঙ্ক

- [Pushwoosh Android SDK overview](/bn/developer/pushwoosh-sdk/android-sdk/)
- [Pushwoosh Android SDK API reference](https://pushwoosh.github.io/pushwoosh-android-sdk/)
- [Messaging API](/bn/developer/api-reference/messaging-api-v2/)
- [Android progress-centric notifications](https://developer.android.com/about/versions/16/features/progress-centric-notifications)